又到清明时节,……

注意:带阻滤波器不能用第2类线性相位滤波器实现,我们采用第1类,长度为基数,选M=61

代码:

  1. %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. %% Output Info about this m-file
  3. fprintf('\n***********************************************************\n');
  4. fprintf(' <DSP using MATLAB> Problem 7.24 \n\n');
  5.  
  6. banner();
  7. %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  8.  
  9. % bandstop filter
  10. % Type-2 FIR ---- No highpass or bandstop
  11. wp1 = 0.3*pi; ws1 = 0.4*pi; ws2 = 0.6*pi; wp2 = 0.7*pi;
  12. As = 50; Rp = 0.2;
  13. tr_width = min( ws1-wp1, wp2-ws2 );
  14.  
  15. T1 = 0.5925; T2=0.1099;
  16. M = 61; alpha = (M-1)/2; l = 0:M-1; wl = (2*pi/M)*l;
  17. n = [0:1:M-1]; wc1 = (ws1+wp1)/2; wc2 = (wp2+ws2)/2;
  18.  
  19. Hrs = [ones(1,10),T1,T2,zeros(1,7),T2,T1,ones(1,20),T1,T2,zeros(1,7),T2,T1,ones(1,9)]; % Ideal Amp Res sampled
  20. Hdr = [1, 1, 0, 0, 1, 1]; wdl = [0, 0.3, 0.4, 0.6, 0.7, 1]; % Ideal Amp Res for plotting
  21. k1 = 0:floor((M-1)/2); k2 = floor((M-1)/2)+1:M-1;
  22.  
  23. %% ----------------------------------
  24. %% Type-1 LPF
  25. %% ----------------------------------
  26. angH = [-alpha*(2*pi)/M*k1, alpha*(2*pi)/M*(M-k2)];
  27. H = Hrs.*exp(j*angH); h = real(ifft(H, M));
  28.  
  29. [db, mag, pha, grd, w] = freqz_m(h, 1); delta_w = 2*pi/1000;
  30. [Hr, ww, a, L] = Hr_Type1(h);
  31.  
  32. Rp = -(min(db(1 :1: floor(wp1/delta_w)))); % Actual Passband Ripple
  33. fprintf('\nActual Passband Ripple is %.4f dB.\n', Rp);
  34. As = -round(max(db(floor(ws1/delta_w)+1 : 1 : 0.55*pi/delta_w))); % Min Stopband attenuation
  35. fprintf('\nMin Stopband attenuation is %.4f dB.\n', As);
  36.  
  37. [delta1, delta2] = db2delta(Rp, As)
  38.  
  39. %Plot
  40.  
  41. figure('NumberTitle', 'off', 'Name', 'Problem 7.24a FreSamp Method')
  42. set(gcf,'Color','white');
  43. subplot(2,2,1); plot(wl(1:31)/pi, Hrs(1:31), 'o', wdl, Hdr, 'r'); axis([0, 1, -0.1, 1.1]);
  44. set(gca,'YTickMode','manual','YTick',[0,0.5,1]);
  45. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
  46. xlabel('frequency in \pi nuits'); ylabel('Hr(k)'); title('Frequency Samples: M=61,T1=0.5925,T2=0.1099');
  47. grid on;
  48.  
  49. subplot(2,2,2); stem(l, h); axis([-1, M, -0.3, 0.8]); grid on;
  50. xlabel('n'); ylabel('h(n)'); title('Impulse Response');
  51.  
  52. subplot(2,2,3); plot(ww/pi, Hr, 'r', wl(1:31)/pi, Hrs(1:31), 'o'); axis([0, 1, -0.2, 1.2]); grid on;
  53. xlabel('frequency in \pi units'); ylabel('Hr(w)'); title('Amplitude Response');
  54. set(gca,'YTickMode','manual','YTick',[0,0.5,1]);
  55. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
  56.  
  57. subplot(2,2,4); plot(w/pi, db); axis([0, 1, -100, 10]); grid on;
  58. xlabel('frequency in \pi units'); ylabel('Decibels'); title('Magnitude Response');
  59. set(gca,'YTickMode','manual','YTick',[-90,-58,0]);
  60. set(gca,'YTickLabelMode','manual','YTickLabel',['90';'58';' 0']);
  61. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
  62.  
  63. figure('NumberTitle', 'off', 'Name', 'Problem 7.24 h(n) FreSamp Method')
  64. set(gcf,'Color','white');
  65.  
  66. subplot(2,2,1); plot(w/pi, db); grid on; axis([0 1 -120 10]);
  67. set(gca,'YTickMode','manual','YTick',[-90,-58,0])
  68. set(gca,'YTickLabelMode','manual','YTickLabel',['90';'58';' 0']);
  69. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
  70. xlabel('frequency in \pi units'); ylabel('Decibels'); title('Magnitude Response in dB');
  71.  
  72. subplot(2,2,3); plot(w/pi, mag); grid on; %axis([0 1 -100 10]);
  73. xlabel('frequency in \pi units'); ylabel('Absolute'); title('Magnitude Response in absolute');
  74. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1,1.3,1.4,1.6,1.7,2]);
  75. set(gca,'YTickMode','manual','YTick',[0,1.0]);
  76.  
  77. subplot(2,2,2); plot(w/pi, pha); grid on; %axis([0 1 -100 10]);
  78. xlabel('frequency in \pi units'); ylabel('Rad'); title('Phase Response in Radians');
  79. subplot(2,2,4); plot(w/pi, grd*pi/180); grid on; %axis([0 1 -100 10]);
  80. xlabel('frequency in \pi units'); ylabel('Rad'); title('Group Delay');
  81.  
  82. figure('NumberTitle', 'off', 'Name', 'Problem 7.24 AmpRes of h(n), FreSamp Method')
  83. set(gcf,'Color','white');
  84.  
  85. plot(ww/pi, Hr); grid on; %axis([0 1 -100 10]);
  86. xlabel('frequency in \pi units'); ylabel('Hr'); title('Amplitude Response');
  87. set(gca,'YTickMode','manual','YTick',[-delta2, 0,delta2, 1-0.035, 1,1+0.035]);
  88. %set(gca,'YTickLabelMode','manual','YTickLabel',['90';'45';' 0']);
  89. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
  90.  
  91. %% ------------------------------------
  92. %% fir2 Method
  93. %% ------------------------------------
  94. f = [0 wp1 ws1 ws2 wp2 pi]/pi;
  95. m = [1 1 0 0 1 1];
  96. h_check = fir2(M+1, f, m); % if M is odd, then M+1; order
  97. [db, mag, pha, grd, w] = freqz_m(h_check, [1]);
  98. %[Hr,ww,P,L] = ampl_res(h_check);
  99. [Hr, ww, a, L] = Hr_Type1(h_check);
  100.  
  101. fprintf('\n-------------fir2 Method start-----------------\n');
  102. Rp = -(min(db(1 :1: floor(wp1/delta_w)))); % Actual Passband Ripple
  103. fprintf('\nActual Passband Ripple is %.4f dB.\n', Rp);
  104. %As = -round(max(db(floor(0.45*pi/delta_w)+1 : 1 : ws2/delta_w))); % Min Stopband attenuation
  105. As = -round(max(db(floor(0.45*pi/delta_w)+1 : 1 : 0.55*pi/delta_w)));
  106. fprintf('\nMin Stopband attenuation is %.4f dB.\n', As);
  107.  
  108. [delta1, delta2] = db2delta(Rp, As)
  109.  
  110. figure('NumberTitle', 'off', 'Name', 'Problem 7.24 fir2 Method')
  111. set(gcf,'Color','white');
  112.  
  113. subplot(2,2,1); stem(n, h); axis([0 M-1 -0.3 0.8]); grid on;
  114. xlabel('n'); ylabel('h(n)'); title('Impulse Response');
  115.  
  116. %subplot(2,2,2); stem(n, w_ham); axis([0 M-1 0 1.1]); grid on;
  117. %xlabel('n'); ylabel('w(n)'); title('Hamming Window');
  118.  
  119. subplot(2,2,3); stem([0:M+1], h_check); axis([0 M+1 -0.3 0.8]); grid on;
  120. xlabel('n'); ylabel('h\_check(n)'); title('Actual Impulse Response');
  121.  
  122. subplot(2,2,4); plot(w/pi, db); axis([0 1 -120 10]); grid on;
  123. set(gca,'YTickMode','manual','YTick',[-90,-64,-21,0])
  124. set(gca,'YTickLabelMode','manual','YTickLabel',['90';'64';'21';' 0']);
  125. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
  126. xlabel('frequency in \pi units'); ylabel('Decibels'); title('Magnitude Response in dB');
  127.  
  128. figure('NumberTitle', 'off', 'Name', 'Problem 7.24 h(n) fir2 Method')
  129. set(gcf,'Color','white');
  130.  
  131. subplot(2,2,1); plot(w/pi, db); grid on; axis([0 1 -120 10]);
  132. xlabel('frequency in \pi units'); ylabel('Decibels'); title('Magnitude Response in dB');
  133. set(gca,'YTickMode','manual','YTick',[-90,-64,-21,0]);
  134. set(gca,'YTickLabelMode','manual','YTickLabel',['90';'64';'21';' 0']);
  135. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1,1.3,1.4,1.6,1.7,2]);
  136.  
  137. subplot(2,2,3); plot(w/pi, mag); grid on; %axis([0 1 -100 10]);
  138. xlabel('frequency in \pi units'); ylabel('Absolute'); title('Magnitude Response in absolute');
  139. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1,1.3,1.4,1.6,1.7,2]);
  140. set(gca,'YTickMode','manual','YTick',[0,1.0]);
  141.  
  142. subplot(2,2,2); plot(w/pi, pha); grid on; %axis([0 1 -100 10]);
  143. xlabel('frequency in \pi units'); ylabel('Rad'); title('Phase Response in Radians');
  144. subplot(2,2,4); plot(w/pi, grd*pi/180); grid on; %axis([0 1 -100 10]);
  145. xlabel('frequency in \pi units'); ylabel('Rad'); title('Group Delay');
  146.  
  147. figure('NumberTitle', 'off', 'Name', 'Problem 7.24 AmpRes of h(n),fir2 Method')
  148. set(gcf,'Color','white');
  149.  
  150. plot(ww/pi, Hr); grid on; %axis([0 1 -100 10]);
  151. xlabel('frequency in \pi units'); ylabel('Hr'); title('Amplitude Response');
  152. set(gca,'YTickMode','manual','YTick',[-0.004, 0,0.004, 1-0.004, 1,1+0.004]);
  153. %set(gca,'YTickLabelMode','manual','YTickLabel',['90';'45';' 0']);
  154. set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);

运行结果:

过渡带中有两个采样值,优化值直接抄书上的。

采用频率采样方法得到的脉冲响应

采用fir2函数 的方法得到滤波器脉冲响应

《DSP using MATLAB》Problem 7.24的更多相关文章

  1. 《DSP using MATLAB》Problem 6.24

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  2. 《DSP using MATLAB》Problem 4.24

    Y(z)部分分式展开, 零状态响应部分分式展开, 零输入状态部分分式展开,

  3. 《DSP using MATLAB》Problem 6.15

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  4. 《DSP using MATLAB》Problem 6.8

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  5. 《DSP using MATLAB》Problem 5.24-5.25-5.26

    代码: function y = circonvt(x1,x2,N) %% N-point Circular convolution between x1 and x2: (time domain) ...

  6. 《DSP using MATLAB》Problem 4.15

    只会做前两个, 代码: %% ---------------------------------------------------------------------------- %% Outpu ...

  7. 《DSP using MATLAB》Problem 2.16

    先由脉冲响应序列h(n)得到差分方程系数,过程如下: 代码: %% ------------------------------------------------------------------ ...

  8. 《DSP using MATLAB》 Problem 2.3

    本题主要是显示周期序列的. 1.代码: %% ------------------------------------------------------------------------ %% O ...

  9. 《DSP using MATLAB》Problem 7.29

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

随机推荐

  1. C++11 相关教程

    C++11 中文wiki: https://zh.wikipedia.org/zh-cn/C%2B%2B11 C++11 新特性介绍: https://www.kancloud.cn/wangshub ...

  2. python 使用selenium模块爬取同一个url下不同页的内容(浏览器模拟人工翻页)

    页面翻页,下一页可能是一个新的url 也有可能是用js进行页面跳转,url不变,解决方法是实现浏览器模拟人工翻页 目标:爬取同一个url下不同页的数据(上述第二种情况) url:http://www. ...

  3. 用反射的形式将一个对象属性值赋值给另一个对象,省略点get/set方法的冗余代码

    1.本例使用的是idea 首先需要在idea中安装lombok插件,省略getter和setter方法的书写 在maven项目中加入lombok依赖 <dependency> <gr ...

  4. 关于JDCB连接oracle数据库。

    1:什么是JDBC(百度可详细解释)               JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为 ...

  5. JS-构造函数模式代码实战和总结-极客

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. volatile--领域分界线?

    volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量.volatile的作用是作为指令关键字,确保本条指令不会 ...

  7. mysqldumpslow简单使用方法-mysqldumpslow详细用法

    慢查询日志分析工具mysqldumpslow经常使用的参数:-s,是order的顺序----- al 平均锁定时间-----ar 平均返回记录时间-----at 平均查询时间(默认)-----c 计数 ...

  8. python3 进行字符串、日期、时间、时间戳相关转换

    1.字符串转换成时间戳 2. 日期转换成时间戳

  9. 如何优雅的关闭Golang Channel?

    Channel关闭原则 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作. 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费 ...

  10. 分页(pagination)样式表

    ul { list-style: none; padding:; margin:; } .pagination{ display:inline-block; padding-left:; border ...