matlab - 如何使用 Matlab 绘制巴特沃斯滤波器的频率响应

标签 matlab plot filtering frequency

我试图绘制序列经巴特沃斯低通滤波器滤波后的频率响应。我已经很好地弄清楚了极点和零点图,但似乎无法正确绘制我的频率响应。当我这样做时,我的轴总是超出比例。我尝试过使用Matlab的bode函数,但没有成功。我一直使用的示例输入类似于 buttdes(1000, 2500, -3, -20, 20000)。任何帮助深表感谢!!这是到目前为止我的代码:

function buttdes(fpass, fstop, dp, ds, fs)

%// Design a discrete-time Butterworth filter

%// BUTTDES(fpass, fstop, dp, ds, fs) designs and plots the bode plot

%// of the resulting analog-equivalent filter that has been

%// designed to match the analog parameters fpass (in Hz),

%// fstop (in Hz), dp (in dB) and ds (in dB).

%// fs is the sample rate in Hz

wp = fpass/fs;        
ws = fstop/fs;
WpT = 2 * tan(wp / 2);
WsT = 2 * tan(ws / 2);
qp = log10(10^-(dp/10)-1);
qs = log10(10^-(ds/10)-1);

N = ceil((qs-qp) / 2 / log10(WsT / WpT)); 
WcT = WpT * 10^(-qp/2/N);

k = 0:N-1;
skT = WcT * exp(j*pi*(2*k+N+1)/2/N);

b = real(prod(skT./(skT -2))) * poly(-ones(1, N));
a = real(poly(-(skT+2)./(skT-2)));

zplane(b, a);

最佳答案

为了扩展 Navan 的评论,您可以使用 freqz 命令来计算并绘制滤波器的频率响应。 freqz 位于信号处理工具箱中,因此如果您没有该工具箱,则需要另一种方法。

freqz 通常绘制两张图:(1) 一张振幅响应图,(2) 一张相位响应图。如果你只想要幅度响应,你可以像这样绘制它

%compute the filter response
npoints = 1000;  %how many points to you want?   
[h,f]=freqz(b,a,npoints,fs);
response_dB = 10.*log10(h.*conj(h));
response_deg = 180/pi*angle(h);

% make plot
figure;
semilogx(f,response_dB);
xlabel('Frequency (Hz)');
ylabel('Response (dB)');

关于matlab - 如何使用 Matlab 绘制巴特沃斯滤波器的频率响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30107002/

相关文章:

python - 在同一坐标中绘制/散点位置和标记大小

image - 如何以编程方式识别色情图片?

matlab - 查找带通滤波器的频率响应

matlab - 我可以在不在每个函数中显式调用 import 的情况下全局导入命名空间吗?

matlab - 如何在matlab中保存多维数组?

performance - 矢量化代码比循环慢?软件

matlab - 具有空字符串连接的 Datenum 行为

r - 用plotly制作点状网格线

python - 使用数据帧的行绘制线图,并在 python pandas 中按位置/数字包含特定列

sharepoint - 如何在 Sharepoint 2010 中过滤未评级的项目