cancel
Showing results for 
Search instead for 
Did you mean: 

bandpass filter

ted korczak
Associate III
Posted on September 26, 2017 at 02:05

Hello

 

I trying to build 14 Khz bandpass filter on stm32f103 any help will be appreciated.

 

Ted
1 ACCEPTED SOLUTION

Accepted Solutions
ted korczak
Associate III
Posted on September 26, 2017 at 16:40

I have this code but I don't know how to put it inside stm32f103.

Inn CMSIS-DSP library I didn't find any examples for bandpass filters.

/* Digital filter designed by mkfilter/mkshape/gencode   A.J. Fisher    Command line: /www/usr/fisher/helpers/mkfilter -Ch -8.0000000000e+01 -Bp -o 8 -a 5.4230769231e-02 5.5000000000e-02 -l */  #define NZEROS 16 #define NPOLES 16 #define GAIN   2.733054109e+10  static float xv[NZEROS+1], yv[NPOLES+1];  static void filterloop()   { for (;;)       { xv[0] = xv[1]; xv[1] = xv[2]; xv[2] = xv[3]; xv[3] = xv[4]; xv[4] = xv[5]; xv[5] = xv[6]; xv[6] = xv[7]; xv[7] = xv[8]; xv[8] = xv[9]; xv[9] = xv[10]; xv[10] = xv[11]; xv[11] = xv[12]; xv[12] = xv[13]; xv[13] = xv[14]; xv[14] = xv[15]; xv[15] = xv[16];          xv[16] = next input value / GAIN;         yv[0] = yv[1]; yv[1] = yv[2]; yv[2] = yv[3]; yv[3] = yv[4]; yv[4] = yv[5]; yv[5] = yv[6]; yv[6] = yv[7]; yv[7] = yv[8]; yv[8] = yv[9]; yv[9] = yv[10]; yv[10] = yv[11]; yv[11] = yv[12]; yv[12] = yv[13]; yv[13] = yv[14]; yv[14] = yv[15]; yv[15] = yv[16];          yv[16] =   (xv[0] + xv[16]) - 8 * (xv[2] + xv[14]) + 28 * (xv[4] + xv[12])                      - 56 * (xv[6] + xv[10]) + 70 * xv[8]                      + ( -0.9999996903 * yv[0]) + ( 15.0671415160 * yv[1])                      + (-107.3207279400 * yv[2]) + (479.5899447000 * yv[3])                      + (-1504.6930028000 * yv[4]) + (3514.0764694000 * yv[5])                      + (-6318.5794832000 * yv[6]) + (8922.2254164000 * yv[7])                      + (-9998.7316198000 * yv[8]) + (8922.2257618000 * yv[9])                      + (-6318.5799724000 * yv[10]) + (3514.0768775000 * yv[11])                      + (-1504.6932358000 * yv[12]) + (479.5900375300 * yv[13])                      + (-107.3207528700 * yv[14]) + ( 15.0671455990 * yv[15]);         next output value = yv[16];       }   }

View solution in original post

3 REPLIES 3
David SIORPAES
ST Employee
Posted on September 26, 2017 at 09:47

You can use this convenient online tool for calculating the taps according to your specs: 

http://t-filter.engineerjs.com/

Then, use the C code produced by the tool itself or use the optimized

http://www.keil.com/pack/doc/CMSIS/DSP/html/group__groupFilters.html

 provided by ARM.
ted korczak
Associate III
Posted on September 26, 2017 at 16:40

I have this code but I don't know how to put it inside stm32f103.

Inn CMSIS-DSP library I didn't find any examples for bandpass filters.

/* Digital filter designed by mkfilter/mkshape/gencode   A.J. Fisher    Command line: /www/usr/fisher/helpers/mkfilter -Ch -8.0000000000e+01 -Bp -o 8 -a 5.4230769231e-02 5.5000000000e-02 -l */  #define NZEROS 16 #define NPOLES 16 #define GAIN   2.733054109e+10  static float xv[NZEROS+1], yv[NPOLES+1];  static void filterloop()   { for (;;)       { xv[0] = xv[1]; xv[1] = xv[2]; xv[2] = xv[3]; xv[3] = xv[4]; xv[4] = xv[5]; xv[5] = xv[6]; xv[6] = xv[7]; xv[7] = xv[8]; xv[8] = xv[9]; xv[9] = xv[10]; xv[10] = xv[11]; xv[11] = xv[12]; xv[12] = xv[13]; xv[13] = xv[14]; xv[14] = xv[15]; xv[15] = xv[16];          xv[16] = next input value / GAIN;         yv[0] = yv[1]; yv[1] = yv[2]; yv[2] = yv[3]; yv[3] = yv[4]; yv[4] = yv[5]; yv[5] = yv[6]; yv[6] = yv[7]; yv[7] = yv[8]; yv[8] = yv[9]; yv[9] = yv[10]; yv[10] = yv[11]; yv[11] = yv[12]; yv[12] = yv[13]; yv[13] = yv[14]; yv[14] = yv[15]; yv[15] = yv[16];          yv[16] =   (xv[0] + xv[16]) - 8 * (xv[2] + xv[14]) + 28 * (xv[4] + xv[12])                      - 56 * (xv[6] + xv[10]) + 70 * xv[8]                      + ( -0.9999996903 * yv[0]) + ( 15.0671415160 * yv[1])                      + (-107.3207279400 * yv[2]) + (479.5899447000 * yv[3])                      + (-1504.6930028000 * yv[4]) + (3514.0764694000 * yv[5])                      + (-6318.5794832000 * yv[6]) + (8922.2254164000 * yv[7])                      + (-9998.7316198000 * yv[8]) + (8922.2257618000 * yv[9])                      + (-6318.5799724000 * yv[10]) + (3514.0768775000 * yv[11])                      + (-1504.6932358000 * yv[12]) + (479.5900375300 * yv[13])                      + (-107.3207528700 * yv[14]) + ( 15.0671455990 * yv[15]);         next output value = yv[16];       }   }
Posted on September 26, 2017 at 16:44

 ,

 ,

I have this code but I don't know how to put it inside stm32f103.

Inn CMSIS-DSP library I didn't find any examples for bandpass filters.

/* Digital filter designed by mkfilter/mkshape/gencode A.J. Fisher

Command line: /www/usr/fisher/helpers/mkfilter -Ch -8.0000000000e+01 -Bp -o 8 -a 5.4230769231e-02 5.5000000000e-02 -l */

♯ define NZEROS 16

♯ define NPOLES 16

♯ define GAIN 2.733054109e+10

static float xv[NZEROS1], yv[NPOLES1],

static void filterloop()

{ for (,,)

{ xv[0] = xv[1], xv[1] = xv[2], xv[2] = xv[3], xv[3] = xv[4], xv[4] = xv[5], xv[5] = xv[6], xv[6] = xv[7], xv[7] = xv[8], xv[8] = xv[9], xv[9] = xv[10], xv[10] = xv[11], xv[11] = xv[12], xv[12] = xv[13], xv[13] = xv[14], xv[14] = xv[15], xv[15] = xv[16],

xv[16] = next input value / GAIN,

yv[0] = yv[1], yv[1] = yv[2], yv[2] = yv[3], yv[3] = yv[4], yv[4] = yv[5], yv[5] = yv[6], yv[6] = yv[7], yv[7] = yv[8], yv[8] = yv[9], yv[9] = yv[10], yv[10] = yv[11], yv[11] = yv[12], yv[12] = yv[13], yv[13] = yv[14], yv[14] = yv[15], yv[15] = yv[16],

yv[16] = (xv[0] + xv[16]) - 8 * (xv[2] + xv[14]) + 28 * (xv[4] + xv[12])

- 56 * (xv[6] + xv[10]) + 70 * xv[8]

+ ( -0.9999996903 * yv[0]) + ( 15.0671415160 * yv[1])

+ (-107.3207279400 * yv[2]) + (479.5899447000 * yv[3])

+ (-1504.6930028000 * yv[4]) + (3514.0764694000 * yv[5])

+ (-6318.5794832000 * yv[6]) + (8922.2254164000 * yv[7])

+ (-9998.7316198000 * yv[8]) + (8922.2257618000 * yv[9])

+ (-6318.5799724000 * yv[10]) + (3514.0768775000 * yv[11])

+ (-1504.6932358000 * yv[12]) + (479.5900375300 * yv[13])

+ (-107.3207528700 * yv[14]) + ( 15.0671455990 * yv[15]),

next output value = yv[16],

}

}