MATLAB函数——filtfilt

filtfilt:零相位数字滤波


语法

y = filtfilt(b,a,x)
y = filtfilt(sos,g,x)
y = filtfilt(d,x)


说明

y = filtfilt(b,a,x) 通过正向和反向处理输入数据 x 来实现零相位数字滤波。在对数据正向滤波后,filtfilt 将滤波后的序列反转,然后将其再次通过滤波器。 结果具有以下特征:

  • 零相位失真。
  • 滤波器传递函数等于原始滤波器传递函数的幅度平方。
  • 滤波器阶数是由 ba 指定的滤波器的两倍。

通过匹配初始条件,filtfilt 可以最小化启动和结束瞬态。不要将 filtfilt 与微分器和希尔伯特 FIR 滤波器一起使用,因为这些滤波器的操作在很大程度上取决于其相位响应。举例

y = filtfilt(sos,g,x) 使用由矩阵 sos 和标量 g 表示的二阶节(双二阶)滤波器对输入数据 x 进行零相位滤波。

y = filtfilt(d,x) 使用数字滤波器 d 对输入数据 x 进行零相位滤波。使用 designfilt 可基于频率响应规范生成数字滤波器 d


示例

对心电波形进行零相位滤波

零相位滤波有助于将滤波后的波形中的特征精确地保留在未滤波信号中的位置。

使用 filtfilt 对合成心电图(ECG)波形进行零相位滤波。生成波形的函数在示例的末尾。QRS 是 ECG 中的重要特征。此处从时间点 160 开始。

wform = ecg(500);

plot(wform)
axis([0 500 -1.25 1.25])
text(155,-0.4,'Q')
text(180,1.1,'R')
text(205,-1,'S')

在这里插入图片描述
用附加的噪声干扰心电图。重置随机数生成器以获得可重现的结果。构造低通 FIR 等纹波滤波器,采用零相位滤波和常规滤波相结合的方法对含有噪声的波形进行滤波。

rng default

x = wform' + 0.25*randn(500,1);
d = designfilt('lowpassfir', ...
    'PassbandFrequency',0.15,'StopbandFrequency',0.2, ...
    'PassbandRipple',1,'StopbandAttenuation',60, ...
    'DesignMethod','equiripple');
y = filtfilt(d,x);
y1 = filter(d,x);

subplot(2,1,1)
plot([y y1])
title('Filtered Waveforms')
legend('Zero-phase Filtering','Conventional Filtering')

subplot(2,1,2)
plot(wform)
title('Original Waveform')

在这里插入图片描述
零相位滤波降低了信号中的噪声,同时保留了原信号中的 QRS。传统滤波降低了信号中的噪声,但延迟了 QRS。

使用巴特沃斯二阶节滤波器重复上述操作。

d1 = designfilt('lowpassiir','FilterOrder',12, ...
    'HalfPowerFrequency',0.15,'DesignMethod','butter');
y = filtfilt(d1,x);

subplot(1,1,1)
plot(x)
hold on
plot(y,'LineWidth',3)
legend('Noisy ECG','Zero-Phase Filtering')

在这里插入图片描述
以下是产生心电波形的函数。

function x = ecg(L)
%ECG Electrocardiogram (ECG) signal generator.
%   ECG(L) generates a piecewise linear ECG signal of length L.
%
%   EXAMPLE:
%   x = ecg(500).';
%   y = sgolayfilt(x,0,3); % Typical values are: d=0 and F=3,5,9, etc. 
%   y5 = sgolayfilt(x,0,5); 
%   y15 = sgolayfilt(x,0,15); 
%   plot(1:length(x),[x y y5 y15]);

%   Copyright 1988-2002 The MathWorks, Inc.

a0 = [0,1,40,1,0,-34,118,-99,0,2,21,2,0,0,0]; % Template
d0 = [0,27,59,91,131,141,163,185,195,275,307,339,357,390,440];
a = a0 / max(a0);
d = round(d0 * L / d0(15)); % Scale them to fit in length L
d(15)=L;

for i=1:14,
       m = d(i) : d(i+1) - 1;
       slope = (a(i+1) - a(i)) / (d(i+1) - d(i));
       x(m+1) = a(i) + slope * (m - d(i));
end

end

输入参数


ba - 传递函数系数

传递函数系数,指定为向量。如果使用全极滤波器,输入 1 表示 b。如果使用全零(FIR)滤波器,输入 1 表示 a

举例b = [1 3 3 1]/6a = [3 0 1 0]/3 指定一个归一化 3-dB 频率为 0.5 π \pi π rad / sample 的三阶巴特沃思滤波器。

数据类型double


x - 输入信号

输入信号,指定为实值或复值向量矩阵或 N 维数组。

x 必须是有限值的。若 x 的维度大于 1,filtfilt 沿 x 的第一个维度操作。

举例cos(pi/4*(0:159))+randn(1,160) 是一个单通道行向量信号。

举例cos(pi./[4;2]*(0:159))'+randn(160,2) 是一个双通道信号。

数据类型double
复数支持:是


sos - 二阶节系数

二阶节系数,指定为矩阵

sos 是一个 K × K\times K× 6 矩阵,其中节数 K K K 必须大于或等于 2。如果节数小于 2,则 filtfilt 会将输入视为分子向量。sos 的每一行对应于一个二阶节(双二阶)滤波器的系数。sos 的第 i i i 行对应于 [bi(1) bi(2) bi(3) ai(1) ai(2) ai(3)]

举例s = [2 4 2 6 0 2;3 3 0 6 0 0] 指定一个归一化 3-dB 频率为 0.5 π \pi π rad / sample 的三阶巴特沃思滤波器。

数据类型double


g - 比例因子

比例因子,指定为向量

数据类型double


d - 数字滤波器

数字滤波器,指定为 digitalFilter 对象。 使用 designfilt 根据频率响应规范生成数字滤波器。

举例d = designfilt('lowpassiir','FilterOrder',3,'HalfPowerFrequency',0.5) 指定一个归一化 3-dB 频率为 0.5 π \pi π rad / sample 的三阶巴特沃思滤波器。

数据类型double


输出参数


y - 滤波后的信号

滤波后的信号,以向量矩阵N 维数组的形式返回。


参考

[1] Gustafsson, F. “Determining the initial states in forward-backward filtering.” IEEE® Transactions on Signal Processing. Vol. 44, April 1996, pp. 988–992.

[2] Mitra, Sanjit K. Digital Signal Processing. 2nd Ed. New York: McGraw-Hill, 2001.

[3] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.


扩展功能


C/C++ 代码生成

使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

用法说明和限制:

数字滤波器对象 digitalFilter 不支持代码生成。


另请参阅

designfilt | digitalFilter | fftfilt | filter | filter2

主题

消除信号中的 60 Hz 嗡嗡声
数字滤波实用介绍
反因果零相位滤波器实现


在 R2006a 之前推出


原文参考:https://ww2.mathworks.cn/help/signal/ref/filtfilt.html

  • 23
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值