zoukankan      html  css  js  c++  java
  • 使用MATLAB设计FIR滤波器

    1.      采用fir1函数设计,fir1函数可以设计低通、带通、高通、带阻等多种类型的具有严格线性相位特性的FIR滤波器。语法形式:

    b = fir1(n, wn)

    b = fir1(n, wn, ‘ftype’)

    b = fir1(n, wn, ‘ftype’, window)

    b = fir1(n, wn, ‘ftype’, window, ‘noscale’)

    参数的意义及作用:

    • b:返回的FIR滤波器单位脉冲响应,脉冲响应为偶对称,长度为n+1;
    • n:滤波器的介数;
    • wn:滤波器的截止频率,取值范围为0<wn<1,1对应信号采样频率一半。如果wn是单个数值,且ftype参数为low,则表示设计截止频率为wn的低通滤波器,如果ftype参数为high,则表示设计截止频率为wn的高通滤波器;如果wn是有两个数组成的向量[wn1 wn2],ftype为stop,则表示设计带阻滤波器,ftype为bandpass,则表示设计带通滤波器;如果wn是由多个数组成的向量,则根据ftype的值设计多个通带或阻带范围的滤波器,ftype为DC-1,表示设计的第一个频带为通带,ftype为DC-0,表示设计的第一个频带为阻带;
    • window:指定使用的窗函数,默认为海明窗;
    • noscale:指定是否归一化滤波器的幅度。

    示例:

    N=41;      %滤波器长度

    fs=2000;   %采样频率

    %各种滤波器的特征频率

    fc_lpf=200;

    fc_hpf=200;

    fp_bandpass=[200 400];

    fc_stop=[200 400];

    %以采样频率的一半,对频率进行归一化处理

    wn_lpf=fc_lpf*2/fs;

    wn_hpf=fc_hpf*2/fs;

    wn_bandpass=fp_bandpass*2/fs;

    wn_stop=fc_stop*2/fs;

    %采用fir1函数设计FIR滤波器

    b_lpf=fir1(N-1,wn_lpf);

    b_hpf=fir1(N-1,wn_hpf,'high');

    b_bandpass=fir1(N-1,wn_bandpass,'bandpass');

    b_stop=fir1(N-1,wn_stop,'stop');

    %求滤波器的幅频响应

    m_lpf=20*log(abs(fft(b_lpf)))/log(10);

    m_hpf=20*log(abs(fft(b_hpf)))/log(10);

    m_bandpass=20*log(abs(fft(b_bandpass)))/log(10);

    m_stop=20*log(abs(fft(b_stop)))/log(10);

    %设置幅频响应的横坐标单位为Hz

    x_f=0:(fs/length(m_lpf)):fs/2; 

    %绘制单位脉冲响应

    subplot(421);stem(b_lpf);xlabel('n');ylabel('h(n)');

    subplot(423);stem(b_hpf);xlabel('n');ylabel('h(n)');

    subplot(425);stem(b_bandpass);xlabel('n');ylabel('h(n)');

    subplot(427);stem(b_stop);xlabel('n');ylabel('h(n)');

    %绘制幅频响应曲线

    subplot(422);plot(x_f,m_lpf(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);

    subplot(424);plot(x_f,m_hpf(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);

    subplot(426);plot(x_f,m_bandpass(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);

    subplot(428);plot(x_f,m_stop(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);

     

    2.      采用fir2函数设计,函数算法是:首先根据要求的幅频响应向量形式进行插值,然后进行傅里叶变换得到理想滤波器的单位脉冲响应,最后利用窗函数对理想滤波器的单位脉冲响应激进型截断处理,由此得到FIR滤波器系数。fir2函数的语法形式:

    b = fir2(n, f, m)

    b = fir2(n, f, m, window)

    b = fir2(n, f, m, npt)

    b = fir2(n, f, m, npt, window)

    b = fir2(n, f, m, npt, lap)

    b = fir2(n, f, m, npt, lap, window)

    各项参数的意义及作用:

    • n及b:滤波器的介数,返回值b为滤波器系数,长度为n+1。注意:当设计的滤波器在归一化频率为1处的幅度值不为0时,n不能为奇数;
    • f及m:f取值在0~1之间,对应为滤波器的归一化频率;m是长度与f相同的向量,用于设置对应频段范围内的理想幅值;
    • window:用于指定窗函数的种类,默认是海明窗;
    • npt:正整数,用于指定对幅度响应进行插值时的插值点个数,默认是512;
    • lap:正整数,用于指定对幅度响应进行插值时,对于不连续点转变成连续时的点数,默认25

    示例:

    N=120;                  %滤波器阶数

    fc=[0 0.125 0.125 0.25 0.25 0.5 0.5 1];   %截止频率

    mag=[1 1 0.5 0.5 0.25 0.25 0.125 0.125 ]; %理想滤波器幅度

    b=fir2(N,fc,mag);      %设计海明窗滤波器

    freqz(b);              %绘制频率响应曲线

     

     

    3.      采用kaiserord函数设计,凯塞窗具有可调参数选项,可根据相关算法,先选择过渡带、容限参数,并根据这些参数计算出凯塞窗的值,以及滤波器阶数,语法形式:

    [n, wn, beta, filtype] = kaiserord(f, a, dev, fs)

    各项参数的意义和作用:

    • f及fs:如果f是一个向量,则其中的元素是待设计的过渡带的起始点和结束点;如果没有fs参数,f中元素的取值范围是0~1,即相对于采样频率一半的归一化频率;如果有fs参数,则fs为信号采样频率,f中元素即为实际的截止频率;
    • a:是一个向量,用于指定过渡带频率段的理想幅度值;
    • dev:是一个向量,用于指定通带或阻带内的容许误差;
    • n:设计的最小阶数;
    • wn:向量,计算得到的滤波器截止频率点;
    • beta:计算得到的值;
    • ftype:根据设计要求得到的滤波器类型参数

    4.      采用firpm函数设计,采用最大误差最小准则进行滤波器设计,语法形式:

    b = firpm(n, f, a)

    b = firpm(n, f, a,w)

    b = firpm(n, f, a,’ftype’)

    b = firpm(n, f, a, w, ‘ftype’)

    [b, delta] = firpm(…)

    各项参数的意义及作用:

    • n及b:滤波器阶数;
    • f及a:两个长度相同向量,f取值0~1之间,对应滤波器的归一化频率,a用于设置对应频段范围内的理想幅值;
    • w:长度为f的一半,实现对应频段幅度值的权值;
    • ftype:指定滤波器结构类型,如果没有设置该参数,表示设计偶对称脉冲响应滤波器;如果设置为hilbert,则表示设计奇对称结构的滤波器,具有相移特性;
    • delta:返回滤波器最大容限值

    示例:

           利用凯塞窗函数设计低通FIR滤波器,过渡带为1000~1500Hz,采样频率为8000Hz,通带容限最大为0.01,阻带容限最大为0.05.利用海明窗及firpm函数设计相同的低通滤波器,截止频率为1500Hz,滤波器阶数为凯塞窗函数求取的值。

    fs=8000;         %采样频率

    fc=[1000 1500];  %过渡带

    mag=[1 0];       %窗函数的理想滤波器幅度

    dev=[0.01 0.05]; %纹波

    [n,wn,beta,ftype]=kaiserord(fc,mag,dev,fs);  %获取凯塞窗参数

    fpm=[0 fc(1)*2/fs fc(2)*2/fs 1];  %firpm函数的频段向量

    magpm=[1 1 0 0];                  %firpm函数的幅值向量

    %设计凯塞窗及海明窗滤波器

    h_kaiser=fir1(n,wn,ftype,kaiser(n+1,beta));

    h_hamm=fir1(n,fc(2)*2/fs);

    %设计最优滤波器

    h_pm=firpm(n,fpm,magpm);

    %求滤波器的幅频响应

    m_kaiser=20*log(abs(fft(h_kaiser,1024)))/log(10);

    m_hamm=20*log(abs(fft(h_hamm,1024)))/log(10);

    m_pm=20*log(abs(fft(h_pm,1024)))/log(10);

    %设置幅频响应的横坐标单位为Hz

    x_f=[0:(fs/length(m_kaiser)):fs/2];

    %只显示正频率部分的幅频响应

    m1=m_kaiser(1:length(x_f));

    m2=m_hamm(1:length(x_f));

    m3=m_pm(1:length(x_f));

    %绘制幅频响应曲线

    plot(x_f,m1,'-',x_f,m2,'-.',x_f,m3,'--');

    xlabel('频率(Hz)');ylabel('幅度(dB)');

    legend('凯塞窗','海明窗','最优滤波器');

    grid;

     

  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/xuexizhe/p/9215290.html
Copyright © 2011-2022 走看看