用MATLAB编写一段程序对比格型滤波器和FIR滤波器的相位特性
时间: 2023-11-18 15:05:20 浏览: 27
好的,以下是MATLAB代码实现:
```matlab
% 设置滤波器参数
fc = 1000; % 截止频率
fs = 8000; % 采样频率
N = 100; % 滤波器阶数
% FIR滤波器
b = fir1(N, fc/(fs/2));
[H1, w1] = freqz(b, 1, 512, fs);
phi1 = unwrap(angle(H1));
% 格型滤波器
b = firgr(N, [0 fc/fs 2*fc/fs 1], [1 1 0 0]);
[H2, w2] = freqz(b, 1, 512, fs);
phi2 = unwrap(angle(H2));
% 画图
subplot(2,1,1);
plot(w1, phi1);
title('FIR滤波器相位特性');
xlabel('频率(Hz)');
ylabel('相位(rad)');
grid on;
subplot(2,1,2);
plot(w2, phi2);
title('格型滤波器相位特性');
xlabel('频率(Hz)');
ylabel('相位(rad)');
grid on;
```
解释一下代码:
- `fc` 是滤波器的截止频率,这里设置为 1000Hz;
- `fs` 是采样频率,这里设置为 8000Hz;
- `N` 是滤波器的阶数,这里设置为 100;
- `fir1()` 是 MATLAB 自带的函数,用于设计FIR滤波器;
- `firgr()` 是 MATLAB 自带的函数,用于设计格型滤波器;
- `freqz()` 是 MATLAB 自带的函数,用于计算滤波器的频率响应;
- `angle()` 是 MATLAB 自带的函数,用于计算复数的相位;
- `unwrap()` 是 MATLAB 自带的函数,用于对相位进行展开,避免相位突变;
- `subplot()` 是 MATLAB 自带的函数,用于在同一张图中画多个图形;
- `plot()` 是 MATLAB 自带的函数,用于画图;
- `title()`、`xlabel()`、`ylabel()`、`grid on` 等是设置图形的标签和样式。
运行这段代码后,就可以看到FIR滤波器和格型滤波器的相位特性了。需要注意的是,相位是以弧度为单位的,需要用 `unwrap()` 函数进行展开,避免相位突变的影响。