现代信号分析大作业 胎儿心电监护 自适应滤波 LMS RLS 消噪 MATLAB
【2021年5月11日 新增说明】
写下这篇文章已经很久了,应该被很多人阅读过。今日发现我的代码也存在一定问题,详见评论区。但我现在没有精力去完善,希望大家可以自己研究参考文献,修正我错误(应该也是某处小问题导致的)。
解决了旧的错误,又引入了新的错误,为我的误导致歉。向发现问题的各位表示感谢,还是那句话,望后来者有自己的思考。
写在前面
缘由
做现代信号分析大作业,遇到这道题的时候,发现搜索结果给的代码有错误,又找来了往届的大作业,“意外地”都错得一致。我想,可能是某年第一个做这道题的学长学姐做错了,然后就这么流传下来了,或许中间有人同样发现了问题,但是并没有在网上分享出来。所以,为了我之后的学弟学妹不再重蹈覆辙,我写了这篇文章,把我做的结果发出来。
错误参考
搜索出来结果最多的就是下面这篇文章了,里面的这道题代码是错的,不要再抄了。
现代信号分析课程大作业 百度文库
正确参考
我的代码主要是参考下面这篇论文写的,虽然没有MATLAB代码,但有很详细的推导过程和说明,推荐看一看。
基于自适应滤波的胎儿心电信号提取 中国知网
题目要求
利用自适应滤波中LMS和RLS方法进行处理,分析不同阶数、步长及指数加权因子对滤波结果的影响。同时给出迭代次数与滤波器系数,迭代次数与均方误差之间的关系曲线。(20分)(可任选一题)
(1)消除心电图的电源干扰(数据源:X1子目录)。
(2)胎儿心电监护(数据源:X2子目录)。
解答过程
先把我的解答过程发出来,后面再分析原答案到底哪里错了。
消噪原理
滤波器的输入为 s + n 0 s+n_0 s+n0,其中 s s s为有用信号, n 0 n_0 n0为一个与信号 s s s不相关的噪声,滤波器的参考信号为 n 1 n_1 n1, n 1 n_1 n1与信号 s s s不相关,却以某种未知的方式与噪声 n 0 n_0 n0相关,信号经自适应滤波器处理输出 y y y,即 n 0 n_0 n0的估计值,再从原始输入 s + n 0 s+n_0 s+n0中减去 y y y,得到所要提取信号的估计值 e = s + n 0 − y ≈ s e=s+n_0-y \approx s e=s+n0−y≈s 。
本题中,输入信号 d ( n ) d(n) d(n)为母亲腹部心电信号,即胎儿心电和母亲心电的混合信号,参考信号 x ( n ) x(n) x(n)为母亲胸部心电信号,几乎完全由母亲心电组成,滤波器输出 y ( n ) y(n) y(n)为母亲腹部噪声估计,自适应滤波器的目的就在于从母亲心电和胎儿心电混合信号中提取出胎儿心电信号,即 e ( n ) − d ( n ) − y ( n ) e(n)-d(n)-y(n) e(n)−d(n)−y(n)。
数据和代码
其实如果你搜到这篇文章,肯定是有题目才来的,不过我还是贴出来原始数据文件吧:
现代信号分析大作业数据
以下是MATLAB源代码文件,如果没积分的下载的话,我后面也直接贴出来:
胎儿心电监护 MATLAB代码
原始信号
首先把母亲胸部和腹部的原始信号数据显示出来。
MATLAB代码
clear;
%数据
X2_thorax=importdata('怀孕母亲胸部心电图数据.txt');%载入胸部数据,参考信号
X2_abdomen=importdata('怀孕母亲腹部心电图数据.txt');%载入腹部数据,输入信号
%绘图
figure(1);
subplot(2,1,1),plot(X2_thorax);
title('怀孕母亲胸部心电图');
xlabel('采样点');ylabel('幅值');
subplot(2,1,2),plot(X2_abdomen);
title