matlab编写程序实现FIR滤波器设计,具体要求如下:用窗函数法设计一个线性相位FIR低通滤波器,要求Wp=0.22π,Ws=0.36π,Ap=3dB,As=50dB;在屏幕上打印出数字滤波器的频率区间【0,π】上的幅频响应特性曲线|H(e^jw)|和20log10|H(e^jw)|,并在屏幕上打印出单位脉冲响应h(n)的图形和数值,以及滤波器所要求的最小长度N
时间: 2023-07-05 20:31:54 浏览: 192
好的,以下是一个MATLAB实现的程序,可以实现您的要求:
```matlab
% 模拟信号
t = linspace(0, 1, 1000);
x = sin(2 * pi * 10 * t) + sin(2 * pi * 30 * t);
% 计算滤波器的阶数
wp = 0.22 * pi;
ws = 0.36 * pi;
Ap = 3;
As = 50;
delta_p = (10^(0.05 * Ap) - 1) / (10^(0.05 * Ap) + 1);
delta_s = 10^(-0.05 * As);
delta = min(delta_p, delta_s);
N = ceil((As - 8) / (4.57 * (ws - wp)));
% 计算滤波器的截止频率
wc = wp;
% 计算窗口函数
n = 0:N-1;
w = 0.54 - 0.46 * cos(2 * pi * n / (N - 1));
% 计算单位脉冲响应
h = zeros(1, N);
for i = 1:N
if i == (N + 1) / 2
h(i) = wc / pi;
else
h(i) = sin(wc * (i - (N + 1) / 2)) / (pi * (i - (N + 1) / 2));
end
h(i) = h(i) * w(i);
end
% 绘制单位脉冲响应
stem(h)
title('Unit Impulse Response')
xlabel('n')
ylabel('h(n)')
% 计算频率响应
w = linspace(0, pi, 1000);
H = zeros(1, 1000);
for i = 1:1000
for j = 1:N
H(i) = H(i) + h(j) * exp(-1j * w(i) * (j - 1));
end
end
% 绘制幅频响应特性曲线
figure
plot(w, abs(H))
title('Magnitude Frequency Response')
xlabel('w')
ylabel('|H(e^jw)|')
% 绘制20log10|H(e^jw)|
figure
plot(w, 20 * log10(abs(H)))
title('Magnitude Frequency Response (dB)')
xlabel('w')
ylabel('20log10|H(e^jw)|')
% 打印滤波器的最小长度
fprintf('Minimum Filter Length: %d\n', N);
```
在这个程序中,我们首先计算了滤波器的阶数和截止频率,然后使用Hamming窗口函数计算了滤波器的单位脉冲响应,并绘制了它的图形。接着,我们使用单位脉冲响应计算了滤波器的频率响应,绘制了幅频响应特性曲线和20log10|H(e^jw)|,并在屏幕上打印出了滤波器的最小长度。
如果您运行上述代码,您应该能够看到滤波器的单位脉冲响应图形、幅频响应特性曲线、20log10|H(e^jw)|图形和最小长度的输出。
阅读全文