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

    代码:

    function [wpLP, wsLP, alpha] = bs2lpfre(wpbs, wsbs)
    % Band-edge frequency conversion from bandstop to lowpass digital filter
    % -------------------------------------------------------------------------
    % [wpLP, wsLP, alpha] = bs2lpfre(wpbs, wsbs) 
    %   wpLP = passband edge for the lowpass digital prototype 
    %   wsLP = stopband edge for the lowpass digital prototype 
    %  alpha = lowpass to bandstop transformation parameter
    %   wpbs = passband edge frequency array [wp_lower, wp_upper] for the bandstop
    %   wsbs = stopband edge frequency array [ws_lower, ws_upper] for the bandstop
    %
    %
    
    % Determine the digital lowpass cutoff frequencies:
    wpLP = 0.2*pi;
         K = tan((wpbs(2)-wpbs(1))/2)*tan(wpLP/2);
      beta = cos((wpbs(2)+wpbs(1))/2)/cos((wpbs(2)-wpbs(1))/2);
    alpha1 = -2*beta*K/(K+1);
    alpha2 = (1-K)/(K+1);
    
    alpha = [alpha1, alpha2];
    
    wsLP = -angle((exp(-2*j*wsbs(1))+alpha1*exp(-j*wsbs(1))+alpha2)/(alpha2*exp(-2*j*wsbs(1))+alpha1*exp(-j*wsbs(1))+1))
    wsLP = angle((exp(-2*j*wsbs(2))+alpha1*exp(-j*wsbs(2))+alpha2)/(alpha2*exp(-2*j*wsbs(2))+alpha1*exp(-j*wsbs(2))+1))
    

      

    function [b, a] = cheb1bsf(wpbs, wsbs, Rp, As)
    % IIR bandstop Filter Design using Chebyshev-1 Prototype
    % -----------------------------------------------------------------------
    % [b, a] = cheb1bsf(wp, ws, Rp, As);
    %      b = numerator polynomial coefficients of bandstop filter, Direct form
    %      a = denominator polynomial coefficients of bandstop filter, Direct form
    %     wp = Passband edge frequency array [wp_lower, wp_upper] in radians;
    %     ws = Stopband edge frequency array [ws_lower, ws_upper] in radians;
    %     Rp = Passband ripple in +dB; Rp > 0
    %     As = Stopband attenuation in +dB; As > 0
    %
    %
    % Determine the digital lowpass cutoff frequencies:
    wpLP = 0.2*pi;
         K = tan((wpbs(2)-wpbs(1))/2)*tan(wpLP/2);
      beta = cos((wpbs(2)+wpbs(1))/2)/cos((wpbs(2)-wpbs(1))/2);
    alpha1 = -2*beta*K/(K+1);
    alpha2 = (1-K)/(K+1);
    
    alpha = [alpha1, alpha2];
    
    wsLP = -angle((exp(-2*j*wsbs(1))+alpha1*exp(-j*wsbs(1))+alpha2)/(alpha2*exp(-2*j*wsbs(1))+alpha1*exp(-j*wsbs(1))+1))
    wsLP = angle((exp(-2*j*wsbs(2))+alpha1*exp(-j*wsbs(2))+alpha2)/(alpha2*exp(-2*j*wsbs(2))+alpha1*exp(-j*wsbs(2))+1))
    
    % Compute Analog Lowpass Prototype Specifications: Inverse Mapping for frequencies
    T = 1; Fs = 1/T;                    % set T = 1
    OmegaP = (2/T)*tan(wpLP/2);         % Prewarp(Cutoff) prototype passband freq
    OmegaS = (2/T)*tan(wsLP/2);         % Prewarp(cutoff) prototype stopband freq
    
    % Design Analog Chebyshev-1 Prototype Lowpass Filter:
    [cs, ds] = afd_chb1(OmegaP, OmegaS, Rp, As);
    
    % Bilinear transformation to obtain digital lowpass:
    [blp, alp] = bilinear(cs, ds, Fs);
    
    % Transform digital lowpass into bandstop filter
    Nz = [alpha2, alpha1, 1]; Dz = [1, alpha1, alpha2];
    [b, a] = zmapping(blp, alp, Nz, Dz);
    

      

    %% ------------------------------------------------------------------------
    %%            Output Info about this m-file
    fprintf('
    ***********************************************************
    ');
    fprintf('        <DSP using MATLAB> Problem 8.40.2 
    
    ');
    
    banner();
    %% ------------------------------------------------------------------------
    
    % Digital Filter Specifications:   Chebyshev-1 bandstop
    wsbs = [0.35*pi 0.65*pi];             % digital stopband freq in rad
    wpbs = [0.25*pi 0.75*pi];             % digital passband freq in rad
    
    delta1 = 0.05;                      % passband tolerance, absolute specs 
    delta2 = 0.01;                      % stopband tolerance, absolute specs
    
    Rp = -20 * log10( (1-delta1)/(1+delta1))    % passband ripple in dB
    As = -20 * log10( delta2 / (1+delta1))      % stopband attenuation in dB                       
    
    Ripple = 10 ^ (-Rp/20)           % passband ripple in absolute
    Attn = 10 ^ (-As/20)             % stopband attenuation in absolute
    
    % --------------------------------------------------------
    %         method 1:  cheb1bsf function
    % --------------------------------------------------------
    fprintf('
    *******Digital bandstop, Coefficients of DIRECT-form***********
    ');
    [bbs, abs] = cheb1bsf(wpbs, wsbs, Rp, As)
    [C, B, A] = dir2cas(bbs, abs)
    
    
    % Calculation of Frequency Response:
    
    [dbbs, magbs, phabs, grdbs, wwbs] = freqz_m(bbs, abs);
    
    % ---------------------------------------------------------------
    %    find Actual Passband Ripple and Min Stopband attenuation
    % ---------------------------------------------------------------
    delta_w = 2*pi/1000;
    Rp_bs = -(min(dbbs( 1:1:ceil(wpbs(1)/delta_w+1) )));    % Actual Passband Ripple
    
    fprintf('
    Actual Passband Ripple is %.4f dB.
    ', Rp_bs);
    
    As_bs = -round(max(dbbs(ceil(wsbs(1)/delta_w)+1:1:ceil(wsbs(2)/delta_w)+1)));        % Min Stopband attenuation
    fprintf('
    Min Stopband attenuation is %.4f dB.
    
    ', As_bs);
    
    
    %% -----------------------------------------------------------------
    %%                             Plot
    %% -----------------------------------------------------------------  
    
    figure('NumberTitle', 'off', 'Name', 'Problem 8.40.2 Chebyshev-1 bs by cheb1bsf function')
    set(gcf,'Color','white'); 
    M = 1;                          % Omega max
    
    subplot(2,2,1); plot(wwbs/pi, magbs); axis([0, M, 0, 1.2]); grid on;
    xlabel('Digital frequency in pi units'); ylabel('|H|'); title('Magnitude Response');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.25, 0.35, 0.65, 0.75, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [0, 0.01, 0.9048, 1]);
    
    subplot(2,2,2); plot(wwbs/pi, dbbs); axis([0, M, -100, 2]); grid on;
    xlabel('Digital frequency in pi units'); ylabel('Decibels'); title('Magnitude in dB');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.25, 0.35, 0.65, 0.75, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [-80, -44, -1, 0]);
    set(gca,'YTickLabelMode','manual','YTickLabel',['80'; '44';'1 ';' 0']);
    
    
    subplot(2,2,3); plot(wwbs/pi, phabs/pi); axis([0, M, -1.1, 1.1]); grid on;
    xlabel('Digital frequency in pi nuits'); ylabel('radians in pi units'); title('Phase Response');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.25, 0.35, 0.65, 0.75, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [-1:0.5:1]);
    
    subplot(2,2,4); plot(wwbs/pi, grdbs); axis([0, M, 0, 30]); grid on;
    xlabel('Digital frequency in pi units'); ylabel('Samples'); title('Group Delay');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.25, 0.35, 0.65, 0.75, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [0:10:30]);
    
    
    figure('NumberTitle', 'off', 'Name', 'Problem 8.40.2 Pole-Zero Plot')
    set(gcf,'Color','white'); 
    zplane(bbs, abs); 
    title(sprintf('Pole-Zero Plot'));
    %pzplotz(b,a);
    
    
    
    
    
    % --------------------------------------------------------------------------------
    %           cheby1 function
    % --------------------------------------------------------------------------------
    % Calculation of Chebyshev-1 filter parameters:
    [N, wn] = cheb1ord(wpbs/pi, wsbs/pi, Rp, As);
    
    fprintf('
      ********* Chebyshev-1 Digital Bandstop Filter Order is = %3.0f 
    ', 2*N)
    
    % Digital Chebyshev-1 bandstop Filter Design:
    [bbs, abs] = cheby1(N, Rp, wn, 'stop');
    
    [C, B, A] = dir2cas(bbs, abs)
    
    % Calculation of Frequency Response:
    [dbbs, magbs, phabs, grdbs, wwbs] = freqz_m(bbs, abs);
    
    % ---------------------------------------------------------------
    %    find Actual Passband Ripple and Min Stopband attenuation
    % ---------------------------------------------------------------
    delta_w = 2*pi/1000;
    Rp_bs = -(min(dbbs(1:1:ceil(wpbs(1)/delta_w+1))));                             % Actual Passband Ripple
    
    fprintf('
    Actual Passband Ripple is %.4f dB.
    ', Rp_bs);
    
    As_bs = -round(max(dbbs(ceil(wsbs(1)/delta_w)+1:1:ceil(wsbs(2)/delta_w)+1)));   % Min Stopband attenuation
    fprintf('
    Min Stopband attenuation is %.4f dB.
    
    ', As_bs);
    
    
    %% -----------------------------------------------------------------
    %%                             Plot
    %% -----------------------------------------------------------------  
    
    figure('NumberTitle', 'off', 'Name', 'Problem 8.40.2 Chebyshev-1 bs by cheby1 function')
    set(gcf,'Color','white'); 
    M = 1;                          % Omega max
    
    subplot(2,2,1); plot(wwbs/pi, magbs); axis([0, M, 0, 1.2]); grid on;
    xlabel('Digital frequency in pi units'); ylabel('|H|'); title('Magnitude Response');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.25, 0.35, 0.65, 0.75, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [0, 0.01, 0.9048, 1]);
    
    subplot(2,2,2); plot(wwbs/pi, dbbs); axis([0, M, -120, 2]); grid on;
    xlabel('Digital frequency in pi units'); ylabel('Decibels'); title('Magnitude in dB');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.25, 0.35, 0.65, 0.75, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [-80, -44, -1, 0]);
    set(gca,'YTickLabelMode','manual','YTickLabel',['80'; '44';'1 ';' 0']);
    
    
    subplot(2,2,3); plot(wwbs/pi, phabs/pi); axis([0, M, -1.1, 1.1]); grid on;
    xlabel('Digital frequency in pi nuits'); ylabel('radians in pi units'); title('Phase Response');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.25, 0.35, 0.65, 0.75, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [-1:0.5:1]);
    
    subplot(2,2,4); plot(wwbs/pi, grdbs); axis([0, M, 0, 30]); grid on;
    xlabel('Digital frequency in pi units'); ylabel('Samples'); title('Group Delay');
    set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.25, 0.35, 0.65, 0.75, M]);
    set(gca, 'YTickMode', 'manual', 'YTick', [0:10:30]);
    

      运行结果:

           通带、阻带设计指标,dB单位和绝对值单位

            采用cheb1bsf函数,得到Chebyshev-1型数字带阻滤波器,系统函数直接形式的系数如下

            转换成串联形式,系数如下

            幅度谱、相位谱和群延迟响应

            数字带阻滤波器零极点图

            和P8.39进行对比,采用cheby1函数(MATLAB工具箱函数),计算得到数字带阻滤波器,系统函数直接形式的系数如下

  • 相关阅读:
    Unity-WIKI 之 AllocationStats(内存分配)
    Unity-WIKI 之 DebugLine
    Unity-WIKI 之 DebugConsole
    Unity-WIKI 之 DrawArrow
    Unity 2D Sprite Lighting
    Unity 2D Touch Movement
    [Unity2D]2D Mobile Joystick
    DragRigidbody2D
    Finger Gestures 3.1
    2D Skeletal Animation Ready
  • 原文地址:https://www.cnblogs.com/ky027wh-sx/p/11767034.html
Copyright © 2011-2022 走看看