• 04 IIR滤波器


    01实战原理

    IIR(Infinite Impulse Response)无限脉冲响应滤波器

    系统传递函数为:

     系统的差分方程可写为:

     IIR数字滤波器的基本结构及类型:

     直接I型

     直接II型

     级联型

     并联型

    02matlab实现

    利用matlab产生1khz和3khz的混频信号,并设计通带截止频率为1khz,经过iir滤波器后输出1khz波形。

    clear all
    close all
    clc
    
    %参数定义
    FS =44100; %Sample rate Frequncy
    fc = 1000; %1khz
    fe = 3000; %外部输入信号  3khz
    N = 1024;
    Q = 16;
    
    t =0:2*pi/FS:2*pi*N/FS;%时间序列
    
    %波形产生
    sin_osc =sin(t*fc+pi);
    sin_e =sin(t*fe);
    sin_add = sin_osc+sin_e;
    
    %IIR 滤波器系数(低通滤波器)
    [b a] = butter(3,fc/(FS/2),'low');
    %[b a] = butter(4,fc/(FS/2),'low');
    %[b a] = cheby2(7,60,fc/(FS/2));
    c = [b,a];
    b_16=round(c/max(abs(c))*(2^(Q-1)-1));
    %滤波器系数量化
    Mab =max(max(abs(a),abs(b)));
    %16bit 量化
    Qb = round((b/Mab)*(2^(Q-1)-1));
    Qa = round((a/Mab)*(2^(Q-1)-1));
    %%%%
    Qm =floor(log2(Mab/a(1)));
    if Qm<log2(Mab/a(1))
        Qm = Qm +1;
    end
    Qm = 2^Qm;
    Qb1=round(b/Qm*(2^(Q-1)-1));
    Qa1=round(a/Qm*(2^(Q-1)-1));
    
    display(Qb1);
    display(Qa1);
    
    %滤波(混频后)
    y = filter(Qb1,Qa1,sin_add);
    
    f_osc =fft(sin_osc,N);
    f_osc=20*log(abs(f_osc))/log(10);        %换算成dBW单位
    ft=[0:(FS/N):FS/2];              %转换横坐标以Hz为单位
    f_osc=f_osc(1:length(ft));
    
    f_e =fft(sin_e,N);
    f_e=20*log(abs(f_e))/log(10);        %换算成dBW单位
    f_e=f_e(1:length(ft));
    
    f_add =fft(sin_add,N);
    f_add=20*log(abs(f_add))/log(10);        %换算成dBW单位
    f_add=f_add(1:length(ft));
    
    y_f =fft(y,N);
    y_f=20*log(abs(y_f))/log(10);        %换算成dBW单位
    y_f=y_f(1:length(ft));
    
    delta=[1 zeros(1,N-1)]; %生成长度为L的单位抽样序列
    Fb=filter(b,a,delta); %filter函数获取单位抽样响应
    
    [h,f]=freqz(b,a,N,FS);       %freqz函数求频率响应
    mag=20*log(abs(h))/log(10);  %幅度转换成dB单位  
    
    %绘图
    %时域波形图
    figure(1),
    hold on
    subplot(221),plot(t(1:128),sin_osc(1:128),'-');
    legend('sin 1khz');title('sin 1khz');
    subplot(222),plot(t(1:128),sin_e(1:128),'-');
    legend('sin 3khz');title('sin 3khz');
    subplot(223),plot(t(1:128),sin_add(1:128),'-');
    legend('sin 1khz add 3khz');title('sin 1khz add 3khz');
    subplot(224),plot(t(1:128),y(1:128),'-');
    legend('LPF 结果');title('LPF 结果');
    grid;
    hold off
    
    %频域波形
    figure(2),
    hold on
    subplot(221);plot(ft,f_osc);
    xlabel('频率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8);
    title('信号频谱图 2KHZ','fontsize',8);legend('sinosc');
    subplot(222);plot(ft,f_e);
    xlabel('频率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8);
    title('信号频谱图3KHZ','fontsize',8);legend('sine');
    subplot(223);plot(ft,f_add);
    xlabel('频率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8);
    title('信号频谱图2KHZ 和 3KHZ','fontsize',8);legend('sin add');
    subplot(224);plot(ft,y_f);
    xlabel('频率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8);
    title('信号频谱图滤波后','fontsize',8);legend('LPF结果');
    hold off
    
    %幅频响应
    figure(3);
    subplot(211);stem(Fb);
    title('Fb单位抽样响应','fontsize',8);
    subplot(212);plot(f,mag);
    xlabel('频率(Hz)','fontsize',8);
    ylabel('幅度(dB)','fontsize',8);
    title('freqz()幅频响应','fontsize',8);

     

     

    matlab时域波形

     

     

    matlab频域波形

     

     IIR幅频响应分析

    03fpga实现

    设计就要达到把1khz+3khz混合的信号过滤掉3khz,然后剩下1khz并显示出来。

    04fpga仿真

    仿真的时候需要提前准备好这几个.dat格式的数据文件,但是不知道怎么生成的。。

    这次点击tb_fir添加波形:

     

     为了看到光滑的波形,这里设置为2的28次方-1:

     

     

  • 相关阅读:
    Eclipse下载
    RTT之AT命令组件
    RTT之shell
    RTT之内存管理及异常中断
    单片机的图形UI
    RTT学习
    RTT学习之线程管理
    C++学习笔记:
    运放
    关于KEIL下的图形化显示和输出问题
  • 原文地址:https://www.cnblogs.com/FPGAer/p/14270163.html
Copyright © 2020-2023  润新知