Skip to main content
ted korczak
Associate III
Sep 26, 2017 12:05 AM UTC
Solved

bandpass filter

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.
    ted korczak
    ted korczakBest answer
    Associate III
    Sep 26, 2017 2:40 PM UTC
    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
    Sep 26, 2017 7:47 AM UTC
    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
    Sep 26, 2017 4:44 PM UTC
    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
    Sep 26, 2017 2:40 PM UTC
    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];       }   }