zoukankan      html  css  js  c++  java
  • 数字信号处理实验(六)——FIR滤波器的设计

    一、四种线性相位FIR滤波器的振幅响应

    1、自编函数

    [Hr,w,a,L]=hr_type1(h)(P256)  % h偶对称,N为奇数,h(n)=h(N-1-n)
    [Hr,w,a,L]=hr_type2(h) (P257) % h偶对称,N为偶数,h(n)=h(N-1-n)
    [Hr,w,a,L]=hr_type3(h) (P257) % h奇对称,N为奇数,h(n)=-h(N-1-n)
    [Hr,w,a,L]=hr_type4(h) (P257) % h奇对称,N为偶数,h(n)=-h(N-1-n)

    2、一个demo

    image

    clear all;close all;clc
    addpath(genpath(pwd)); % 添加当前文件夹下所有路径
    
    %% 
    % 题1. 线性相位 FIR 滤波器的特性:
    %% (2)已知滤波器的系统函数如下所示,用以上已编好的函数,确定滤波器的振
    % 幅响应Hr(w)以及零点位置:
    h1_n = [-4,1,-1,-2,5,6,5,-2,-1,1,-4];     % 偶对称,N=11
    h2_n = [-4,1,-1,-2,5,6,6,5,-2,-1,1,-4];   % 偶对称,N=12
    h3_n = [-4,1,-1,-2,5,0,-5,2,1,-1,4];      % 奇对称,N=11
    h4_n = [ -4,1,-1,-2,5,6,-6,-5,2,1,-1,4];  % 奇对称,N=12
    
    new_figure('线性相位FIR滤波器');
    subplot(2,2,1);
    [Hr,w]=hr_type1(h1_n);
    plot(w/pi, abs(Hr));
    title('第一类线性相位滤波器');
    xlabel('w/pi');
    
    subplot(2,2,2);
    [Hr,w]=hr_type2(h2_n);
    plot(w/pi, abs(Hr));
    title('第二类线性相位滤波器');
    xlabel('w/pi');
    
    subplot(2,2,3);
    [Hr,w]=hr_type3(h3_n);
    plot(w/pi, abs(Hr));
    title('第三类线性相位滤波器');
    xlabel('w/pi');
    
    subplot(2,2,4);
    [Hr,w]=hr_type4(h4_n);
    plot(w/pi, abs(Hr));
    title('第四类线性相位滤波器');
    xlabel('w/pi');

     

    二、窗函数法

    1、窗函数设计参考指标

    image

    2、窗函数设计方法一:

    (1)根据实际阻带衰减指标,来确定所使用的窗函数。Matlab提供了几个函数来实现这些窗函数。

       W=boxcar(N);            % 矩形窗         -21dB
       W=triang(N);            % 三角窗         -25dB
       W=hanning(N);           % 汉宁窗         -44dB
       W=hamming(N);           % 海明窗         -53dB
       W=blackman(N);          % 布莱克曼窗     -74dB
       W=kaiser(N,beta);       % 凯泽窗         -80dB

    (2)根据过渡带来计算出N值。

    例: 通带截止频率wp, 阻带截止频率ws,已知为汉宁窗:N=3.1*2*pi/(ws-wp);

     

    (3)求出理想的hd(n)。可使用ideal_lp(P185)来实现理想低通滤波器的冲激响应。

    例:由ideal_lp来实现理想带阻滤波器的冲激响应。

    hd=ideal_lp(wc1,N)+ideal_lp(pi,N)-ideal_lp(wc2,N);

     

    (4)求得所设计的FIR滤波器的单位抽样响应:

    h=hd.*w

     

    (5)一个demo:

    image

    clear all;
    wp=0.2*pi;
    Rp=0.25;
    ws=0.3*pi;
    As=50;
    
    wd = ws-wp;
    N = ceil(6.6*pi/wd);
    wn = (wp+ws)/2;
    
    %
    hd = ideal_lp(wn,N+1);
    w_ham=(hamming(N+1))';
    h = hd.*w_ham;
    figure(2)
    freqz(h,1,512)

     

     

    3、窗函数设计方法二:

    (1)根据实际阻带衰减指标,来确定所使用的窗函数。

    (2)根据过渡带来计算出N值。

    (3)利用Matlab所提供的函数fir1,来实现fir滤波器。

    h=fir1(N,wn,’ftype’,windows(N+1))
    
    ›对于高通滤波器和带阻滤波器,N必须为偶数,N+1为奇数
    
    ›‘ftype’指的是:’low’,’bandpass’,’high’,’stop’
    
    ›设计的滤波器为N阶

    (4)一个demo

    image

    %example6.2.3
    clear all;
    wp=0.2*pi;
    Rp=0.25;
    ws=0.3*pi;
    As=50;
    
    wd = ws-wp;
    N = ceil(6.6*pi/wd);
    wn = (wp+ws)/2;
    b=fir1(N,wn/pi,hamming(N+1));
    figure(1)
    freqz(b,1,512)

     

    三、频率抽样法:

    1、根据给定的N值和过渡点来求得Hd(k) 。

    2、利用DFT反变换求的所需的h(n)。

    h=real(ifft(H,N));

     

    image

    clear all;
    N=40;
    T1=0.5925;
    T2=0.1099;
    
    alpha=(N-1)/2;
    l=0:N-1;
    wl=(2*pi/N)*l;
    
    hrs=[zeros(1,5),T2,T1,ones(1,7),T1,T2,zeros(1,9),T2,T1,ones(1,7),T1,T2,zeros(1,4)];
    k1 = 0:floor((N/2-1));
    k2 = floor(N/2)+1:N-1;
    angh = [-alpha*(2*pi)/N*k1,0,alpha*(2*pi)/N*(N-k2)];
    H=hrs.*exp(j*angh);
    h=real(ifft(H,N));
    
    figure()
    freqz(h,1,512)
    [db,mag,pha,grd,w]=freqz_m(h,1);
    [hr,ww,a,L]=hr_type2(h);
    
    figure()
    subplot(2,2,1),stem(wl(1:21)/pi,hrs(1:21)),title('H(k)')
    subplot(2,2,2),stem(l,h),title('冲激响应')
    subplot(2,2,3),plot(ww/pi,hr);grid;title('幅度响应')
    subplot(2,2,4),plot(w/pi,db),axis([0,1,-80,10]),grid,title('幅频响应(db)')
  • 相关阅读:
    sabaki and leelazero
    apply current folder view to all folders
    string operation in powershell
    wirte function in powershell
    add environment path to powershell
    Module in powershell
    sql prompt
    vmware中鼠标在部分区域不能使用
    调整多个控件的dock的顺序
    行为型模型 策略模式
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/5095466.html
Copyright © 2011-2022 走看看