利用 MATLAB 编程,用脉冲响应不变法和双线性变换法设计一个数字带通滤波器,指标要求如下: 通带边缘频率:0.45π 和0.65π ,通带峰值起伏:小于等于1dB ; 阻带边缘频率:0.3π和0.8π ,最小阻带衰减大于等于40dB 。
时间: 2024-12-13 16:24:11 浏览: 18
在MATLAB中,设计数字带通滤波器通常使用firpm函数(有限 impulse response (FIR) 滤波器的设计)结合脉冲响应不变法(Parks-McClellan算法)以及双线性变换(Bilinear Transformation)。以下是大致步骤:
1. **确定滤波器系数**:
使用`firpm`函数来设计一个低通滤波器,其截止频率位于0.3π和0.8π之间,然后通过倒置它的频率响应得到高通部分。接着将这两个部分组合起来,形成一个带通滤波器。为了满足1dB的通带峰值起伏要求,我们需要调整滤波器系数以保证在0.45π到0.65π之间的增益波动不超过1dB。
```matlab
% 定义滤波器参数
f_pass = [0.45 0.65]; % 通带边频
f_stop = [0.3 0.8]; % 阻带边频
pass_atten = 1; % 通带峰值起伏(1dB)
stop_atten = 40; % 阻带最小衰减(40dB)
% 设计低通滤波器,再取反得到高通部分
b_lowpass = firpm(n, f_stop, 'bandpass', pass_atten);
b_highpass = -firpm(n, f_pass, 'high', pass_atten);
% 组合成带通滤波器
b_bp = b_lowpass + b_highpass;
```
2. **双线性变换**:
要将模拟滤波器转换为数字滤波器,需要应用双线性变换(DBLT),它保持频率的映射关系。这可以使用`dblt`函数完成。
```matlab
fs = 1; % 或者实际采样率
[b_bp_num, b_bp_den] = dblt(b_bp, fs);
```
这里生成了数字滤波器的分数阶多项式形式(numerator)和分母(denominator)。
3. **评估滤波器性能**:
用`freqz`函数绘制滤波器的幅度响应,并检查是否满足设计要求。
```matlab
[h, w] = freqz(b_bp_num, b_bp_den, 1024); % 运行快速傅立叶变换
plot(w/pi, 20*log10(abs(h))) % 绘制幅频特性曲线
grid on
xlabel('Normalized Frequency (\pi rad/sample)')
ylabel('Magnitude (dB)')
```
阅读全文