void dwgs :: init(float f, float B, float inpos) { this->f = f; float deltot = Fs/f; int del1 = (int)(inpos*0.5*deltot); if(del1 < 2) del1 = 1; if(M==1) { thiriandispersion(B,f,M,&(dispersion[0])); } else if(M==4) { for(int m=0;m<M;m++) { thiriandispersion(B,f,M,&(dispersion[m])); } } float dispersiondelay = M*phasedelay(&(dispersion[0]),f,Fs); float lowpassdelay = .002; int del2 = (int)(0.5*(deltot-2.0*del1)-dispersiondelay); int del3 = (int)(0.5*(deltot-2.0*del1)-lowpassdelay-5.0); if(del2 < 2) del2 = 1; if(del3 < 2) del3 = 1; float D = (deltot-(float)(del1+del1+del2+del3)-dispersiondelay-lowpassdelay); if(D<1) D=1; thirian(D,(int)D,&fracdelay); d[0]->set_delay(del1,del1); d[1]->set_delay(del2,del3); //float tuningdelay = phasedelay(&fracdelay,f,Fs); // printf("total delay = %g/%g, leftdel = %d/%d, rightdel = %d/%d, dispersion delay = %g, lowpass delay = %g, fractional delay = %g/%g\n",del1+del1+del2+del3+dispersiondelay+lowpassdelay+tuningdelay,deltot, del1, del1, del2, del3, dispersiondelay, lowpassdelay, tuningdelay,D); }
void thiriandispersion(float B, float f, int M, Filter *c) { int N = 2; float D; D = Db(B,f,M); if(D<=1.0) { c->n = 2; c->a[0] = 1; c->a[1] = 0; c->a[2] = 0; c->b[0] = 1; c->b[1] = 0; c->b[2] = 0; init_filter(c); } else { thirian(D,N,c); } }
void thiriandispersion(float B, float f, int M, Filter *c) { int N = 2; float D; D = Db(B,f,M); if(D<=1.0) { c->x = (float *)RTAlloc(gWorld, sizeof(float) * (N + 1));//new float[N+1]; c->y = (float *)RTAlloc(gWorld, sizeof(float) * (N + 1));//new float[N+1]; c->a = (float *)RTAlloc(gWorld, sizeof(float) * (N + 1));//new float[N+1]; c->b = (float *)RTAlloc(gWorld, sizeof(float) * (N + 1));//new float[N+1]; memset(c->x,0,(N+1)*sizeof(float)); memset(c->y,0,(N+1)*sizeof(float)); c->a[0] = 1; c->a[1] = 0; c->a[2] = 0; c->b[0] = 1; c->b[1] = 0; c->b[2] = 0; } else { thirian(D,N,c); } }