DSPRelated.com
Forums

Low Pass FIR [Kaiser]

Started by Xplosiv166 November 3, 2009
Hi, 

I am looking to implement the following filter in either C, C#.Net or
Visual Basic.Net.

Type:               - Low Pass FIR
Sampling Frequency: - 480Hz (10Bit ADC Values from a microprocessor)
Number of TAPs:     - 51
Cut-off frequency:  - 30Hz
Window:             - Kaiser

Basically this is a filter that somebody has proved using LabView and I
need to write a similar filter in the either of the above languages.

So far i have got an FFT (Forward and reverse) working it C and Visual
Basic.Net, but have no idea how I would go about writing the above filter.
Can somebody help point me to a tutorial? I have ordered a book recommend
in another post so helpfully that will help.

The other option is to give-up and buy a filter library for Visual Basic
or Visual C#.Net but i am not sure if a) one exists and b) it is within my
budget.

any advice would be much appreciated,

Best regards,

Xplosiv166


On 3 Nov, 19:15, "Xplosiv166" <andrew_...@blueyonder.co.uk> wrote:
> Hi, > > I am looking to implement the following filter in either C, C#.Net or > Visual Basic.Net. > > Type: &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; - Low Pass FIR > Sampling Frequency: - 480Hz (10Bit ADC Values from a microprocessor) > Number of TAPs: &#4294967295; &#4294967295; - 51 > Cut-off frequency: &#4294967295;- 30Hz > Window: &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; - Kaiser > > Basically this is a filter that somebody has proved using LabView and I > need to write a similar filter in the either of the above languages.
If you need to replicate what others have already done in LabView, the main concern is to get hold of a copy of the filter coefficients that whoever have shown to work in the application. Once you have the coefficients, the filer itself is a simple loop (pseudo code inspired by matlab): x = vector of N input samples y = zeros(N+50); h = 50 filter coeffficients for n=0:(N-1+50) for k = 0:50 y(n)= y(n)+h(k)*x(n-k); end end Don't take this too literally - I have ignored end effects, proof reading and testing. However, once you have the filter coefficients h, the filter is only marginally more complicated than shown. No need for FFTs or IFFTs. The FFT / IFFT pair speed computations up in offline applications, but tend to complicate matters in online applications. They are convenient, but not essential. Newbies can just stick with the simple loop like above. The main problem with fixed-point arithemtic will likely not be speed, but numerical inaccuracy issues. Rune
>On 3 Nov, 19:15, "Xplosiv166" <andrew_...@blueyonder.co.uk> wrote: >> Hi, >> >> I am looking to implement the following filter in either C, C#.Net or >> Visual Basic.Net. >> >> Type: =A0 =A0 =A0 =A0 =A0 =A0 =A0 - Low Pass FIR >> Sampling Frequency: - 480Hz (10Bit ADC Values from a microprocessor) >> Number of TAPs: =A0 =A0 - 51 >> Cut-off frequency: =A0- 30Hz >> Window: =A0 =A0 =A0 =A0 =A0 =A0 - Kaiser >> >> Basically this is a filter that somebody has proved using LabView and
I
>> need to write a similar filter in the either of the above languages. > >If you need to replicate what others have already done in LabView, >the main concern is to get hold of a copy of the filter coefficients >that whoever have shown to work in the application. > >Once you have the coefficients, the filer itself is a simple loop >(pseudo code inspired by matlab): > >x =3D vector of N input samples >y =3D zeros(N+50); >h =3D 50 filter coeffficients > >for n=3D0:(N-1+50) > for k =3D 0:50 > y(n)=3D y(n)+h(k)*x(n-k); > end >end > >Don't take this too literally - I have ignored end effects, proof >reading and testing. > >However, once you have the filter coefficients h, the filter is >only marginally more complicated than shown. No need for FFTs or >IFFTs. >The FFT / IFFT pair speed computations up in offline applications, >but tend to complicate matters in online applications. They are >convenient, but not essential. > >Newbies can just stick with the simple loop like above. The main >problem with fixed-point arithemtic will likely not be speed, but >numerical inaccuracy issues. > >Rune >
Hi Rune, Thank you for you response it was very helpful. Question is the window in this case Kaiser part of the filter coefficients ? or is it part of the filter calculation loop (like in you example above) Also how hard would it be for me to design the above filter myself? I don't have any design tools although I think i have a students copy of Matlab 6.5 somewhere around although this would be no good for commercial applications. As i am not sure if I can actual get the coefficients, the filter does not have to be a perfect match to the one above. Also Can somebody please explain ((if they have time) why one would use a window and why would you use a Kaiser window specifically? Many thanks for your time and help, Xplosiv166
Xplosiv166 wrote:
>> On 3 Nov, 19:15, "Xplosiv166" <andrew_...@blueyonder.co.uk> wrote: >>> Hi, >>> >>> I am looking to implement the following filter in either C, C#.Net or >>> Visual Basic.Net. >>> >>> Type: =A0 =A0 =A0 =A0 =A0 =A0 =A0 - Low Pass FIR >>> Sampling Frequency: - 480Hz (10Bit ADC Values from a microprocessor) >>> Number of TAPs: =A0 =A0 - 51 >>> Cut-off frequency: =A0- 30Hz >>> Window: =A0 =A0 =A0 =A0 =A0 =A0 - Kaiser >>> >>> Basically this is a filter that somebody has proved using LabView and > I >>> need to write a similar filter in the either of the above languages. >> If you need to replicate what others have already done in LabView, >> the main concern is to get hold of a copy of the filter coefficients >> that whoever have shown to work in the application. >> >> Once you have the coefficients, the filer itself is a simple loop >> (pseudo code inspired by matlab): >> >> x =3D vector of N input samples >> y =3D zeros(N+50); >> h =3D 50 filter coeffficients >> >> for n=3D0:(N-1+50) >> for k =3D 0:50 >> y(n)=3D y(n)+h(k)*x(n-k); >> end >> end >> >> Don't take this too literally - I have ignored end effects, proof >> reading and testing. >> >> However, once you have the filter coefficients h, the filter is >> only marginally more complicated than shown. No need for FFTs or >> IFFTs. >> The FFT / IFFT pair speed computations up in offline applications, >> but tend to complicate matters in online applications. They are >> convenient, but not essential. >> >> Newbies can just stick with the simple loop like above. The main >> problem with fixed-point arithemtic will likely not be speed, but >> numerical inaccuracy issues. >> >> Rune >> > > Hi Rune, > > Thank you for you response it was very helpful. > > Question is the window in this case Kaiser part of the filter coefficients > ? or is it part of the filter calculation loop (like in you example above) > > Also how hard would it be for me to design the above filter myself? I > don't have any design tools although I think i have a students copy of > Matlab 6.5 somewhere around although this would be no good for commercial > applications. > > As i am not sure if I can actual get the coefficients, the filter does not > have to be a perfect match to the one above. > > Also Can somebody please explain ((if they have time) why one would use a > window and why would you use a Kaiser window specifically?
The shaping window will usually be part of the given coefficients. The capculations will certainly be done that way. You can ask when you get the coefficients whether they have been windowed or not. From what you wrote, the filter was designed according to the "windowed sinc" method. The choice of window sets the stop-band attenuation, passband ripple, and band-edge sharpness. More sophisticated windows improves the first two and worsens the last. A few more taps get that performance back. A window increases the stop-band attenuation If, in the end, you need to derive the coefficients yourself, ignore all that and use a filter-design program that iteratively calculates optimum coefficients with whatever cut-off sharpness, stop-band attenuation, and passband ripple is specified. You can use a free trial version of ScopeFIR form http://www.iowegian.com/ to calculate the coefficients. A low-pass with a cutoff frequency that is such a small fraction of the sample frequency is best done with an IIR unless there is a particular reason to use an FIR filter. Was that considered? Jerry -- Engineering is the art of making what you want from things you can get. &#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
Jerry Avins wrote:

   ...

> A window increases the stop-band attenuation > > If, in the end, you need to derive the coefficients yourself, ignore all > that and use a filter-design program that iteratively calculates optimum > coefficients with whatever cut-off sharpness, stop-band attenuation, and > passband ripple is specified. You can use a free trial version of > ScopeFIR form http://www.iowegian.com/ to calculate the coefficients. > > A low-pass with a cutoff frequency that is such a small fraction of the > sample frequency is best done with an IIR unless there is a particular > reason to use an FIR filter. Was that considered?
Look at http://www.dsptutor.freeuk.com/remez/RemezFIRFilterDesign.html and http://www.dsptutor.freeuk.com/IIRFilterDesign/IIRFiltDes102.html Jerry -- Engineering is the art of making what you want from things you can get. &#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
>Xplosiv166 wrote: >>> On 3 Nov, 19:15, "Xplosiv166" <andrew_...@blueyonder.co.uk> wrote: >>>> Hi, >>>> >>>> I am looking to implement the following filter in either C, C#.Net
or
>>>> Visual Basic.Net. >>>> >>>> Type: =A0 =A0 =A0 =A0 =A0 =A0 =A0 - Low Pass FIR >>>> Sampling Frequency: - 480Hz (10Bit ADC Values from a microprocessor) >>>> Number of TAPs: =A0 =A0 - 51 >>>> Cut-off frequency: =A0- 30Hz >>>> Window: =A0 =A0 =A0 =A0 =A0 =A0 - Kaiser >>>> >>>> Basically this is a filter that somebody has proved using LabView
and
>> I >>>> need to write a similar filter in the either of the above languages. >>> If you need to replicate what others have already done in LabView, >>> the main concern is to get hold of a copy of the filter coefficients >>> that whoever have shown to work in the application. >>> >>> Once you have the coefficients, the filer itself is a simple loop >>> (pseudo code inspired by matlab): >>> >>> x =3D vector of N input samples >>> y =3D zeros(N+50); >>> h =3D 50 filter coeffficients >>> >>> for n=3D0:(N-1+50) >>> for k =3D 0:50 >>> y(n)=3D y(n)+h(k)*x(n-k); >>> end >>> end >>> >>> Don't take this too literally - I have ignored end effects, proof >>> reading and testing. >>> >>> However, once you have the filter coefficients h, the filter is >>> only marginally more complicated than shown. No need for FFTs or >>> IFFTs. >>> The FFT / IFFT pair speed computations up in offline applications, >>> but tend to complicate matters in online applications. They are >>> convenient, but not essential. >>> >>> Newbies can just stick with the simple loop like above. The main >>> problem with fixed-point arithemtic will likely not be speed, but >>> numerical inaccuracy issues. >>> >>> Rune >>> >> >> Hi Rune, >> >> Thank you for you response it was very helpful. >> >> Question is the window in this case Kaiser part of the filter
coefficients
>> ? or is it part of the filter calculation loop (like in you example
above)
>> >> Also how hard would it be for me to design the above filter myself? I >> don't have any design tools although I think i have a students copy of >> Matlab 6.5 somewhere around although this would be no good for
commercial
>> applications. >> >> As i am not sure if I can actual get the coefficients, the filter does
not
>> have to be a perfect match to the one above. >> >> Also Can somebody please explain ((if they have time) why one would use
a
>> window and why would you use a Kaiser window specifically? > >The shaping window will usually be part of the given coefficients. The >capculations will certainly be done that way. You can ask when you get >the coefficients whether they have been windowed or not. > > From what you wrote, the filter was designed according to the "windowed
>sinc" method. The choice of window sets the stop-band attenuation, >passband ripple, and band-edge sharpness. More sophisticated windows >improves the first two and worsens the last. A few more taps get that >performance back. > >A window increases the stop-band attenuation > >If, in the end, you need to derive the coefficients yourself, ignore all
>that and use a filter-design program that iteratively calculates optimum
>coefficients with whatever cut-off sharpness, stop-band attenuation, and
>passband ripple is specified. You can use a free trial version of >ScopeFIR form http://www.iowegian.com/ to calculate the coefficients. > >A low-pass with a cutoff frequency that is such a small fraction of the >sample frequency is best done with an IIR unless there is a particular >reason to use an FIR filter. Was that considered? > >Jerry >-- >Engineering is the art of making what you want from things you can get. >&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; >
Hi Jerry, Thank you for your response. The person who designed the filter supposedly knew what they were doing, but i am not convinced as they seem not to be able to supply me with the coefficients or the Kaiser Beta value used so that i could at least have a fighting chance at designing it myself. The signal I am looking at is between 1 and 6 Hz pulses, but as the hardware has limited filtering there is allot of mains (50Hz as i am in the UK) noise and the harmonics of and over that there is allot of low amplitude high frequency noise. I have tested the filter mentioned above in LabView and it seems to work well but cannot access the filter design it&rsquo;s self as I am viewing it through a LV GUI.
>A low-pass with a cutoff frequency that is such a small fraction of the >sample frequency is best done with an IIR unless there is a particular >reason to use an FIR filter. Was that considered?
I originally was using a very basic single pole IIR filter which worked but not well enough, I am no DSP engineer but it is looking more and more like i will need to design the filter myself, on a plus point i have Matlab 6.5 and simulink working which i can use to calculate the coefficients using the filter designer if only i knew what i was doing&#61514;. This is a very basic mspaint attempt at drawing the signal and before and after filtering http://andy166.pwp.blueyonder.co.uk/Signal.jpg Is there any example code written in C/C++ that uses an array of coefficients and calculates the output from an array of inputs that I can use (i.e. the FIR filter)? Then i can test my filters out. Thanks again for your/every bodies help on this, Xplosiv166
Xplosiv166 wrote:

   ...

> The person who designed the filter supposedly knew what they were doing, > but i am not convinced as they seem not to be able to supply me with the > coefficients or the Kaiser Beta value used so that i could at least have a > fighting chance at designing it myself.
He couldn't assess the adequacy of the filter without testing it at least to th point of producing a frequenct-response curve. That requires knowing the values of the windowed coefficients. If he never knew them, then his design is by estimation and untested.
> The signal I am looking at is between 1 and 6 Hz pulses, but as the > hardware has limited filtering there is allot of mains (50Hz as i am in the > UK) noise and the harmonics of and over that there is allot of low > amplitude high frequency noise. I have tested the filter mentioned above in > LabView and it seems to work well but cannot access the filter design > it&rsquo;s self as I am viewing it through a LV GUI.
The links I provided can get you the coefficients and a response plot.
>> A low-pass with a cutoff frequency that is such a small fraction of the >> sample frequency is best done with an IIR unless there is a particular >> reason to use an FIR filter. Was that considered? > > I originally was using a very basic single pole IIR filter which worked > but not well enough, I am no DSP engineer but it is looking more and more > like i will need to design the filter myself, on a plus point i have Matlab > 6.5 and simulink working which i can use to calculate the coefficients > using the filter designer if only i knew what i was doing&#61514;.
It should be no trick to design an eighth-order FIR Chebychev filter that will do your job very well. The aJava ap is set for 8 KHz sample rate. Just ratio the cutoff you want and it serve.
> This is a very basic mspaint attempt at drawing the signal and before and > after filtering > > http://andy166.pwp.blueyonder.co.uk/Signal.jpg > > Is there any example code written in C/C++ that uses an array of > coefficients and calculates the output from an array of inputs that I can > use (i.e. the FIR filter)? Then i can test my filters out.
I don't have one. It shouldn't be hard to write once a program gives you the coefficients. Jerry -- Engineering is the art of making what you want from things you can get.
Xplosiv166 wrote:
..
> > http://andy166.pwp.blueyonder.co.uk/Signal.jpg > > Is there any example code written in C/C++ that uses an array of > coefficients and calculates the output from an array of inputs that I can > use (i.e. the FIR filter)? Then i can test my filters out. >
See if you can find a copy of the book "Introductory Digital Signal Processing" by Lynn and Fuerst: http://www.amazon.co.uk/Introductory-Digital-Signal-Processing-disk It has (to my non-specialist eye) very clear explanations, and example code. The first edition (which I have and still refer to) used Basic and Pascal, the second edition uses C instead of BASIC. There is a whole lot of code in open-source audio/music tools such as Csound (including code to make Kaiser windows; widely used in phase vocoders). A filter is a filter, and it doesn't matter if your own application isn't "musical" as such; the requirements are much the same. Richard Dobson
I'm sure there's an online filter calculator that gives out a C style
difference equation but I can't remember which one it is. I have a
free program called WinFilter that gives out C code. I'm not sure how
good it is for designing filters but it can give you an idea of how to
use coefficients in your code.
Stephen Smiths book http://www.dspguide.com/pdfbook.htm is pretty good
for a beginner and includes pseudo code in basic (whatever that is).
>I'm sure there's an online filter calculator that gives out a C style >difference equation but I can't remember which one it is. I have a >free program called WinFilter that gives out C code. I'm not sure how >good it is for designing filters but it can give you an idea of how to >use coefficients in your code. >Stephen Smiths book http://www.dspguide.com/pdfbook.htm is pretty good >for a beginner and includes pseudo code in basic (whatever that is). >
Hi all, Thank you for your help, i will try what you have suggested and see how i get on Xplosiv166