《DSP using MATLAB》Problem 7.24
又到清明时节,……
注意:带阻滤波器不能用第2类线性相位滤波器实现,我们采用第1类,长度为基数,选M=61
代码:
- %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- %% Output Info about this m-file
- fprintf('\n***********************************************************\n');
- fprintf(' <DSP using MATLAB> Problem 7.24 \n\n');
- banner();
- %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- % bandstop filter
- % Type-2 FIR ---- No highpass or bandstop
- wp1 = 0.3*pi; ws1 = 0.4*pi; ws2 = 0.6*pi; wp2 = 0.7*pi;
- As = 50; Rp = 0.2;
- tr_width = min( ws1-wp1, wp2-ws2 );
- T1 = 0.5925; T2=0.1099;
- M = 61; alpha = (M-1)/2; l = 0:M-1; wl = (2*pi/M)*l;
- n = [0:1:M-1]; wc1 = (ws1+wp1)/2; wc2 = (wp2+ws2)/2;
- 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
- Hdr = [1, 1, 0, 0, 1, 1]; wdl = [0, 0.3, 0.4, 0.6, 0.7, 1]; % Ideal Amp Res for plotting
- k1 = 0:floor((M-1)/2); k2 = floor((M-1)/2)+1:M-1;
- %% ----------------------------------
- %% Type-1 LPF
- %% ----------------------------------
- angH = [-alpha*(2*pi)/M*k1, alpha*(2*pi)/M*(M-k2)];
- H = Hrs.*exp(j*angH); h = real(ifft(H, M));
- [db, mag, pha, grd, w] = freqz_m(h, 1); delta_w = 2*pi/1000;
- [Hr, ww, a, L] = Hr_Type1(h);
- Rp = -(min(db(1 :1: floor(wp1/delta_w)))); % Actual Passband Ripple
- fprintf('\nActual Passband Ripple is %.4f dB.\n', Rp);
- As = -round(max(db(floor(ws1/delta_w)+1 : 1 : 0.55*pi/delta_w))); % Min Stopband attenuation
- fprintf('\nMin Stopband attenuation is %.4f dB.\n', As);
- [delta1, delta2] = db2delta(Rp, As)
- %Plot
- figure('NumberTitle', 'off', 'Name', 'Problem 7.24a FreSamp Method')
- set(gcf,'Color','white');
- subplot(2,2,1); plot(wl(1:31)/pi, Hrs(1:31), 'o', wdl, Hdr, 'r'); axis([0, 1, -0.1, 1.1]);
- set(gca,'YTickMode','manual','YTick',[0,0.5,1]);
- set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
- xlabel('frequency in \pi nuits'); ylabel('Hr(k)'); title('Frequency Samples: M=61,T1=0.5925,T2=0.1099');
- grid on;
- subplot(2,2,2); stem(l, h); axis([-1, M, -0.3, 0.8]); grid on;
- xlabel('n'); ylabel('h(n)'); title('Impulse Response');
- 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;
- xlabel('frequency in \pi units'); ylabel('Hr(w)'); title('Amplitude Response');
- set(gca,'YTickMode','manual','YTick',[0,0.5,1]);
- set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
- subplot(2,2,4); plot(w/pi, db); axis([0, 1, -100, 10]); grid on;
- xlabel('frequency in \pi units'); ylabel('Decibels'); title('Magnitude Response');
- set(gca,'YTickMode','manual','YTick',[-90,-58,0]);
- set(gca,'YTickLabelMode','manual','YTickLabel',['90';'58';' 0']);
- set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
- figure('NumberTitle', 'off', 'Name', 'Problem 7.24 h(n) FreSamp Method')
- set(gcf,'Color','white');
- subplot(2,2,1); plot(w/pi, db); grid on; axis([0 1 -120 10]);
- set(gca,'YTickMode','manual','YTick',[-90,-58,0])
- set(gca,'YTickLabelMode','manual','YTickLabel',['90';'58';' 0']);
- set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
- 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.3,0.4,0.6,0.7,1,1.3,1.4,1.6,1.7,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');
- figure('NumberTitle', 'off', 'Name', 'Problem 7.24 AmpRes of h(n), FreSamp Method')
- set(gcf,'Color','white');
- plot(ww/pi, Hr); grid on; %axis([0 1 -100 10]);
- xlabel('frequency in \pi units'); ylabel('Hr'); title('Amplitude Response');
- set(gca,'YTickMode','manual','YTick',[-delta2, 0,delta2, 1-0.035, 1,1+0.035]);
- %set(gca,'YTickLabelMode','manual','YTickLabel',['90';'45';' 0']);
- set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
- %% ------------------------------------
- %% fir2 Method
- %% ------------------------------------
- f = [0 wp1 ws1 ws2 wp2 pi]/pi;
- m = [1 1 0 0 1 1];
- h_check = fir2(M+1, f, m); % if M is odd, then M+1; order
- [db, mag, pha, grd, w] = freqz_m(h_check, [1]);
- %[Hr,ww,P,L] = ampl_res(h_check);
- [Hr, ww, a, L] = Hr_Type1(h_check);
- fprintf('\n-------------fir2 Method start-----------------\n');
- Rp = -(min(db(1 :1: floor(wp1/delta_w)))); % Actual Passband Ripple
- fprintf('\nActual Passband Ripple is %.4f dB.\n', Rp);
- %As = -round(max(db(floor(0.45*pi/delta_w)+1 : 1 : ws2/delta_w))); % Min Stopband attenuation
- As = -round(max(db(floor(0.45*pi/delta_w)+1 : 1 : 0.55*pi/delta_w)));
- fprintf('\nMin Stopband attenuation is %.4f dB.\n', As);
- [delta1, delta2] = db2delta(Rp, As)
- figure('NumberTitle', 'off', 'Name', 'Problem 7.24 fir2 Method')
- set(gcf,'Color','white');
- subplot(2,2,1); stem(n, h); axis([0 M-1 -0.3 0.8]); grid on;
- xlabel('n'); ylabel('h(n)'); title('Impulse Response');
- %subplot(2,2,2); stem(n, w_ham); axis([0 M-1 0 1.1]); grid on;
- %xlabel('n'); ylabel('w(n)'); title('Hamming Window');
- subplot(2,2,3); stem([0:M+1], h_check); axis([0 M+1 -0.3 0.8]); grid on;
- xlabel('n'); ylabel('h\_check(n)'); title('Actual Impulse Response');
- subplot(2,2,4); plot(w/pi, db); axis([0 1 -120 10]); grid on;
- set(gca,'YTickMode','manual','YTick',[-90,-64,-21,0])
- set(gca,'YTickLabelMode','manual','YTickLabel',['90';'64';'21';' 0']);
- set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
- xlabel('frequency in \pi units'); ylabel('Decibels'); title('Magnitude Response in dB');
- figure('NumberTitle', 'off', 'Name', 'Problem 7.24 h(n) fir2 Method')
- set(gcf,'Color','white');
- subplot(2,2,1); plot(w/pi, db); grid on; axis([0 1 -120 10]);
- xlabel('frequency in \pi units'); ylabel('Decibels'); title('Magnitude Response in dB');
- set(gca,'YTickMode','manual','YTick',[-90,-64,-21,0]);
- set(gca,'YTickLabelMode','manual','YTickLabel',['90';'64';'21';' 0']);
- set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1,1.3,1.4,1.6,1.7,2]);
- 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.3,0.4,0.6,0.7,1,1.3,1.4,1.6,1.7,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');
- figure('NumberTitle', 'off', 'Name', 'Problem 7.24 AmpRes of h(n),fir2 Method')
- set(gcf,'Color','white');
- plot(ww/pi, Hr); grid on; %axis([0 1 -100 10]);
- xlabel('frequency in \pi units'); ylabel('Hr'); title('Amplitude Response');
- set(gca,'YTickMode','manual','YTick',[-0.004, 0,0.004, 1-0.004, 1,1+0.004]);
- %set(gca,'YTickLabelMode','manual','YTickLabel',['90';'45';' 0']);
- set(gca,'XTickMode','manual','XTick',[0,0.3,0.4,0.6,0.7,1]);
运行结果:
过渡带中有两个采样值,优化值直接抄书上的。
采用频率采样方法得到的脉冲响应
采用fir2函数 的方法得到滤波器脉冲响应
《DSP using MATLAB》Problem 7.24的更多相关文章
- 《DSP using MATLAB》Problem 6.24
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- 《DSP using MATLAB》Problem 4.24
Y(z)部分分式展开, 零状态响应部分分式展开, 零输入状态部分分式展开,
- 《DSP using MATLAB》Problem 6.15
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- 《DSP using MATLAB》Problem 6.8
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- 《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) ...
- 《DSP using MATLAB》Problem 4.15
只会做前两个, 代码: %% ---------------------------------------------------------------------------- %% Outpu ...
- 《DSP using MATLAB》Problem 2.16
先由脉冲响应序列h(n)得到差分方程系数,过程如下: 代码: %% ------------------------------------------------------------------ ...
- 《DSP using MATLAB》 Problem 2.3
本题主要是显示周期序列的. 1.代码: %% ------------------------------------------------------------------------ %% O ...
- 《DSP using MATLAB》Problem 7.29
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
随机推荐
- C++11 相关教程
C++11 中文wiki: https://zh.wikipedia.org/zh-cn/C%2B%2B11 C++11 新特性介绍: https://www.kancloud.cn/wangshub ...
- python 使用selenium模块爬取同一个url下不同页的内容(浏览器模拟人工翻页)
页面翻页,下一页可能是一个新的url 也有可能是用js进行页面跳转,url不变,解决方法是实现浏览器模拟人工翻页 目标:爬取同一个url下不同页的数据(上述第二种情况) url:http://www. ...
- 用反射的形式将一个对象属性值赋值给另一个对象,省略点get/set方法的冗余代码
1.本例使用的是idea 首先需要在idea中安装lombok插件,省略getter和setter方法的书写 在maven项目中加入lombok依赖 <dependency> <gr ...
- 关于JDCB连接oracle数据库。
1:什么是JDBC(百度可详细解释) JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为 ...
- JS-构造函数模式代码实战和总结-极客
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- volatile--领域分界线?
volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量.volatile的作用是作为指令关键字,确保本条指令不会 ...
- mysqldumpslow简单使用方法-mysqldumpslow详细用法
慢查询日志分析工具mysqldumpslow经常使用的参数:-s,是order的顺序----- al 平均锁定时间-----ar 平均返回记录时间-----at 平均查询时间(默认)-----c 计数 ...
- python3 进行字符串、日期、时间、时间戳相关转换
1.字符串转换成时间戳 2. 日期转换成时间戳
- 如何优雅的关闭Golang Channel?
Channel关闭原则 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作. 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费 ...
- 分页(pagination)样式表
ul { list-style: none; padding:; margin:; } .pagination{ display:inline-block; padding-left:; border ...