#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;
}
C++数字滤波器实现:一阶、二阶及级联滤波器

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

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