利用FIR滤波器通过FRR方式实现的零相位滤波器
时间: 2023-08-18 17:10:35 浏览: 328
凯泽窗设计线性相位带通FIR滤波器源码_带通滤波器_凯泽窗设计线性相位带通FIR滤波器源码_
5星 · 资源好评率100%
FIR滤波器是一种常用的数字滤波器,可以实现数字信号的滤波处理。FIR滤波器可以通过FRR(Finite Response Filter, 有限冲激响应滤波器)方式实现零相位滤波器。
FRR方式的FIR滤波器可以看作是将一个线性相位的FIR滤波器和一个时延为N/2的反向FIR滤波器级联而成。其中,N为滤波器的阶数。
具体实现步骤如下:
1. 设计一个线性相位的FIR滤波器,截止频率为fc,滤波器的阶数为N。可以使用MATLAB中的fir1函数进行设计。
```
fs = 1000; % 采样频率
fc = 200; % 截止频率
N = 100; % 滤波器阶数
b = fir1(N, fc/(fs/2)); % FIR低通滤波器系数
```
2. 将滤波器系数进行FRR处理,得到一个零相位的FIR滤波器。
```
b_frr = [b(N/2+1:end), zeros(1, N/2), fliplr(b(1:N/2))]; % FRR处理
```
3. 将信号分别进行正向和反向滤波处理,并将结果相加。
```
y1 = filter(b_frr, 1, x); % 正向滤波
y2 = flipud(filter(b_frr, 1, flipud(x))); % 反向滤波
y = (y1 + y2)/2; % 相加平均
```
完整代码如下:
```
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低通滤波器系数
b_frr = [b(N/2+1:end), zeros(1, N/2), fliplr(b(1:N/2))]; % FRR处理
y1 = filter(b_frr, 1, x); % 正向滤波
y2 = flipud(filter(b_frr, 1, flipud(x))); % 反向滤波
y = (y1 + y2)/2; % 相加平均
plot(t, x, t, y);
legend('原始信号', '零相位滤波');
```
可以看到,通过FRR方式实现的零相位FIR滤波器可以有效地消除信号的相位延迟。
阅读全文