zoukankan      html  css  js  c++  java
  • 《DSP using MATLAB》Problem 8.34

            今天下了小雨,空气中泛起潮湿的味道,阴冷的感觉袭来,心情受到小小影响。

    代码:

            hp2lpfre子函数

    function [wpLP, wsLP, alpha] = hp2lpfre(wphp, wshp)
    % Band-edge frequency conversion from highpass to lowpass digital filter
    % -------------------------------------------------------------------------
    % [wpLP, wsLP, alpha] = hp2lpfre(wphp, wshp) 
    %   wpLP = passband edge for the lowpass digital prototype 
    %   wsLP = stopband edge for the lowpass digital prototype 
    %  alpha = lowpass to highpass transformation parameter
    %   wphp = passband edge frequency for the highpass
    %   wshp = stopband edge frequency for the highpass
    %
    %
    if wphp <= 0 
    	error('Passband edge must be larger than 0.')
    end
    
    if wshp >= wphp
    	error('Stopband edge must be smaller then Passband edge')
    end
    
    % Determine the digital lowpass cutoff frequencies:
    wpLP = 0.2*pi;
    alpha = -(cos((wpLP + wphp)/2))/(cos((wpLP - wphp)/2));
    wsLP = angle(-(exp(-j*wshp)+alpha)/(1+alpha*exp(-j*wshp)));
    

      dhpfd_bl子函数

    function [b, a] = dhpfd_bl(type, wp, ws, Rp, As)
    % IIR Highpass Filter Design using bilinear transformation
    % -----------------------------------------------------------------------
    % [b, a] = dhpfd_bl(type, wp, ws, Rp, As);
    %   type = 'butter' or 'cheby1' or 'cheby2' or 'ellip'   
    %      b = numerator polynomial coefficients of highpass filter , Direct form
    %      a = denominator polynomial coefficients of highpass filter, Direct form
    %     wp = Passband edge frequency in radians;
    %     ws = Stopband edge frequency in radians (wp < ws);
    %     Rp = Passband ripple in +dB; Rp > 0
    %     As = Stopband attenuation in +dB; As > 0
    %
    %
    if isempty(type)
        str = 'butter';
    end
    
    switch type
        case 'butter'
        	[b , a] = butthpf(wp, ws, Rp, As); break;
        case 'cheby1'
        	[b , a] = cheb1hpf(wp, ws, Rp, As); break;
        case 'cheby2'
        	[b , a] = cheb2hpf(wp, ws, Rp, As); break;
        case 'ellip'
        	[b , a] = eliphpf(wp, ws, Rp, As); break;
        otherwise
            disp('Oh, input may be error!
    ');
    end
    

      

    %% ------------------------------------------------------------------------
    %%            Output Info about this m-file
    fprintf('
    ***********************************************************
    ');
    fprintf('        <DSP using MATLAB> Problem 8.34 
    
    ');
    
    banner();
    %% ------------------------------------------------------------------------
    
    % Digital Highpass Filter Specifications:
    wphp = 0.6*pi;                 % digital passband freq in rad
    wshp = 0.4586*pi;              % digital stopband freq in rad
    Rp = 1;                      % passband ripple in dB
    As = 15;                     % stopband attenuation in dB
    
    %[bhp, ahp] = butthpf(wphp, wshp, Rp, As)
    [bhp, ahp] = cheb1hpf(wphp, wshp, Rp, As)
    %[bhp, ahp] = cheb2hpf(wphp, wshp, Rp, As)
    %[bhp, ahp] = eliphpf(wphp, wshp, Rp, As)
    [C, B, A] = dir2cas(bhp, ahp);
    
    % Calculation of Frequency Response:
    %[dblp, maglp, phalp, grdlp, wwlp] = freqz_m(blp, alp);
    [dbhp, maghp, phahp, grdhp, wwhp] = freqz_m(bhp, ahp);
    
    delta_w = 2*pi/1000;
    Rp_hp = -(min(dbhp(ceil(wphp/delta_w+1):1:501)));                       % Actual Passband Ripple
    
    fprintf('
    Actual Passband Ripple is %.4f dB.
    ', Rp_hp);
    
    As_hp = -round(max(dbhp(1:1:ceil(wshp/delta_w)+1)));                % Min Stopband attenuation
    fprintf('
    Min Stopband attenuation is %.4f dB.
    
    ', As_hp);
    
    
    %% -----------------------------------------------------------------
    %%                             Plot
    %% -----------------------------------------------------------------  
    
    figure('NumberTitle', 'off', 'Name', 'Problem 8.34 Chebyshev-1 Highpass')
    set(gcf,'Color','white'); 
    M = 2;                          % Omega max
    
    subplot(2,2,1); plot(wwhp/pi, maghp); axis([0, M, 0, 1.2]); grid on;
    xlabel('Digital frequency in pi units'); ylabel('|H|'); title('Highpass Filter Magnitude Response');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.4586, 0.6, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [0, 0.8913, 1]);
    
    subplot(2,2,2); plot(wwhp/pi, dbhp); axis([0, M, -100, 2]); grid on;
    xlabel('Digital frequency in pi units'); ylabel('Decibels'); title('Highpass Filter Magnitude in dB');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.4586, 0.6, 1.4, 1.5414, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [-80, -23, -10, -1, 0]);
    set(gca,'YTickLabelMode','manual','YTickLabel',['80'; '23'; '10';' 1';' 0']);
    
    
    subplot(2,2,3); plot(wwhp/pi, phahp/pi); axis([0, M, -1.1, 1.1]); grid on;
    xlabel('Digital frequency in pi nuits'); ylabel('radians in pi units'); title('Highpass Filter Phase Response');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.4586, 0.6, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [-1:1:1]);
    
    subplot(2,2,4); plot(wwhp/pi, grdhp); axis([0, M, 0, 15]); grid on;
    xlabel('Digital frequency in pi units'); ylabel('Samples'); title('Highpass Filter Group Delay');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.4586, 0.6, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [0:5:15]);
    
    
    
    % -----------------------------------------------------
    %                  method 2
    % -----------------------------------------------------
    % Digital lowpass Filter Specifications:
    [wpLP, wsLP, alpha] = hp2lpfre(wphp, wshp);
    
    prompt = 'Please input the type of digital lp filter: 
    
      butter or cheby1 or cheby2 or ellip [butter]: ';
    type = input(prompt , 's');
    
    [bhp, ahp] = dhpfd_bl(type, wphp, wshp, Rp, As)
    
    [C, B, A] = dir2cas(bhp, ahp)
    

      运行结果:

            cheb1hpf函数,得到Chebyshev-1型高通滤波器,系统函数直接形式的系数,阶数为4

            直接形式转换成串联形式,系数

            Chebyshev-1型高通滤波器,幅度谱、相位谱和群延迟响应

            最小阻带衰减达到23dB,满足15dB的设计要求。

  • 相关阅读:
    Verdi 看波形常用快捷操作
    Tensorflow系列——Saver的用法
    Verilog-分频器
    (原创)列主元Gauss消去法的通用程序
    冒泡排序算法
    ADC 与实际电压值的关系
    直流耦合 交流耦合 耦合
    当前不会命中断点,源代码与原始版本不同
    示波器触发
    在头文件#pragma comment(lib,"glaux.lib");编译器提示waring C4081: 应输入“newline“
  • 原文地址:https://www.cnblogs.com/ky027wh-sx/p/11657630.html
Copyright © 2011-2022 走看看