信号处理中简单实用的方法——消除趋势项

最小二乘法拟合消除趋势项

趋势项又分为线性趋势项和多项式趋势项,在许多实际信号获取后都有一些基线的漂移,这可能是采集系统引起的,也可能是信号本身引起的,但在信号处理之前要消除这种漂移,称为消除趋势项。
在实际处理中,信号中的趋势项往往比较复杂。本次介绍最小二乘法拟合消除多项式的趋势项。

消除趋势项函数

在MATLAB的工具箱中已有消除线性趋势项的detrend函数;本次介绍以最小二乘法拟合消除趋势项的polydetrend 函数。
函数:detrend
功能:消除线性趋势项
调用格式:y=detrend(x)
说明:输入参数x是带有线性趋势项的信号序列,输出参数y是消除趋势项的序列。
函数:polydetrend
功能:最小二乘法拟合消除多项式的趋势项
调用格式:[y,xtrend]=polydetrend(x,fs,m)
说明:输入参数x是带有趋势项的信号,fs是采样频率,m是调用本函数时设置的多项
式阶次。输出参数y是消除趋势项后的信号序列,xtrend是叠加在信号上的趋势项序列。
函数polydetrend的程序清单如下:

function [y,xtrend]=polydetrend(x, fs, m)
x=x(:);                 % 把语音信号x转换为列数据
N=length(x);            % 求出x的长度
t= (0: N-1)'/fs;        % 按x的长度和采样频率设置时间序列
a=polyfit(t, x, m);     % 用最小二乘法拟合语音信号x的多项式系数a
xtrend=polyval(a, t);   % 用系数a和时间序列t构成趋势项
y=x-xtrend;             % 从语音信号x中清除趋势项

基线漂移的修正案例:读人已知的心电图数据,用最小二乘法拟合消除基线的漂移。程序清单如下:

% 
clear all; clc; close all;

load ecgdata2.mat                   % 读入心电图数据
N=length(y);                        % 数据长度
time=(0:N-1)/fs;                    % 计算出时间刻度
[x,xtrend]=polydetrend(y, fs, 3);   % 用多项式拟合法求出趋势项及消除后的序列
% 作图
subplot 311; plot(time,y,'k')
title('输入心电信号'); ylabel('幅值');
axis([0 max(time) -2000 6000]); grid;
subplot 312; plot(time,xtrend,'k','linewidth',1.5);
title('趋势项信号'); ylabel('幅值');
axis([0 max(time) -2000 6000]); grid;
subplot 313; plot(time,x,'k'); 
title('消除趋势项心电信号'); ylabel('幅值');
xlabel('时间/s');
axis([0 max(time) -2000 6000]); grid;
set(gcf,'color','w');

运行结果如下图所示:

 心电图数据链接如下:

https://download.csdn.net/download/qq_42233059/86405498

除了以最小二乘法拟合消除趋势项以外,还有其他方法可以消除趋势项,只是最小二乘法拟合的方法用得较多。其他的方法主要是一些平滑或滤波的方法,只取信号中的低频信号。例如可以用sgolay滤波器求取趋势项。sgolay滤波器是由Savitzky A和Golay M在1964年提出的一种基于多项式拟合的最佳形式的低通滤波器。下面给出用sgolay 滤波器对心电图数据消除趋势项的方法。

基线漂移的修正案例:读人已知的心电图数据,用sgolay 滤波器消除基线的漂移。程序清单下:

clear all; clc; close all;

load ecgdata2.mat                   % 读入心电图数据
N=length(y);                        % 数据长度
time=(0:N-1)/fs;                    % 计算出时间刻度
y1=sgolayfilt(y,3,1001);            % 用sgolay滤波器求出趋势项
x=y-y1;                             % 计算消除趋势项后的序列
% 作图
subplot 311; plot(time,y,'k')
title('输入心电信号'); ylabel('幅值');
axis([0 max(time) -2000 6000]); grid;
subplot 312; plot(time,y1,'k','linewidth',1.5);
title('趋势项信号'); ylabel('幅值');
axis([0 max(time) -2000 6000]); grid;
subplot 313; plot(time,x,'k'); 
title('消除趋势项心电信号'); ylabel('幅值');
xlabel('时间/s');
axis([0 max(time) -2000 6000]); grid;
set(gcf,'color','w');

运行结果如下:

 线性函数拟合消除线性趋势项

基线漂移的修正案例:读人已知的一组实验数据,用线性函数拟合消除基线的漂移。程序清单如下:

clear all; clc; close all;

load qldata.mat                  % 读入数据
N=length(y);                     % 数据长度
time=(0:N-1)/fs;                 % 时间刻度
% 第一部分
Y=fft(y);                        % FFT
n2=1:N/2+1;                      % 取正频率索引序列
freq=(n2-1)*fs/N;                % 频率刻度
% 作图
subplot 211; plot(time,y,'k'); ylim([0 15]); grid;
title('有趋势项的数据')
xlabel('时间/s'); ylabel('幅值');
subplot 212; plot(freq,abs(Y(n2)),'k')
title('有趋势项的数据频谱')
xlabel('频率/Hz'); ylabel('幅值');
set(gcf,'color','w');
pause
% 第二部分
x=detrend(y);                    % 消除趋势项
X=fft(x);                        % FFT
% 作图
figure
subplot 211; plot(time,x,'k'); ylim([-5 5]); grid;
title('消除趋势项后的数据')
xlabel('时间/s'); ylabel('幅值');
subplot 212; plot(freq,abs(X(n2)),'k');
title('消除趋势项后的数据频谱')
xlabel('频率/Hz'); ylabel('幅值');
set(gcf,'color','w');

运行结果如下:

 

 实验数据qldata.mat下载链接如下:

https://download.csdn.net/download/qq_42233059/86405503

参考文献:MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著) 

  • 8
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Matlab数字信号处理85个实用案例精讲》是一本面向数字信号处理初学者和进阶者的实用案例教程。书以实际案例为主线,结合数字信号处理的理论知识,全面介绍了Matlab在数字信号处理领域的应用技巧。该书共分为三个部分,分别是基础篇、进阶篇和应用篇。 在基础篇,书首先介绍了Matlab的基本操作和数字信号处理的基本概念,包括信号的基本特征、采样与重构、时域分析和频域分析等内容。通过具体案例的讲解,读者可以系统地学习Matlab数字信号处理的基本知识,并能够掌握常用的信号处理方法和技巧。 进阶篇则深入介绍了Matlab在数字信号处理的高级应用,包括数字滤波器设计、信号的时频分析、小波分析等内容。通过学习这部分内容,读者可以进一步提高对Matlab数字信号处理工具箱的应用水平,能够独立地进行数字信号处理的设计和实现。 最后的应用篇则通过多个实际案例,如语音信号处理、图像处理和通信系统仿真等,展示了Matlab数字信号处理在各个领域的实际应用。通过这些案例的学习,读者可以更加深入地理解Matlab数字信号处理在各个领域的应用场景,为以后的工程实践做好准备。 总的来说,《Matlab数字信号处理85个实用案例精讲》涵盖了数字信号处理的入门到进阶所需的知识和技能,并通过丰富的案例教学帮助读者更好地理解和掌握数字信号处理的实际应用。无论是初学者还是已有一定基础的读者,都可以从受益匪浅。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值