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

    测试代码:

    %%****bin_hp.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 ] = lp2hp(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 = 100;
    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)');
    

      

     效果:

    滤波器特性:

    待滤波的信号:

    滤波后信号:

    ~不再更新,都不让我写公式,博客园太拉胯了
  • 相关阅读:
    魔术方法___toString()
    魔术方法__set()
    魔术方法__get()
    php面向对象之final关键字用法及实例
    php面向对象之什么是抽象类?及抽象类的作用
    php面向对象之对象克隆方法
    php面向对象之对象比较用法详解
    php面向对象之instanceof关键字的用法
    php表单怎么提交到数据库?
    php表单的验证详解
  • 原文地址:https://www.cnblogs.com/alimy/p/9178875.html
Copyright © 2011-2022 走看看