zoukankan      html  css  js  c++  java
  • [Matlab]双线性变换法设计数字低通滤波器

    测试代码:

    %%****bin_lp.m*******************%%
    %% 使用双线性变换法设计低通滤波器
    %% 2018年6月13日 14:27:37
    %% author:Alimy
    
    close all;
    clear;
    clc;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %代码正文
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %给定数字滤波器指标
    f_p     =   200     ;   %通带上截止频率
    f_st    =   210     ;   %阻带下截止频率
    R_p     =   3       ;   %通带允许的最大衰减
    R_st    =   30      ;   %阻带允许的最小衰减
    f_s     =   1000    ;   %采样频率
    T_s     =   1 / f_s ;   %采样间隔
    %1.将数字低通滤波器的频率参数变换为归一化的数字角频率参数
    omega_p  = 2 * pi * f_p  / f_s;
    omega_st = 2 * pi * f_st / f_s;
    %2.预畸变处理,将归一化数字角频率参数变换成模拟低通滤波器的角频率参数
    C = 2 / T_s ;
    Omega_p   = C * tan( omega_p  / 2 );
    Omega_st  = C * tan( omega_st / 2 ); 
    %3.对模拟低通滤波器的角频率参数做归一化处理
    lamda_p  = Omega_p  / Omega_p;
    lamda_st = Omega_st / Omega_p;
    %4.设计归一化模拟滤波器,得到归一化模拟低通滤波器的转移函数
    [ N , Wn ] = buttord( Omega_p , Omega_st , R_p , R_st , 's' ); %选择模拟巴特沃斯低通滤波器的最小阶数
    [ z , p , k ] = buttap(N); %创建巴特沃斯模拟低通滤波器
    [ Bp , Ap ] = zp2tf(z,p,k); %由零点、极点、增益确定传输函数的分子与分母系数
    %5.利用归一化模拟低通滤波器的转移函数确定模拟低通滤波器的转移函数
    [ b , a ] = lp2lp(Bp,Ap,Wn);
    %6.利用模拟低通滤波器的转移函数确定IIR数字滤波器的转移函数 
    [ bz , az ] = bilinear(b,a,f_s);
    
    figure(1);
    freqz(bz,az);
    title('低通滤波器幅度谱和相位谱特性');
    
    %滤波效果测试 
    N = 1000
    t = [ 0 : N - 1 ] * T_s ;
    f1 = 20;
    f2 = 250;
    f3 = 300;
    x1 = 2*1*sin( 2 * pi * f1 * t );
    x2 = 2*2*sin( 2 * pi * f2 * t );
    x3 = 2*1*sin( 2 * pi * f3 * t );
    x  = x1 + x2 + x3;
    
    fft_x = fft( x );
    X_mag = fftshift( abs   ( fft_x ) ) / N ;
    X_ang = fftshift( angle ( fft_x ) );
    delta_f = f_s/N;
    f = ( -N / 2 : N / 2 - 1 )*delta_f;
    
    figure(2);
    subplot(3,1,1);
    plot(t,x);
    title('原信号时域波形');
    xlabel('t(s)');
    subplot(3,1,2);
    plot( f , X_mag );
    title('原信号幅度谱');
    xlabel('f(hz)');
    subplot(3,1,3);
    plot( f , X_ang );
    title('原信号相位谱');
    xlabel('f(hz)');
    
    
    %滤波
    lp_x = filter( bz , az , x );
    lp_fft_x = fft( lp_x );
    lp_X_mag = fftshift( abs   ( lp_fft_x ) ) / N ;
    lp_X_ang = fftshift( angle ( lp_fft_x ) );
    figure(3);
    subplot(3,1,1);
    plot(t,lp_x);
    title('滤波后信号时域波形');
    xlabel('t(s)');
    subplot(3,1,2);
    plot( f , lp_X_mag );
    title('滤波后信号幅度谱');
    xlabel('f(hz)');
    subplot(3,1,3);
    plot( f , lp_X_ang );
    title('滤波后信号相位谱');
    xlabel('f(hz)');
    

      效果:

    滤波器特性:

    待滤波的信号:

    滤波后的信号:

    待解决的问题:

    f_p = 200 ; %通带上截止频率
    f_st = 210 ; %通带下截止频率

    改成

    f_p = 100 ; %通带上截止频率
    f_st = 110 ; %通带下截止频率

    发现滤波效果出了问题。

    设计得到的滤波器在通道有增益上波动,滤波后的时域信号体现出增大的效果,不明白哪里需要修改。

    ~不再更新,都不让我写公式,博客园太拉胯了
  • 相关阅读:
    Java牛角尖问题之static 静态变量和静态代码块的执行顺序
    蓝桥杯 蚂蚁爬楼梯 递归解最短路程问题
    动态规划系列题目学习
    使用Excel快速生成html表格
    C#使用out输出结果
    C#和sql语句中切割函数SUBSTRING的用法和区别
    C# 对DataTable进行操作
    自动生成表创建sql
    .net core获取根目录并转化字符串
    .net core从配置中读取数据并实例对象
  • 原文地址:https://www.cnblogs.com/alimy/p/9178149.html
Copyright © 2011-2022 走看看