用MATLAB设计一个线性相位 FIR 数字高通滤波器。技术指标为ωₚ=0.7π,ωₛₜ=0.5π,Aₛ=55dB,采用布莱克曼窗。画出幅度响应(以dB表示)及相位响应曲线。提供完整代码
时间: 2024-12-19 18:28:54 浏览: 59
在MATLAB中设计一个线性相位FIR数字高通滤波器,通常会使用fir1函数,结合指定的技术指标和窗口函数。以下是一个示例代码,实现了你所描述的需求:
```matlab
% 设定滤波器参数
omega_p = 0.7*pi; % 高通截止频率
omega_s = 0.5*pi; % 带宽上限
As = 55; % 滤波器增益 (dB)
% 确定滤波器长度 (取64次多项式以保证足够快的滚降)
n = round(4 * ((omega_p - omega_s) / pi) + 1); % 直接型FIR设计的最小长度
% 使用布莱克曼窗函数
window = blackman(n);
% 计算滤波系数
[b, a] = fir1(n, [omega_s/(pi*n), omega_p/(pi*n)], 'bandpass', window, 'LinearPhase');
% 检查滤波器是否满足设计要求
[num, den] = zpk(b, a);
freqz(b, a, [0, 1], 1000); % 绘制幅频特性 (dB)
grid on;
title('Magnitude Response (dB)');
xlabel('Frequency (normalized)');
phase_z = unwrap(angle(freqz(b, a, [0, 1]))); % 绘制相频特性
plot(freqz(b, a, [0, 1]), phase_z);
grid on;
title('Phase Response');
xlabel('Frequency (normalized)');
% 查看滤波器增益 (dB)
Gain_db = 20*log10(abs(b));
hold on;
plot(0:1/(fs/n):1, Gain_db, 'r', 'LineWidth', 2);
hold off;
% 提供的代码片段仅用于理解过程,实际运行可能需要添加适当的数据采样率 fs
```
在这个例子中,我们首先计算了滤波器长度n,然后应用布莱克曼窗函数,接着使用fir1函数创建了一个线性相位带通滤波器。`freqz`函数用于绘制幅频特性(频率对数刻度下),`unwrap`函数处理相位数据并绘制相频特性。
注意:为了查看滤波器的实际性能,你需要提供一个采样率`fs`,这将在`freqz`函数中作为输入。
阅读全文