为什么我的过滤器设计fdesign如此糟糕?

1视图(30天)
哈利
哈利 2021年2月18日
我非常可怜的带通和使用fdesign bandstop IIR滤波器的设计。带通和fdesign。bandstop,using any of the following design methods:
“黄油”,“ellip”,“cheby1”,“cheby2”
然而,如果我直接调用简单的设计功能(例如buttord,紧随其后的是黄油),那么结果很好。
需要澄清的是,我从这两种方法都得到好的结果如果通带和阻带相对宽:
然而,对于非常窄的通带和阻带,fdesign过滤器是垃圾。我不得到任何错误或警告告诉我任何不好的事情发生了:
有什么区别设计方法是如何实现的在这两种情况呢?当我应该选择哪个?
总的来说,我发现相同的多个MATLAB /工具箱实现滤波器设计方法,而复杂的。我已经花了很多时间阅读所有的不同版本的文档和我不知道的。特别是,系统对象,dfilt过滤器对象和designfilt数字滤波器使用(以及所有似乎都很不方便 隐藏的细微差别 )。
复制我的结果之上,您可以运行这个脚本:
关闭所有;清晰的所有;clc;
%滤波器参数
类型=“带通”;%滤波器类型
Fsamp = 1 e6;%采样率(赫兹)
Fp = (9、11);%通频带边缘(赫兹)
置= (5、20);%阻带边缘(赫兹)
美联社= 0.1;%通带波纹(dB)
Ast = 60;%阻带衰减(dB)
方法=“黄油”;%滤波器设计方法
%绘制参数
Fplot = logspace (2, log10 (0.5 * Fsamp), 32768);
%设计过滤器和计算响应
Hsimp = SimpleResponse(方法、类型、Fp,置,美联社,Ast, Fsamp, Fplot);
Htbox = FdesignResponse(方法、类型、Fp,置,美联社,Ast, Fsamp, Fplot);
%的阴谋
semilogx (Fplot, 20 * log10 (abs (Hsimp)),“线宽”,1.5);
持有;网格;
semilogx (Fplot, 20 * log10 (abs (Htbox)),“——r”,“线宽”,1.5);
传奇(“简单”,“fdesign”);
ylim([5] -200年);
xlim ([0.1 * Fp (1), 10 * Fp (2)));
包含(的频率(赫兹));
ylabel (“(dB)级”);
调用SimpleResponse.m:
函数H = SimpleResponse(方法、类型、Fp,置,美联社,Ast, Fsamp, Fplot)
开关方法
情况下“黄油”
[n, n] = buttord (Fp / (0.5 * Fsamp),置/ (0.5 * Fsamp),美联社,Ast);
(z,磷、钾)=黄油(n, n,类型);
情况下“ellip”
[n, n] = ellipord (Fp / (0.5 * Fsamp),置/ (0.5 * Fsamp),美联社,Ast);
(z,磷、钾)= ellip (n,美联社,Ast, Wn类型);
情况下“cheby1”
[n, n] = cheb1ord (Fp / (0.5 * Fsamp),置/ (0.5 * Fsamp),美联社,Ast);
(z,磷、钾)= cheby1 (n,美联社、Wn、类型);
情况下“cheby2”
[n, n] = cheb2ord (Fp / (0.5 * Fsamp),置/ (0.5 * Fsamp),美联社,Ast);
(z,磷、钾)= cheby2 (n, Ast, Wn、类型);
否则
错误([“不受万博1manbetx支持的方法:方法]);
结束
%计算响应
SOS = zp2sos (z,磷、钾);
H = freqz (SOS, 2 *π* Fplot / Fsamp);
和FdesignResponse.m:
函数H = FdesignResponse(方法、类型、Fp,置,美联社,Ast, Fsamp, Fplot)
如果isequal(类型,“带通”)
fd = fdesign.bandpass (,Fst1 Fp1 Fp2, Fst2 Ast1,美联社,Ast2”浮置板轨道(1),《外交政策》(1),《外交政策》(2),置板(2),Ast,美联社,Ast, Fsamp);
elseifisequal(类型,“停止”)
fd = fdesign.bandstop (“Fp1 Fst1 Fst2 Fp2, Ap1, Ast, Ap2”浮置板轨道(1)、Fp(1),置板(2),《外交政策》(2),美联社,Ast,美联社,Fsamp);
其他的
错误([“不支万博1manbetx持的过滤器类型:”类型);
结束
d =设计(fd方法);
%计算响应
H = freqz (d, 2 *π* Fplot / Fsamp);

答案(0)

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!