数字信号处理:一阶数字滤波器级联与通用二阶滤波器比较
#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]+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]=b0X[n]+b1X[n-1]+b2X[n-2]+a0Y[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();
////////////级联一阶数字滤波器得到二阶数字滤波器////////////
double a0 = 0.64, b0 = 0.8, b1 = 0.16;
double a1 = -0.3, b2 = 0.2;
double X2[40];
for(i=0;i<40;i++){X2[i]=X1[i];}
f1(a0,b0,b1,X2,40);
f1(a0,b0,b1,Y,40);
f1(a1,1,b2,Y,40);
window2(L"X2",-10,-1,30,5,"x","y");
xy2(BLUE);
plotgri2(GREEN,BLUE,X2,30);
_getch();
plotgri2(RED,BLUE,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;
}
原文地址: https://www.cveoy.top/t/topic/jPjJ 著作权归作者所有。请勿转载和采集!