Skip to main content
ted korczak
Associate III
September 26, 2017
Solved

bandpass filter

  • September 26, 2017
  • 3 replies
  • 1870 views
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
    This topic has been closed for replies.
    Best answer by ted korczak
    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];       }   }

    3 replies

    David SIORPAES
    ST Employee
    September 26, 2017
    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
    September 26, 2017
    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],

    }

    }

    ted korczak
    ted korczakAuthorBest answer
    Associate III
    September 26, 2017
    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];       }   }