用双线性变换法、用脉冲响应不变法设计一个Butterworth低通滤波器,要求通带截止频率100Hz,阻带截止频率200Hz,通带衰减Rp小于2dB, 阻带衰减Rs大于15dB,采样频率500Hz。写出MATLAB代码
时间: 2024-12-20 13:31:46 浏览: 52
在MATLAB中,我们可以使用`butter`函数结合`designWithMargins`函数来设计Butterworth低通滤波器。双线性变换(Bilinear Transform)用于将连续时间滤波器的设计映射到离散时间系统,而脉冲响应不变法则是直接基于离散系统的特性。以下是按照给定条件设计滤波器的步骤:
首先,我们需要计算转换后的截止频率。对于500Hz的采样率,我们有fs = 500 Hz,所以:
```python
fs = 500; % 采样频率
f_c_low = 100; % 通带截止频率 (Hz)
f_c_high = 200; % 阻带截止频率 (Hz)
% 转换比例,从连续到离散
T_s = 1 / fs;
# 连续时间截止频率
f_low_cont = f_c_low;
f_high_cont = f_c_high * fs / (fs - 2 * f_c_high);
% 双线性变换公式
a = 1 - T_s * f_high_cont;
b = 1 + T_s * f_high_cont;
```
然后使用`designWithMargins`函数设计滤波器,指定通带和阻带的衰减目标:
```matlab
rp = 2; % 通带衰减目标 (dB)
rs = 15; % 阻带衰减目标 (dB)
[b, a] = butter(4, [f_low_cont f_high_cont]', 'low', 'stop', rp, rs); % 4阶 Butterworth 滤波器
% 显示滤波器系数
[num, den] = tf2zpk(b, a);
filter_order = length(b) - 1;
```
最后,为了验证设计结果,我们可以绘制幅频响应:
```matlab
[h, w] = freqs(b, a, 500); % 创建频率响应
figure;
title('Butterworth Lowpass Filter Design');
plot(w/pi, 20*log10(abs(h)));
xlabel('Normalized Frequency (π rad/sample)');
ylabel('Magnitude (dB)');
grid on;
```
现在,您已经得到了满足条件的Butterworth滤波器的系数。如果您想看到具体的MATLAB代码,可以复制粘贴上述代码到MATLAB环境中运行。
阅读全文