well, here's an attempt to make bp out of [fexpr~] and... it did not work
2014-04-10 22:07 GMT-03:00 Alexandre Torres Porres <por...@gmail.com>: > hey, the code I sent only calculates the coeficients, but I left out an > important part which is > > t_sample output = *in++ + coef1 * last + coef2 * prev; > > *out++ = gain * output; > > prev = last; > > last = output; > > > This shows how the filter is done with those coefficients > > > It's easy to implement this with [fexpr~], it goes something like: > > > [fexpr~ $x + (coef1 * $x1[-1]) + (coef2 * $x1[-2])] > > > It's seems this formula can also be achieved done with biquad, which > receives a list where the first two elements are the same coefficients. > > > But it still doesn't seem it is as simple as that. Maybe there's also > something regarding the gain of the filter or something. > > > Hope the wizards can help me solve this > > > Cheers > > > > > > > 2014-04-09 14:20 GMT-03:00 Alexandre Torres Porres <por...@gmail.com>: > > "I'd start with a look at the [bp~] source to see if you can extract some >> hints about how the filter is implemented." >> >> Anyway, this is what I got from the code. But I wasn't successful to >> extract biquad coefficients from it. I still assume it can be done. It says >> it's a 2-pole bandpass filter, so I understand you can get to it with >> biquad, cause biquad is 2-pole and 2-zero. It's just a matter to get rid of >> the zeros somehow. I was able to leave them with a vlue of 0, but didn't >> seem to do the job. >> >> >> thanks >> >> >> static t_float sigbp_qcos(t_float f) >> >> { >> >> if (f >= -(0.5f*3.14159f) && f <= 0.5f*3.14159f) >> >> { >> >> t_float g = f*f; >> >> return (((g*g*g * (-1.0f/720.0f) + g*g*(1.0f/24.0f)) - g*0.5) + 1 >> ); >> >> } >> >> else return (0); >> >> } >> >> >> static void sigbp_docoef(t_sigbp *x, t_floatarg f, t_floatarg q) >> >> { >> >> t_float r, oneminusr, omega; >> >> if (f < 0.001) f = 10; >> >> if (q < 0) q = 0; >> >> x->x_freq = f; >> >> x->x_q = q; >> >> omega = f * (2.0f * 3.14159f) / x->x_sr; >> >> if (q < 0.001) oneminusr = 1.0f; >> >> else oneminusr = omega/q; >> >> if (oneminusr > 1.0f) oneminusr = 1.0f; >> >> r = 1.0f - oneminusr; >> >> x->x_ctl->c_coef1 = 2.0f * sigbp_qcos(omega) * r; >> >> x->x_ctl->c_coef2 = - r * r; >> >> x->x_ctl->c_gain = 2 * oneminusr * (oneminusr + r * omega); >> >> /* post("r %f, omega %f, coef1 %f, coef2 %f", >> >> r, omega, x->x_ctl->c_coef1, x->x_ctl->c_coef2); */ >> >> } >> >> >> 2014-04-08 22:21 GMT-03:00 Alexandre Torres Porres <por...@gmail.com>: >> >> "I'd start with a look at the [bp~] source to see if you can extract >>> some hints about how the filter is implemented." >>> >>> Done that, way out of my head. What I can deal with is wether I can get >>> to it with biquad coefficients. >>> >>> thanks >>> >>> >>> >>> 2014-04-08 21:28 GMT-03:00 Bill Gribble <g...@billgribble.com>: >>> >>> The quick and dirty way is just to feed the filter white noise and >>>> plot the output signal's spectrum. Guaranteed to show the actual >>>> performance of the filter, and not somebody's idea of how it ought to be >>>> working. >>>> >>>> If you need a theoretical curve, I'd start with a look at the [bp~] >>>> source to see if you can extract some hints about how the filter is >>>> implemented. It may be quite easy to figure out the poles and zeros if the >>>> code is clear and/or documented. >>>> >>>> Good luck! >>>> Bill Gribble >>>> >>> >>> >> >
bp.pd
Description: Binary data
_______________________________________________ Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list