多级IIR滤波效果(BIQUAD),system verilog验证

发布于:2024-12-05 ⋅ 阅读:(114) ⋅ 点赞:(0)

MATLAB生成IIR系数

采用率1k,截止频率30hz,Matlab生成6阶对应的biquad3级系数
在这里插入图片描述

Verilog测试代码

// fs=1khz,fc=30hz
initial begin
    real Sig_Orig, Noise_white, Mix_sig;
    real fs = 1000;
    Int   T= 1;   //周期
    int   N= T*fs;    //1s的采样点数
    // 数组声明
    real Mix_sig_arr[1000];
    real Sig_0rig_arr[1000]; 
    real Sig_result_i_arr[1000];
    real Sig_result_i_arrl[1000]; 
    real Sig_result_i_arr2[1000];
    // 中间变量声明
    real Sig_result_i, Sig_result_ii, Sig_result_i2, Sig_result_i_end;
    // 滤波器系数矩阵声明
    real NUM[3][3] = {
        {1, 2.007504948495, 1.007523744426},
        {1, 1.999983159466, 1.000001892   }, 
        {1, 1.992511892039, 0.9925305617226}
    };
    real DEN[3][3] = {
        {1, -1.663488912079, 0.6934851906154},
        {1, -1.734725768632, 0.7660066007869},   
        {1, -1.873703886013, 0.9074907921583}
    };
    real gain = 0.0000004953522354214;
    #100;
    @(posedge rstn);
    // 循环处理2024个点
    for (int t = 0; t < N; t++) begin  
        @(posedge CLK_REG);
        // 生成原始信号(10Hz的正弦波)
        Sig_Orig = 0.5 * sin(2 * PI * 10 * (t / 1000.0)); // 
        Sig_0rig_arr[t] = Sig_Orig;  
        // 生成白噪声
        Noise_white = 0.25 * sin(2 * PI * 80 * (t / 1000.0)) +
                      0.15 * cos(2 * PI * 150 * (t / 1000.0)) +
                      0.05 * sin(2 * PI * 800 * (t / 1000.0) + 0.33 * PI);
        // 混合原始信号和白噪声
        Mix_sig = Sig_Orig + Noise_white;
        Mix_sig_arr[t] = Mix_sig;
        // 直接I型的IIR
        Sig_result_i = NUM[0][0] * Mix_sig_arr[t] +
                       NUM[0][1] * Mix_sig_arr[t-1] +
                       NUM[0][2] * Mix_sig_arr[t-2] -
                       DEN[0][1] * Sig_result_i_arr[t-1] -
                       DEN[0][2] * Sig_result_i_arr[t-2];
        Sig_result_i_arr[t] = Sig_result_i;
        Sig_result_il = NUM[1][0] * Sig_result_i_arr[t] +
                        NUM[1][1] * Sig_result_i_arr[t-1] +
                        NUM[1][2] * Sig_result_i_arr[t-2] -
                        DEN[1][1] * Sig_result_i_arrl[t-1] -
                        DEN[1][2] * Sig_result_i_arrl[t-2];
        Sig_result_i_arrl[t] = Sig_result_il;
        Sig_result_i2 = NUM[2][0] * Sig_result_i_arrl[t] +
                        NUM[2][1] * Sig_result_i_arrl[t-1] +
                        NUM[2][2] * Sig_result_i_arrl[t-2] -
                        DEN[2][1] * Sig_result_i_arr2[t-1] -
                        DEN[2][2] * Sig_result_i_arr2[t-2];
        Sig_result_i_arr2[t] = Sig_result_i2;
        // 计算最终结果并应用增益
        Sig_result_i_end = Sig_result_i2 * gain;
    end

多级biquad滤波器滤波效果

verdi波形,第一级还有明显的杂波,第二级后就基本还原了原始信号,每级滤波后都会有一定的相位滞后,最终增益后的幅值有细微放大(原始信号最大值500滤波后变为502.5)。
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到