#include 'stdafx.h' #include 'J:\信号处理与工程实践\xhclgcyy\x_math.cpp' #include 'J:\信号处理与工程实践\xhclgcyy\x_graph.cpp' double Y[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]=b0X[n]+b1X[n-1]+a0Y[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]=b0X[n]+b1X[n-1]+b2X[n-2]+a0Y[n-1]+a1Y[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(); ////////二阶//////// 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();

return 0;

}

手动验证一阶滤波器结果

根据代码中的 f1 函数,一阶滤波器的差分方程为:

$y[n]=0.4x[n]+0.2x[n-1]+0.6y[n-1]$

其中,$x[n]$ 为输入信号,$y[n]$ 为输出信号。

为了验证这个差分方程,可以手动计算一些样本点的输出值,然后与代码中的输出值进行比较。例如,对于输入序列 $X1=[0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]$,可以手动计算出前几个输出值:

$y[0]=0.4x[0]+0.2x[-1]+0.6y[-1]=0+0+0=0$

$y[1]=0.4x[1]+0.2x[0]+0.6y[0]=0.4+0+0=0.4$

$y[2]=0.4x[2]+0.2x[1]+0.6y[1]=0.4+0.2\times1+0.6\times0.4=0.68$

$y[3]=0.4x[3]+0.2x[2]+0.6y[2]=0.4+0.2\times1+0.6\times0.68=0.872$

然后,可以运行代码,查看输出结果是否与手动计算的结果一致。如果一致,就说明代码实现了正确的差分方程,也就验证了一阶滤波器的正确性。

C++ 代码实现数字滤波器:一阶和二阶滤波器验证

原文地址: https://www.cveoy.top/t/topic/jPdm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录