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

        代码:

    %% ------------------------------------------------------------------------
    %%            Output Info about this m-file
    fprintf('
    ***********************************************************
    ');
    fprintf('        <DSP using MATLAB> Problem 8.3 
    
    ');
    banner();
    %% ------------------------------------------------------------------------
    
    % Given resonat frequency and 3dB bandwidth
    delta_omega = 0.05;
    omega_r = 2*pi*0.375;
    
    r = 1 - delta_omega / 2
    omega0 = acos(2*r*cos(omega_r)/(1+r*r))
    
    % digital resonator
    %r = 0.8
    %r = 0.9
    %r = 0.99
    %omega0 = pi/4;
    
    % corresponding system function  Direct form
    %     zeros at z=±1
    G = (1-r)*sqrt(1+r*r-2*r*cos(2*omega0)) / sqrt(2*(1-cos(2*omega0)))     % gain parameter
    b = G*[1  0  -1];                                                        % denominator                      
    a = [1 -2*r*cos(omega0) r*r];                                            % numerator
    
    % precise resonant frequency and 3dB bandwidth
    omega_r = acos((1+r*r)*cos(omega0)/(2*r));
    delta_omega = 2*(1-r);
    fprintf('
    Resonant Freq is : %.4fpi unit, 3dB bandwidth is %.4f 
    ', omega_r/pi,delta_omega);
    % 
    
    [db, mag, pha, grd, w] = freqz_m(b, a);
    
    figure('NumberTitle', 'off', 'Name', 'Problem 8.3 Digital Resonator')
    set(gcf,'Color','white'); 
    
    subplot(2,2,1); plot(w/pi, db); grid on; axis([0 2 -60 10]); 
    set(gca,'YTickMode','manual','YTick',[-60,-30,0])
    set(gca,'YTickLabelMode','manual','YTickLabel',['60';'30';' 0']);
    set(gca,'XTickMode','manual','XTick',[0,0.75,1,1.25,2]);
    xlabel('frequency in pi units'); ylabel('Decibels'); title('Magnitude Response in dB');
    
    subplot(2,2,3); plot(w/pi, mag); grid on; %axis([0 1 -100 10]); 
    xlabel('frequency in pi units'); ylabel('Absolute'); title('Magnitude Response in absolute');
    set(gca,'XTickMode','manual','XTick',[0,0.75,1,1.25,2]);
    set(gca,'YTickMode','manual','YTick',[0,1.0]);
    
    subplot(2,2,2); plot(w/pi, pha); grid on; %axis([0 1 -100 10]); 
    xlabel('frequency in pi units'); ylabel('Rad'); title('Phase Response in Radians');
    
    subplot(2,2,4); plot(w/pi, grd*pi/180);  grid on; %axis([0 1 -100 10]); 
    xlabel('frequency in pi units'); ylabel('Rad'); title('Group Delay');
    set(gca,'XTickMode','manual','XTick',[0,0.75,1,1.25,2]);
    %set(gca,'YTickMode','manual','YTick',[0,1.0]);
    
    figure('NumberTitle', 'off', 'Name', 'Problem 8.3 Pole-Zero Plot')
    set(gcf,'Color','white'); 
    zplane(b,a); 
    title(sprintf('Pole-Zero Plot, r=%.3f  %.2f\pi',r,omega_r/pi));
    %pzplotz(b,a);
    
    
    % Impulse Response
    fprintf('
    ----------------------------------');
    fprintf('
    Partial fraction expansion method: 
    ');
    [R, p, c] = residuez(b,a)
    MR = (abs(R))'              % Residue  Magnitude
    AR = (angle(R))'/pi         % Residue  angles in pi units
    Mp = (abs(p))'              % pole  Magnitude
    Ap = (angle(p))'/pi         % pole  angles in pi units
    [delta, n] = impseq(0,0,200);
    h_chk = filter(b,a,delta);      % check sequences
    
    %h =  ( 0.8.^n ) .* (2*0.232*cos(pi*n/4) - 2*0.0509*sin(pi*n/4)) -0.283 * delta;  % r=0.8
    %h =  ( 0.9.^n ) .* (2*0.1063*cos(pi*n/4) - 2*0.0112*sin(pi*n/4)) -0.1174 * delta;  % r=0.9
    %h =  ( 0.99.^n ) .* (2*0.0101*cos(pi*n/4) - 2*0.0001*sin(pi*n/4)) -0.0102 * delta;  % r=0.99
    
    h =  ( 0.975.^n ) .* (2*0.0253*cos(pi*n*3/4) - 2*0.0006*sin(pi*n*3/4)) -0.026 * delta;     % r=0.975
    
    figure('NumberTitle', 'off', 'Name', 'Problem 8.3 Digital Resonator, h(n) by filter and Inv-Z ')
    set(gcf,'Color','white'); 
    
    subplot(2,1,1); stem(n, h_chk); grid on; %axis([0 2 -60 10]); 
    xlabel('n'); ylabel('h\_chk'); title('Impulse Response sequences by filter');
    
    subplot(2,1,2); stem(n, h); grid on; %axis([0 1 -100 10]); 
    xlabel('n'); ylabel('h'); title('Impulse Response sequences by Inv-Z');
    
    
    [db, mag, pha, grd, w] = freqz_m(h, [1]);
    
    
    figure('NumberTitle', 'off', 'Name', 'Problem 8.3 Digital Resonator, h(n) by Inv-Z ')
    set(gcf,'Color','white'); 
    
    subplot(2,2,1); plot(w/pi, db); grid on; axis([0 2 -60 10]); 
    set(gca,'YTickMode','manual','YTick',[-60,-30,0])
    set(gca,'YTickLabelMode','manual','YTickLabel',['60';'30';' 0']);
    set(gca,'XTickMode','manual','XTick',[0,0.75,1,1.25,2]);
    xlabel('frequency in pi units'); ylabel('Decibels'); title('Magnitude Response in dB');
    
    subplot(2,2,3); plot(w/pi, mag); grid on; %axis([0 1 -100 10]); 
    xlabel('frequency in pi units'); ylabel('Absolute'); title('Magnitude Response in absolute');
    set(gca,'XTickMode','manual','XTick',[0,0.75,1,1.25,2]);
    set(gca,'YTickMode','manual','YTick',[0,1.0]);
    
    subplot(2,2,2); plot(w/pi, pha); grid on; %axis([0 1 -100 10]); 
    xlabel('frequency in pi units'); ylabel('Rad'); title('Phase Response in Radians');
    
    subplot(2,2,4); plot(w/pi, grd*pi/180);  grid on; %axis([0 1 -100 10]); 
    xlabel('frequency in pi units'); ylabel('Rad'); title('Group Delay');
    set(gca,'XTickMode','manual','XTick',[0,0.75,1,1.25,2]);
    %set(gca,'YTickMode','manual','YTick',[0,1.0]);
    

      运行结果:

            系统函数部分分式展开,查表求逆z变换就可得到h(n)

            零极点的模和幅角

            将脉冲序列当成输入得到h_chk(n),系统函数求逆z变换得到h(n),

            二者幅度谱、相位谱、群延迟对比如下,可见,幅度谱一样,相位谱和群延迟有所不同。

            

    牢记: 1、如果你决定做某事,那就动手去做;不要受任何人、任何事的干扰。2、这个世界并不完美,但依然值得我们去为之奋斗。
  • 相关阅读:
    vs2015 停 在 update kb2999226 一直不动
    修复vs2012出现 “无法找到包源”的错误
    forward 和redirect的区别
    软件测试分类
    centos7安装HTTPS协议
    php抓取网页特定div区块及图片,从简单入手
    nginx报 File not found 错误
    关于端口
    调试技巧:让断点停在for循环中的 i 为某个值得时候
    an AC a day keeps the WA away ~
  • 原文地址:https://www.cnblogs.com/ky027wh-sx/p/10945887.html
Copyright © 2011-2022 走看看