CODE
const int NL[MWSPT_NSEC] = { 1,3,1 };
const int16_T NUM[MWSPT_NSEC][3] = {
{
303, 0, 0
},
{
16384, 0, -16384
},
{
16384, 0, 0
}
};
const int DL[MWSPT_NSEC] = { 1,3,1 };
const int16_T DEN[MWSPT_NSEC][3] = {
{
16384, 0, 0
},
{
16384, -32152, 15778
},
{
16384, 0, 0
}
};
const int16_T NUM[MWSPT_NSEC][3] = {
{
303, 0, 0
},
{
16384, 0, -16384
},
{
16384, 0, 0
}
};
const int DL[MWSPT_NSEC] = { 1,3,1 };
const int16_T DEN[MWSPT_NSEC][3] = {
{
16384, 0, 0
},
{
16384, -32152, 15778
},
{
16384, 0, 0
}
};
Написал функцию(точнее класс, но не важно):
Код
class BiquadSection
{
public:
BiquadSection(){ W1 = 0; W2 = 0; }
int operator << (int x0)
{
x0 *= 303;
int W = x0 - ( -32152 * W1 + 15778 * W2 );
W /= 16384;
int ret = W - W2;
W2 = W1;
W1 = W;
return ret;
}
protected:
int W1, W2;
};
{
public:
BiquadSection(){ W1 = 0; W2 = 0; }
int operator << (int x0)
{
x0 *= 303;
int W = x0 - ( -32152 * W1 + 15778 * W2 );
W /= 16384;
int ret = W - W2;
W2 = W1;
W1 = W;
return ret;
}
protected:
int W1, W2;
};
Фильтр работает, но результат получается немного "квадратным"(рисунок). Такой же фильтр но в первой форме(direct form I) работает отлично(без видимых искажений). Где у меня косяк в вычислениях?
На скриншоте верхня синусоида это исходный сигнал, а нижняя фильтрованный. Апмлитуда исходного 460 единиц. Фильтр убирает постоянную составляющую.