Projektowanie filtrów IIR w MatLabie i eksport do C

0

powiedzmy, że zaprojektuję sobie filtr o skończonej odpowiedzi impulsowej (FIR) i wyeksportuję jego współczynniki do C.

dostanę plik:

/*

 * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool

 *

 * Generated by MATLAB(R) 7.10 and the Signal Processing Toolbox 6.13.

 *

 * Generated on: 24-Nov-2011 02:15:33

 *

 */

/*

 * Discrete-Time FIR Filter (real)

 * -------------------------------

 * Filter Structure  : Direct-Form FIR

 * Filter Length     : 11

 * Stable            : Yes

 * Linear Phase      : Yes (Type 1)

 */

/* General type conversion for MATLAB generated C-code  */

#include "tmwtypes.h"

/* 

 * Expected path to tmwtypes.h 

 * C:\Program Files\MATLAB\R2010a\extern\include\tmwtypes.h 

 */

const int BL = 11;

const real64_T B[11] = {

    0.01598844872426,  0.03296224384387,  0.05673102189412,  0.08070571691832,

     0.0986154736458,    0.105263124007,   0.0986154736458,  0.08070571691832,

    0.05673102189412,  0.03296224384387,  0.01598844872426

};

no i wiem co mam zrobić. mam zrobić okno 11-elementowe, używane w funkcji filtrującej do przejścia przez cały sygnał wyjściowy, dzięki czemu uzyskam sygnał wyjściowy. wygląda to mniej więcej tak:

double filter(double *data)
{
    static const double filterParameters[11] = 
    {
        0.01598844872426,  0.03296224384387,  0.05673102189412,  0.08070571691832,
        0.0986154736458,    0.105263124007,   0.0986154736458,  0.08070571691832,
        0.05673102189412,  0.03296224384387,  0.01598844872426
    };

    double result=0;
    for(int i=0;i<11;i++)
    {
        result += data[i]*filterParameters[i] ;
    }
    for (int i=10;i>0;i--) 
    {
        data[i]=data[i-1];
    }
    return result;
}

extern "C" void filter_function(const double *src, double *dest, unsigned size, double, double, void **options) 
{
    const unsigned N = 11 ;

    double *dataForFilter = new double[N] ;
    for(int i=1; i<N; ++i)
    {
        dataForFilter[i]=0;
    }
    for(int i=0; i<size; ++i)
    {       
        dataForFilter[0]=src[i] ;
        dest[i]=filter(dataForFilter) ;
    }
    delete [] dataForFilter ;
}

w filtrach o nieskończonej odpowiedzi impulsowej (IIR) zmiana polega na tym, że do określenia sygnału wejściowego potrzebujemy nie tylko próbki sygnału wejściowego, ale już wcześniej obliczone próbki sygnału wyjściowego.
wikipedia, jakby ktoś nie wiedział: http://pl.wikipedia.org/wiki/[...]4czonej_odpowiedzi_impulsowej

czyli po zaprojektowaniu filtru w matlabie i wyeksportowaniu współczynników do C spodziewamy się 2 tablic. dostają 2 tablicę, ale 2-wymiarowe:

/*

 * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool

 *

 * Generated by MATLAB(R) 7.10 and the Signal Processing Toolbox 6.13.

 *

 * Generated on: 05-Dec-2011 23:56:50

 *

 */

/*

 * Discrete-Time IIR Filter (real)

 * -------------------------------

 * Filter Structure    : Direct-Form II, Second-Order Sections

 * Number of Sections  : 5

 * Stable              : Yes

 * Linear Phase        : No

 */

/* General type conversion for MATLAB generated C-code  */

#include "tmwtypes.h"

/* 

 * Expected path to tmwtypes.h 

 * C:\Program Files\MATLAB\R2010a\extern\include\tmwtypes.h 

 */

#define MWSPT_NSEC 11

const int NL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1,3,1 };

const real64_T NUM[MWSPT_NSEC][3] = {

  {

    0.08745044557885,                 0,                 0 

  },

  {

                   1,                 2,                 1 

  },

  {

    0.07537718292429,                 0,                 0 

  },

  {

                   1,                 2,                 1 

  },

  {

    0.06745527388907,                 0,                 0 

  },

  {

                   1,                 2,                 1 

  },

  {

     0.0626699602388,                 0,                 0 

  },

  {

                   1,                 2,                 1 

  },

  {

    0.06041668087137,                 0,                 0 

  },

  {

                   1,                 2,                 1 

  },

  {

                   1,                 0,                 0 

  }

};

const int DL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1,3,1 };

const real64_T DEN[MWSPT_NSEC][3] = {

  {

                   1,                 0,                 0 

  },

  {

                   1,   -1.481784128539,   0.8315859108541 

  },

  {

                   1,                 0,                 0 

  },

  {

                   1,   -1.277211483279,   0.5787202149761 

  },

  {

                   1,                 0,                 0 

  },

  {

                   1,    -1.14298050254,   0.4128015980962 

  },

  {

                   1,                 0,                 0 

  },

  {

                   1,   -1.061896846875,   0.3125766878303 

  },

  {

                   1,                 0,                 0 

  },

  {

                   1,   -1.023716668584,   0.2653833920695 

  },

  {

                   1,                 0,                 0 

  }

};

czy ktoś mógłby powiedzieć jak to ugryźć i dlaczego tak dostaję, a nie inaczej? jakaś teoria wystarczy

0

Zrobiłeś filtr z sekcjami drugiego rzędu, wygląda to więc dość dziwnie. Zobacz co będzie jak zrobisz zwykłe "Direct form II" tak, żeby miał jedną sekcję któregoś tam rzędu.

0
Endrju napisał(a)

Zrobiłeś filtr z sekcjami drugiego rzędu, wygląda to więc dość dziwnie. Zobacz co będzie jak zrobisz zwykłe "Direct form II" tak, żeby miał jedną sekcję któregoś tam rzędu.

no ale jak?
ja po prostu wybrałem:

  • typ: IIR
  • metoda: Butterwortha
  • order: specify, 10
  • uzupełniłem czestotliwości

i dałem design. potem eksport i samo mi to wyszło

0

W fdatool wybierz Edit a potem Convert to single section. Będzie wyglądać normalnie ale filtr może być niestabilny po tej operacji, uważaj na to.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0