C++数字滤波器实现:一阶、二阶及级联滤波器
#include 'stdafx.h'
#include'J:\信号处理与工程实践\xhclgcyy\x_math.cpp'
#include'J:\信号处理与工程实践\xhclgcyy\x_graph.cpp'
double Y[40], Z[40];
void plotgri2(COLORREF gridcolor, COLORREF linecolor, double p[], int N) // 用来画矩形框
{
int i;
HPEN pen1 = CreatePen(PS_SOLID, 1, gridcolor), oldpen = (HPEN)SelectObject(win3.hdc, pen1);
HPEN pen2 = CreatePen(PS_SOLID, 1, linecolor);
for (i = 0; i < N; i++) line2(i, 0, i, p[i]);
SelectObject(win2.hdc, pen2);
moveto2(0, p[0]);
SelectObject(win2.hdc, oldpen);
DeleteObject(pen1);
for (i = 0; i < N; i++) lineto2(i, p[i]);
DeleteObject(pen2);
}
void f1(double a0, double b0, double b1, double X[], int N) // 通用一阶数字滤波器函数工具
{
int n;
for (n = 0; n < N; n++)
Y[n] = 0;
for (n = 0; n < N; n++)
Y[n] = b0 * X[n] + b1 * X[n - 1] + a0 * Y[n - 1];
}
void f2(double a0, double a1, double b0, double b1, double b2, double X[], int N) // 通用二阶数字滤波器函数工具
{
int n;
for (n = 0; n < N; n++)
Y[n] = 0;
for (n = 0; n < N; n++)
Y[n] = b0 * X[n] + b1 * X[n - 1] + b2 * X[n - 2] + a0 * Y[n - 1] + a1 * Y[n - 2];
}
int main(int argc, char* argv[])
{
int i, n;
double X1[40], X4[40];
//////// 矩形序列 ////////
X1[-1] = 0;
for (i = 0; i < 12; i++) { X1[i] = 1; }
for (i = 12; i < 38; i++) { X1[i] = 0; }
window2(L'X1', -10, -1, 30, 5, 'x', 'y');
xy2(BLUE);
plotgri2(GREEN, BLUE, X1, 30);
_getch();
// 一阶滤波器
f1(0.4, 1, 0.2, X1, 40);
plotgri2(GREEN, RED, Y, 30);
_getch();
//////// 一阶级联滤波器 ////////
for (i = 0; i < 40; i++)
Z[i] = Y[i];
f1(0.4, 1, 0.2, Z, 40);
plotgri2(GREEN, YELLOW, Z, 30);
_getch();
//////// 二阶滤波器 ////////
X4[0] = 1;
for (i = -19; i < 0; i++) { X4[i] = 0; }
for (i = 1; i < 40; i++) { X4[i] = 0; }
window2(L'X4', -1, -2, 20, 5, 'x', 'y');
xy2(BLUE);
plotgri2(GREEN, BLUE, X4, 30);
_getch();
f2(1.5, -0.5, 0, 1, 0, X4, 40);
plotgri2(RED, BLUE, Y, 30);
_getch();
//////// 一阶级联 + 二阶 ////////
for (i = 0; i < 40; i++)
Z[i] = Y[i];
f1(0.4, 1, 0.2, Z, 40);
f2(1.5, -0.5, 0, 1, 0, Y, 40);
window2(L'X5', -1, -2, 20, 5, 'x', 'y');
xy2(BLUE);
plotgri2(GREEN, BLUE, X4, 30); // 显示原始信号
_getch();
plotgri2(GREEN, YELLOW, Z, 30); // 显示一阶级联滤波器输出
_getch();
plotgri2(RED, BLUE, Y, 30); // 显示二阶滤波器输出
_getch();
return 0;
}
原文地址: https://www.cveoy.top/t/topic/jPiI 著作权归作者所有。请勿转载和采集!