零相位滤波器matlab实现实例
时间: 2023-08-10 17:04:10 浏览: 52
零相位滤波器可以消除滤波引起的相位延迟,使得滤波后的信号的相位与原信号的相位保持一致。MATLAB提供了firfilt函数和filtfilt函数来实现零相位滤波器。
下面是一个MATLAB实现的例子:
假设我们有一个500Hz的正弦信号,加上50Hz的噪声,采样频率为1000Hz。我们需要设计一个低通滤波器,截止频率为200Hz,实现零相位滤波。
首先,生成信号:
```
fs = 1000; % 采样频率
t = 0:1/fs:1-1/fs; % 时间向量
f1 = 500; % 信号频率
f2 = 50; % 噪声频率
x = sin(2*pi*f1*t) + sin(2*pi*f2*t); % 带噪声的信号
```
然后,设计滤波器:
```
fc = 200; % 截止频率
n = 100; % 滤波器阶数
b = fir1(n, fc/(fs/2)); % FIR低通滤波器系数
```
接着,用firfilt函数实现滤波:
```
y1 = firfilt(b, x); % 非零相位滤波
```
最后,用filtfilt函数实现零相位滤波:
```
y2 = filtfilt(b, 1, x); % 零相位滤波
```
可以用plot函数将原始信号和滤波后的信号进行比较:
```
plot(t, x, t, y1, t, y2);
legend('原始信号', '非零相位滤波', '零相位滤波');
```
完整代码如下:
```
fs = 1000; % 采样频率
t = 0:1/fs:1-1/fs; % 时间向量
f1 = 500; % 信号频率
f2 = 50; % 噪声频率
x = sin(2*pi*f1*t) + sin(2*pi*f2*t); % 带噪声的信号
fc = 200; % 截止频率
n = 100; % 滤波器阶数
b = fir1(n, fc/(fs/2)); % FIR低通滤波器系数
y1 = firfilt(b, x); % 非零相位滤波
y2 = filtfilt(b, 1, x); % 零相位滤波
plot(t, x, t, y1, t, y2);
legend('原始信号', '非零相位滤波', '零相位滤波');
```