C++数字滤波器实现:一阶、二阶与级联滤波器

这篇文章展示了如何使用C++实现基本数字滤波器,包括一阶、二阶和级联滤波器。

代码示例

#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]=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];
}

void f3(double a0, double b0, double b1, double a1, double X[], int N) //级联两个一阶滤波器,组成二阶滤波器
{
    int n;
    double Y1[40];
    for(n=0;n<N;n++)
        Y[n]=0; 
    for(n=0;n<N;n++)
        Y1[n]=b0*X[n]+b1*X[n-1]+a0*Y[n-1];
    for(n=0;n<N;n++)
        Y[n]=b0*Y1[n]+a1*Y[n-1];
}

int main(int argc, char* argv[])
{
    int i,n;
    double X1[40],X4[40], X2[40], impulse[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();
    ////////////级联//////////////
    for(i=0;i<40;i++){X2[i]=0;}
    f1(0.4,1,0.2,X4,40);
    f1(0.4,1,0.2,Y,40);
    for(i=0;i<40;i++){X2[i]=Y[i];}
    window2(L'级联滤波图像',-1,-2,20,5,'x','y');
    xy2(BLUE);
    plotgri2(GREEN,BLUE,X2,30);
    _getch();
    f2(1.5,-0.5,0,1,0,X2,40);
    plotgri2(RED,BLUE,Y,30);
    _getch();
    ////////////单位冲激//////////////
    for(i=0;i<40;i++){impulse[i]=0;}
    impulse[0]=1;
    window2(L'单位冲激响应图像',-1,-2,20,5,'x','y');
    xy2(BLUE);
    plotgri2(GREEN,BLUE,impulse,30);
    _getch();
    ////////////级联后的滤波器响应//////////////
    f3(0.4, 1, 0.2, -0.5, impulse, 40);
    plotgri2(RED,BLUE,Y,30);
    _getch();

    return 0;
}

代码说明

  • plotgri2 函数用于绘制图形,包括网格线和数据曲线。
  • f1 函数实现了一个通用的一阶数字滤波器。
  • f2 函数实现了一个通用的二阶数字滤波器。
  • f3 函数通过级联两个 f1 函数实现了一个二阶滤波器。
  • main 函数定义了输入信号,并调用滤波器函数进行滤波,最后使用 plotgri2 函数绘制滤波结果。

总结

这篇文章介绍了如何使用 C++ 实现三种常见的数字滤波器,并提供了详细的代码示例。您可以根据自己的需要修改和扩展这些代码,以实现更复杂的滤波器和信号处理应用程序。

C++数字滤波器实现:一阶、二阶与级联滤波器

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

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