Hi everybody I'd like to have a 2nd order low-pass filter with real-time controllable cut-off frequency (fc). I am working on a 16-bit fixed-point processor and therefore I've chosen a DF2 SOS structure to implement a Butterworth LPF. In order to simplify things, I've made up a table containing g, a1 and a2 of the filter for different cut-off frequencies = fn*(0.006250, 0.006250, 0.012500, 0.025000, 0.050000 etc.) with fn = fs/2. So far so good, the filter works for the different fc alone. But when I try to switch the fc on the fly, I have overflow problems in the output for several dozens (up to some hundreds) of samples until the result is stable again. I think the problem might be due to the DF2 and the states are different between the different fc and therefore I'd have to reset the states when switching fc. Indeed this solves the overflow problem. But I don't like the fact of resetting the filter states since this introduces a "gap" in the output. Is there any possibility to implement to controllable fc more properly/correctly? Thank you a lot for your help Andreas
Controllable cut-off freq for DF2 SOS
Started by ●June 20, 2011
Reply by ●June 20, 20112011-06-20
ombz <andreas.weiskopf@n_o_s_p_a_m.gmail.com> wrote:> I'd like to have a 2nd order low-pass filter with real-time controllable > cut-off frequency (fc). I am working on a 16-bit fixed-point processor and > therefore I've chosen a DF2 SOS structure to implement a Butterworth LPF. > In order to simplify things, I've made up a table containing g, a1 and a2 > of the filter for different cut-off frequencies = fn*(0.006250, 0.006250, > 0.012500, 0.025000, 0.050000 etc.) with fn = fs/2. So far so good, the > filter works for the different fc alone. > But when I try to switch the fc on the fly, I have overflow problems in the > output for several dozens (up to some hundreds) of samples until the result > is stable again.I haven't actually tried this, but my thought would be that you slowly change the coefficients over some number of cycles (samples). That is, linearly interpolate between the two and, following the interpolation slowly go from one to the other. It seems to my likely to work for slow enough, less likely as the change is done faster.> I think the problem might be due to the DF2 and the states are different > between the different fc and therefore I'd have to reset the states when > switching fc. Indeed this solves the overflow problem. But I don't like the > fact of resetting the filter states since this introduces a "gap" in the > output.-- glen
Reply by ●June 20, 20112011-06-20
Hi Glen, Thanks for your fast reply. I was thinking of the same thing. And in my opinion what you propose should work. The problem is that I should be able to switch from one sample to another. In a simplified case there might only be 2 distinct fc. Therefore I'll try the following: - having 2 filters for the 2 fc - in case of switch I'll chose simply the output of the selected fc>ombz <andreas.weiskopf@n_o_s_p_a_m.gmail.com> wrote: > >> I'd like to have a 2nd order low-pass filter with real-timecontrollable>> cut-off frequency (fc). I am working on a 16-bit fixed-point processorand>> therefore I've chosen a DF2 SOS structure to implement a ButterworthLPF.>> In order to simplify things, I've made up a table containing g, a1 anda2>> of the filter for different cut-off frequencies = fn*(0.006250,0.006250,>> 0.012500, 0.025000, 0.050000 etc.) with fn = fs/2. So far so good, the >> filter works for the different fc alone. >> But when I try to switch the fc on the fly, I have overflow problems inthe>> output for several dozens (up to some hundreds) of samples until theresult>> is stable again. > >I haven't actually tried this, but my thought would be that you >slowly change the coefficients over some number of cycles (samples). >That is, linearly interpolate between the two and, following the >interpolation slowly go from one to the other. > >It seems to my likely to work for slow enough, less likely as >the change is done faster. > >> I think the problem might be due to the DF2 and the states aredifferent>> between the different fc and therefore I'd have to reset the stateswhen>> switching fc. Indeed this solves the overflow problem. But I don't likethe>> fact of resetting the filter states since this introduces a "gap" inthe>> output. > >-- glen >
Reply by ●June 20, 20112011-06-20
ombz wrote:> Hi everybody > > I'd like to have a 2nd order low-pass filter with real-time controllable > cut-off frequency (fc). I am working on a 16-bit fixed-point processor and > therefore I've chosen a DF2 SOS structure to implement a Butterworth LPF. > In order to simplify things, I've made up a table containing g, a1 and a2 > of the filter for different cut-off frequencies = fn*(0.006250, 0.006250, > 0.012500, 0.025000, 0.050000 etc.) with fn = fs/2. So far so good, the > filter works for the different fc alone. > But when I try to switch the fc on the fly, I have overflow problems in the > output for several dozens (up to some hundreds) of samples until the result > is stable again. > I think the problem might be due to the DF2 and the states are different > between the different fc and therefore I'd have to reset the states when > switching fc. Indeed this solves the overflow problem. But I don't like the > fact of resetting the filter states since this introduces a "gap" in the > output. > Is there any possibility to implement to controllable fc more > properly/correctly?There are 4 common ways to minimize artifacts when changing the filter coefficients on the fly. Which one is the best depends on your hardware and requirements. 1. Fade in the signal, change coefficients, fade out. 2. Make two filters: "old" and "new" working in parallel. Fade in the old filter, fade out the new. 3. Interpolate the coefficients so the change is smooth. 4. Change a coefficient when the signal value which is multiplied by this coefficient is crossing zero. Vladimir Vassilevsky DSP and Mixed Signal Design Consultant http://www.abvolt.com
Reply by ●June 20, 20112011-06-20
ombz <andreas.weiskopf@n_o_s_p_a_m.gmail.com> wrote:> Thanks for your fast reply. I was thinking of the same thing. And in my > opinion what you propose should work. The problem is that I should be able > to switch from one sample to another. In a simplified case there might only > be 2 distinct fc. > Therefore I'll try the following: > - having 2 filters for the 2 fc > - in case of switch I'll chose simply the output of the selected fcThe exact effect of a linear combination of two filters isn't so obvious to me. It might not be so hard to compute the effect, though. You could either precompute, in a big table, the interpolation values between the two, or generate them as needed. Also, the speed to do the transition isn't so obvious. -- glen
Reply by ●June 20, 20112011-06-20
On 06/20/2011 05:40 AM, glen herrmannsfeldt wrote:> ombz<andreas.weiskopf@n_o_s_p_a_m.gmail.com> wrote: > >> Thanks for your fast reply. I was thinking of the same thing. And in my >> opinion what you propose should work. The problem is that I should be able >> to switch from one sample to another. In a simplified case there might only >> be 2 distinct fc. >> Therefore I'll try the following: >> - having 2 filters for the 2 fc >> - in case of switch I'll chose simply the output of the selected fc > > The exact effect of a linear combination of two filters isn't > so obvious to me. It might not be so hard to compute the > effect, though. > > You could either precompute, in a big table, the interpolation > values between the two, or generate them as needed. Also, the > speed to do the transition isn't so obvious.I think the OP is talking about a hard switch, from one sample to the next. -- Tim Wescott Wescott Design Services http://www.wescottdesign.com Do you need to implement control loops in software? "Applied Control Theory for Embedded Systems" was written for you. See details at http://www.wescottdesign.com/actfes/actfes.html
Reply by ●June 20, 20112011-06-20
On 06/20/2011 05:19 AM, Vladimir Vassilevsky wrote:> > > ombz wrote: >> Hi everybody >> >> I'd like to have a 2nd order low-pass filter with real-time controllable >> cut-off frequency (fc). I am working on a 16-bit fixed-point processor >> and >> therefore I've chosen a DF2 SOS structure to implement a Butterworth LPF. >> In order to simplify things, I've made up a table containing g, a1 and a2 >> of the filter for different cut-off frequencies = fn*(0.006250, 0.006250, >> 0.012500, 0.025000, 0.050000 etc.) with fn = fs/2. So far so good, the >> filter works for the different fc alone. >> But when I try to switch the fc on the fly, I have overflow problems >> in the >> output for several dozens (up to some hundreds) of samples until the >> result >> is stable again. >> I think the problem might be due to the DF2 and the states are different >> between the different fc and therefore I'd have to reset the states when >> switching fc. Indeed this solves the overflow problem. But I don't >> like the >> fact of resetting the filter states since this introduces a "gap" in the >> output. >> Is there any possibility to implement to controllable fc more >> properly/correctly? > > There are 4 common ways to minimize artifacts when changing the filter > coefficients on the fly. Which one is the best depends on your hardware > and requirements. > > 1. Fade in the signal, change coefficients, fade out. > 2. Make two filters: "old" and "new" working in parallel. Fade in the > old filter, fade out the new. > 3. Interpolate the coefficients so the change is smooth. > 4. Change a coefficient when the signal value which is multiplied by > this coefficient is crossing zero.It seems that there's a fifth option, based on an observer canonical form (see "Linear Systems", Kailath, Prentice-Hall, 1980, pp 35-37). But I'm too lazy to flesh it out right now... -- Tim Wescott Wescott Design Services http://www.wescottdesign.com Do you need to implement control loops in software? "Applied Control Theory for Embedded Systems" was written for you. See details at http://www.wescottdesign.com/actfes/actfes.html
Reply by ●June 20, 20112011-06-20
There's a form which is basically two all-pass filters added together which has the virtue of the "state energy" being evenly distributed in the z^-1 which is much more tolerant of coefficients changing (though you would still probably want to change them a little bit with e.g. each sample, over a period of a few milliseconds. HTH, -Michael On Jun 20, 4:18=A0am, "ombz" <andreas.weiskopf@n_o_s_p_a_m.gmail.com> wrote:> Hi everybody > > I'd like to have a 2nd order low-pass filter with real-time controllable > cut-off frequency (fc). I am working on a 16-bit fixed-point processor an=d> therefore I've chosen a DF2 SOS structure to implement a Butterworth LPF. > In order to simplify things, I've made up a table containing g, a1 and a2 > of the filter for different cut-off frequencies =3D fn*(0.006250, 0.00625=0,> 0.012500, 0.025000, 0.050000 etc.) with fn =3D fs/2. So far so good, the > filter works for the different fc alone. > But when I try to switch the fc on the fly, I have overflow problems in t=he> output for several dozens (up to some hundreds) of samples until the resu=lt> is stable again. > I think the problem might be due to the DF2 and the states are different > between the different fc and therefore I'd have to reset the states when > switching fc. Indeed this solves the overflow problem. But I don't like t=he> fact of resetting the filter states since this introduces a "gap" in the > output. > Is there any possibility to implement to controllable fc more > properly/correctly? > > Thank you a lot for your help > > Andreas
Reply by ●June 22, 20112011-06-22
Vladimir, Tim, Michael, Thank you for your helpful answers. As Tim pointed out correctly, the aim has been a "hard switch", from one to the next sample. I think I'll have to evaluate options 1 to 3 in detail. I've already implemented the 2nd option with a cross fade on 1 sample, but the artifacts are still visible. Some more samples to cross-fade might do the thing. Option 1 might do it as well. I think option 3 would be too much computation*. Same holds for zero-cross check : I think it involves too much computation. I don't fully understand option 5: would I have to add a all-pass stage after the Butterworth, in order to linearize phase, and then I'd see less artifacts? Best regards, Andreas * In fact I don't have to filter 1 signal but up to 4096 at a time where some of them remain filtered at fc0 and others will be submitted to switch to be filtered at fc1 - or they remain at fc1 and will be filtered at fc0.>There's a form which is basically two all-pass filters added together >which has the virtue of the "state energy" being evenly distributed in >the z^-1 which is much more tolerant of coefficients changing (though >you would still probably want to change them a little bit with e.g. >each sample, over a period of a few milliseconds. > >HTH, > >-Michael > > >On Jun 20, 4:18=A0am, "ombz" <andreas.weiskopf@n_o_s_p_a_m.gmail.com> >wrote: >> Hi everybody >> >> I'd like to have a 2nd order low-pass filter with real-timecontrollable>> cut-off frequency (fc). I am working on a 16-bit fixed-point processoran=>d >> therefore I've chosen a DF2 SOS structure to implement a ButterworthLPF.>> In order to simplify things, I've made up a table containing g, a1 anda2>> of the filter for different cut-off frequencies =3D fn*(0.006250,0.00625=>0, >> 0.012500, 0.025000, 0.050000 etc.) with fn =3D fs/2. So far so good,the>> filter works for the different fc alone. >> But when I try to switch the fc on the fly, I have overflow problems int=>he >> output for several dozens (up to some hundreds) of samples until theresu=>lt >> is stable again. >> I think the problem might be due to the DF2 and the states aredifferent>> between the different fc and therefore I'd have to reset the stateswhen>> switching fc. Indeed this solves the overflow problem. But I don't liket=>he >> fact of resetting the filter states since this introduces a "gap" inthe>> output. >> Is there any possibility to implement to controllable fc more >> properly/correctly? >> >> Thank you a lot for your help >> >> Andreas > >
Reply by ●June 22, 20112011-06-22
ombz wrote:> Vladimir, Tim, Michael, > > Thank you for your helpful answers. As Tim pointed out correctly, the aim > has been a "hard switch", from one to the next sample. > I think I'll have to evaluate options 1 to 3 in detail. I've already > implemented the 2nd option with a cross fade on 1 sample, but the artifacts > are still visible. Some more samples to cross-fade might do the thing. > Option 1 might do it as well. I think option 3 would be too much > computation*. Same holds for zero-cross check : I think it involves too > much computation.Zero cross check is preferred option if the filter is implemented in the hardware. All you have to do is reload a coefficient on toggle of the sign bit of the corresponding data. Vladimir Vassilevsky DSP and Mixed Signal Design Consultant http://www.abvolt.com