MATLAB函数:filtfilt——零相位数字滤波

前言

人生如逆旅,我亦是行人。


一、filtfilt 讲解

  • filtfilt零相位数字滤波。

1、语法

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

2、说明

y = filtfilt(b,a,x) 对输入数据 x 进行正反两个方向的零相位数字滤波。在正向过滤数据之后,该函数将过滤的序列反过来,并通过过滤器运行它。

结果具有以下特点:

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

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


  • y = filtfilt(sos,g,x) 使用由矩阵 sos 和标量 g 表示的二阶节(双二阶)滤波器对输入数据 x 进行零相位滤波。
  • y = filtfilt(d,x) 使用数字滤波器 d 对输入数据 x 进行零相位滤波。使用 designfilt 可基于频率响应规范生成数字滤波器 d

二、示例

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

  • 零相位滤波有助于将滤波后的波形中的特征精确地保留在未滤波信号中的位置。
  • 使用 filtfilt 对合成心电图(ECG)波形进行零相位滤波。QRSECG 中的重要特征。此处从时间 点160 开始。
  • 心电图(ECG)是利用心电图机从体表记录心脏每一心动周期所产生的电活动变化图形的技术。
  • QRS 波群反映左、右心室除极电位和时间的变化,第一个向下的波为 Q波,向上的波为 R波,接着向下的波是 S波
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')

在这里插入图片描述

  • 注: 红线表示的是零相位滤波的效果;蓝色表示的是传统噪声的心电图。

2、产生心电波形的函数

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

三、输入参数

  • y = filtfilt(b,a,x)

  • 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 * 6 矩阵,其中节数 K 必须大于或等于 2。如果节数小于 2,则 filtfilt 会将输入视为 分子向量sos 的每一行对应于一个二阶节(双二阶)滤波器的系数。sos 的第 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 对象,使用 digitalFilter ,根据频率响应规范生成数字滤波器。

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


四、输出参数

  • y :滤波后的信号

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

五、代码生成

使用 MATLAB 可以生成 C 代码。

具体参考:Matlab生成滑动平均滤波算法文件并移植到STM32单片机上运行——基于CubeMX


官方资料:


  • 16
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
MATLAB中的相位滤波可以使用filtfilt函数来实现。该函数的原理是先对信号进行前向滤波,然后将滤波后的序列逆序,再次使用相同的滤波器进行反向滤波,最后再次逆序得到最终结果。这样可以实现相移的滤波效果。然而,filtfilt函数只适用于离线滤波,无法在实时信号中实现相移滤波。 如果想在实时信号中实现相移滤波,可以采用其他方法。例如,可以设计一个全通滤波器,其group delay与待滤波信号的group delay完全相反,然后将两个滤波器级联。这样,两者的group delay将相互抵消,从而实现了相移滤波效果。这种方法可以通过参考一篇CSDN博客文章中的内容进行实现,链接为:http://blog.csdn.net/shenziheng1/article/details/53415642。 另外,如果使用MATLAB进行相位滤波,可以使用filtfilt函数,该函数可以在一次运行中实现前向和反向滤波,并得到相位滤波的结果。代码示例可以参考引用中的MATLAB代码。 总结来说,MATLAB中的相位滤波可以使用filtfilt函数实现,也可以通过设计全通滤波器进行级联来实现。具体选择哪种方法取决于应用的需求和实际情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [实时相位滤波的神话(1)](https://blog.csdn.net/csdn_kike/article/details/69056066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MATLAB函数filtfilt——相位数字滤波](https://blog.csdn.net/WandZ123/article/details/125915042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [实时相位滤波的神话(2)](https://blog.csdn.net/csdn_kike/article/details/69061673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W_oilpicture

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值