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/Filtr_o_niesko%C5%84czonej_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