用MATLAB 编写一段零点-极点格型滤波器的程序
时间: 2023-09-22 09:07:56 浏览: 81
lvboqi.zip_matlab vb_滤波器程序
好的,以下是MATLAB代码实现:
```matlab
% 设置滤波器参数
fc = 1000; % 截止频率
fs = 8000; % 采样频率
N = 100; % 滤波器阶数
% 计算零点和极点
fz = [0 fc/fs 2*fc/fs 1]; % 零点
fp = [0.2*fc/fs 0.4*fc/fs 0.6*fc/fs 0.8*fc/fs]; % 极点
% 计算零点-极点系数
b = poly(fz); % 零点系数
a = poly(fp); % 极点系数
% 格型滤波器
H = freqz(b, a, 512, fs);
mag = 20*log10(abs(H));
phi = unwrap(angle(H));
% 画图
subplot(2,1,1);
plot(w, mag);
title('零点-极点格型滤波器幅度特性');
xlabel('频率(Hz)');
ylabel('幅度(dB)');
grid on;
subplot(2,1,2);
plot(w, phi);
title('零点-极点格型滤波器相位特性');
xlabel('频率(Hz)');
ylabel('相位(rad)');
grid on;
```
解释一下代码:
- `fc` 是滤波器的截止频率,这里设置为 1000Hz;
- `fs` 是采样频率,这里设置为 8000Hz;
- `N` 是滤波器的阶数,这里设置为 100;
- `fz` 是零点的位置,这里设置为 `[0 fc/fs 2*fc/fs 1]`;
- `fp` 是极点的位置,这里设置为 `[0.2*fc/fs 0.4*fc/fs 0.6*fc/fs 0.8*fc/fs]`;
- `poly()` 是 MATLAB 自带的函数,用于计算多项式系数;
- `freqz()` 是 MATLAB 自带的函数,用于计算滤波器的频率响应;
- `abs()` 是 MATLAB 自带的函数,用于计算复数的模值;
- `log10()` 是 MATLAB 自带的函数,用于计算以10为底的对数;
- `20*` 是用于将幅度转换为以分贝为单位的常数;
- `unwrap()` 是 MATLAB 自带的函数,用于对相位进行展开,避免相位突变;
- `subplot()` 是 MATLAB 自带的函数,用于在同一张图中画多个图形;
- `plot()` 是 MATLAB 自带的函数,用于画图;
- `title()`、`xlabel()`、`ylabel()`、`grid on` 等是设置图形的标签和样式。
运行这段代码后,就可以看到零点-极点格型滤波器的幅度特性和相位特性了。需要注意的是,要用 `poly()` 函数计算多项式系数,然后传入 `freqz()` 函数中计算滤波器的频率响应。
阅读全文