《DSP using MATLAB》Problem 7.38

代码:

%% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%%            Output Info about this m-file
fprintf(‘\n***********************************************************\n‘);
fprintf(‘        <DSP using MATLAB> Problem 7.38 \n\n‘);

banner();
%% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

% bandpass, PM method
ws1 = 0.2*pi; wp1 = 0.35*pi; wp2 = 0.55*pi; ws2 = 0.75*pi;
Rp = 0.25; As = 40;
[delta1, delta2] = db2delta(Rp, As)
deltaH = max(delta1,delta2); deltaL = min(delta1,delta2);

f = [ws1, wp1, wp2, ws2]/pi; m = [0, 1, 0]; delta = [delta2, delta1, delta2];

[N, f0, m0, weights] = firpmord(f, m, delta);
fprintf(‘\n-------------------------------------------\n‘);
fprintf(‘\n Results by firpmord function:\n‘);
N
%f0
%m0
%weights
fprintf(‘\n-------------------------------------------\n‘);

weights = [delta1/delta2   1   delta1/delta2]

f = [ 0     ws1    wp1    wp2   ws2   pi]/pi;
m = [ 0     0      1      1     0     0];

h = firpm(N, f, m, weights);
M = N + 1
[db, mag, pha, grd, w] = freqz_m(h, [1]);
delta_w = 2*pi/1000;
ws1i = floor(ws1/delta_w)+1; wp1i = floor(wp1/delta_w)+1;
ws2i = floor(ws2/delta_w)+1; wp2i = floor(wp2/delta_w)+1;

Asd = -max(db(1:1:ws1i))

h = firpm(N+2, f, m, weights);
M = N + 3
[db, mag, pha, grd, w] = freqz_m(h, [1]);
delta_w = 2*pi/1000;
ws1i = floor(ws1/delta_w)+1; wp1i = floor(wp1/delta_w)+1;
ws2i = floor(ws2/delta_w)+1; wp2i = floor(wp2/delta_w)+1;

Asd = -max(db(1:1:ws1i))

%[Hr, ww, a, L] = Hr_Type1(h);
[Hr,omega,P,L] = ampl_res(h);
l = 0:M-1;

delta_w = 2*pi/1000; sp_edge1 = ws1/delta_w+1; sp_edge2 = ws2/delta_w+1;
%% -------------------------------------------------
%%                    Plot
%% -------------------------------------------------  

figure(‘NumberTitle‘, ‘off‘, ‘Name‘, ‘Problem 7.38‘)
set(gcf,‘Color‘,‘white‘); 

subplot(2,2,1); stem(l, h); axis([-1, M, -0.4, 0.45]); grid on;
xlabel(‘n‘); ylabel(‘h(n)‘); title(‘Actual Impulse Response, M=27‘);
set(gca,‘XTickMode‘,‘manual‘,‘XTick‘,[0,(M-1)/2,M-1]);
set(gca,‘YTickMode‘,‘manual‘,‘YTick‘,[-0.4:0.1:0.4]);

subplot(2,2,2); plot(w/pi, db); axis([0, 1, -80, 10]); grid on;
xlabel(‘frequency in \pi units‘); ylabel(‘Decibels‘); title(‘Magnitude Response in dB ‘);
set(gca,‘XTickMode‘,‘manual‘,‘XTick‘,f)
set(gca,‘YTickMode‘,‘manual‘,‘YTick‘,[-60,-40,0]);
set(gca,‘YTickLabelMode‘,‘manual‘,‘YTickLabels‘,[‘60‘;‘40‘;‘ 0‘]);

subplot(2,2,3); plot(omega/pi, Hr); axis([0, 1, -0.2, 1.2]); grid on;
xlabel(‘frequency in \pi nuits‘); ylabel(‘Hr(\omega)‘); title(‘Amplitude Response‘);
set(gca,‘XTickMode‘,‘manual‘,‘XTick‘,f)
set(gca,‘YTickMode‘,‘manual‘,‘YTick‘,[0,1]);

subplot(2,2,4); axis([0, 1, -deltaH, deltaH]);
sb1w = omega(1:1:ws1i)/pi;  sb1e = Hr(1:1:ws1i)-m(1);  %sb1e = (Hr(1:1:ws1i)-m(1))*weights(1);
pbw  = omega(wp1i:wp2i)/pi; pbe = Hr(wp1i:wp2i)-m(3);  %pbe  = (Hr(wp1i:wp2i)-m(3))*weights(2);
sb2w = omega(ws2i:501)/pi;  sb2e = Hr(ws2i:501)-m(5);  %sb2e = (Hr(ws2i:501)-m(5))*weights(3);   

plot(sb1w,sb1e,pbw,pbe,sb2w,sb2e); grid on;                  %  error 

%axis([0, 1, -deltaL-0.02, deltaL+0.02]); grid on;
xlabel(‘frequency in \pi units‘); ylabel(‘Hr(\omega)‘); title(‘Error Response‘); %title(‘Weighted Error‘);  

set(gca,‘XTickMode‘,‘manual‘,‘XTick‘,f)
set(gca,‘YTickMode‘,‘manual‘,‘YTick‘,[-deltaH, 0, deltaH]);
%set(gca,‘XGrid‘,‘on‘,‘YGrid‘,‘on‘)

figure(‘NumberTitle‘, ‘off‘, ‘Name‘, ‘Problem 7.38 AmpRes of h(n), Parks-McClellan Method‘)
set(gcf,‘Color‘,‘white‘); 

plot(omega/pi, Hr); grid on; %axis([0 1 -100 10]);
xlabel(‘frequency in \pi units‘); ylabel(‘Hr(\omega)‘); title(‘Amplitude Response‘);
set(gca,‘YTickMode‘,‘manual‘,‘YTick‘,[-delta2,delta2, 1 - delta1, 1 + delta1]);
set(gca,‘XTickMode‘,‘manual‘,‘XTick‘,f);

  运行结果:

运用Parks-McClellen算法,滤波器长度M=27,比较合适

脉冲响应、幅度谱和误差函数

振幅谱

下面是P7.9的结果,可看出,P-M法得到的长度(M=27)比窗函数(M=43)得到的小得多。

第7章终于弄完了,内心小欢喜一下,放一张田地的照片放松放松,明天开始第8章!

原文地址:https://www.cnblogs.com/ky027wh-sx/p/10914347.html

时间: 2024-10-13 18:11:26

《DSP using MATLAB》Problem 7.38的相关文章

《DSP using MATLAB》Problem 8.38

代码: function [wpLP, wsLP, alpha] = bp2lpfre(wpbp, wsbp) % Band-edge frequency conversion from bandpass to lowpass digital filter % ------------------------------------------------------------------------- % [wpLP, wsLP, alpha] = bp2lpfre(wpbp, wsbp)

《DSP using MATLAB》 Problem 2.3

本题主要是显示周期序列的. 1.代码: %% ------------------------------------------------------------------------ %% Output Info about this m-file fprintf('\n***********************************************************\n'); fprintf(' <DSP using MATLAB> Problem 2.3.1 \

《DSP using MATLAB》Problem 2.5

2.代码: %% ------------------------------------------------------------------------ %% Output Info about this m-file fprintf('\n***********************************************************\n'); fprintf(' <DSP using MATLAB> Problem 2.5.2 \n\n'); time_st

《DSP using MATLAB》Problem 2.6

1.代码 %% ------------------------------------------------------------------------ %% Output Info about this m-file fprintf('\n***********************************************************\n'); fprintf(' <DSP using MATLAB> Problem 2.6.1 \n\n'); [v, d] =

《DSP using MATLAB》Problem 2.8

1.代码: 从MATLAB官方网上下载的. %*************************************************************************% %A code for the Downsampler% %Author: Yashwant Marathe% %Date:20-12-2010% function [y ny] = dnsample(x,n,M) %x is a sequence over indices specified by v

《DSP using MATLAB》Problem 2.14

代码: %% ------------------------------------------------------------------------ %% Output Info about this m-file fprintf('\n***********************************************************\n'); fprintf(' <DSP using MATLAB> Problem 2.14 \n\n'); banner();

《DSP using MATLAB》Problem 2.16

先由脉冲响应序列h(n)得到差分方程系数,过程如下: 代码: %% ------------------------------------------------------------------------ %% Output Info about this m-file fprintf('\n***********************************************************\n'); fprintf(' <DSP using MATLAB> Prob

《DSP using MATLAB》Problem 2.15

代码: %% ------------------------------------------------------------------------ %% Output Info about this m-file fprintf('\n***********************************************************\n'); fprintf(' <DSP using MATLAB> Problem 2.15 \n\n'); banner();

《DSP using MATLAB》Problem 2.19

代码: %% ------------------------------------------------------------------------ %% Output Info about this m-file fprintf('\n***********************************************************\n'); fprintf(' <DSP using MATLAB> Problem 2.19 \n\n'); banner();