概述
前言
人生如逆旅,我亦是行人。
一、filtfilt
讲解
filtfilt
:零相位数字滤波。
1、语法
y = filtfilt(b,a,x)
y = filtfilt(sos,g,x)
y = filtfilt(d,x)
2、说明
y = filtfilt(b,a,x)
对输入数据 x
进行正反两个方向的零相位数字滤波。在正向过滤数据之后,该函数将过滤的序列反过来,并通过过滤器运行它。
结果具有以下特点:
- 零相位失真;
- 滤波器传递函数等于原始滤波器传递函数的幅度平方;
- 滤波器阶数是由
b
和a
所指定的过滤器的两倍;
通过匹配初始条件,filtfilt
可以 最小化启动 和 结束瞬态。 不要将 filtfilt
与微分器和希尔伯特 FIR
滤波器一起使用,因为这些滤波器的操作在很大程度上取决于其相位响应。
y = filtfilt(sos,g,x)
使用由矩阵sos
和标量g
表示的二阶节(双二阶)滤波器对输入数据x
进行零相位滤波。y = filtfilt(d,x)
使用数字滤波器d
对输入数据x
进行零相位滤波。使用designfilt
可基于频率响应规范生成数字滤波器d
。
二、示例
1、对心电波形进行零相位滤波
- 零相位滤波有助于将滤波后的波形中的特征精确地保留在未滤波信号中的位置。
- 使用
filtfilt
对合成心电图(ECG
)波形进行零相位滤波。QRS
是ECG
中的重要特征。此处从时间 点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)
-
b
和a
:传递函数系数传递函数系数,指定为 向量 。 如果使用 全级滤波器 ,输入
1
表示b
;如果使用 全零(FIR
)滤波器 ,输入1
表示a
。- 举例:
b = [1 3 3 1]/6
和a = [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
四、输出参数
-
滤波后的信号,以 向量,矩阵 或 N 维数组 的形式返回。y
:滤波后的信号
五、代码生成
使用 MATLAB 可以生成 C 代码。
具体参考:Matlab生成滑动平均滤波算法文件并移植到STM32单片机上运行——基于CubeMX
官方资料:
- 数字滤波实践介绍
- 从信号中去除 60 Hz 杂声
- 反因果,零相位滤波器的实现
最后
以上就是微笑芒果为你收集整理的MATLAB函数:filtfilt——零相位数字滤波前言一、filtfilt 讲解二、示例三、输入参数四、输出参数五、代码生成官方资料:的全部内容,希望文章能够帮你解决MATLAB函数:filtfilt——零相位数字滤波前言一、filtfilt 讲解二、示例三、输入参数四、输出参数五、代码生成官方资料:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复