%%%%%%%%%%%%%%%%%%心电信号降噪
%%%%%%%%%%%%%%%Birge-Massart策略阈值降噪
%基于小波变换的心电信号的降噪
ecg=fopen('100dat','r');% 调用心电数据库 r为只读,ecg是打开文件的识别符
N=1201;%常数赋值,要读数据个数
data=fread(ecg,N,'int16'); %从一个流中读N个数据,数据格式是int16,16进制整数
data=data/10000;%数据缩小10000倍
fclose(ecg);%关闭打开的文件
x=data;%把数据转赋给x变量
wavename='db5'; %db5是小波名
level=4;%4级分解
[c,l]=wavedec(x,level,wavename); %4级小波分解,c保存各级分解系数,l是薄记矩阵,保存各级的系数的个数
alpha=15; %15用于信号压缩,3用于降噪
sorh='h'; %为硬阈值
[thr,nkeep]=wdcbm(c,l,alpha);%使用Birgé-Massart策略计算一维小波分解或压缩的阈值thr和各级的系数个数nkeep
[xc,cxc,lxc,perf0,perfl2]=wdencmp('lvd',c,l,wavename,level,thr,sorh); %小波压缩重构后的图像
t1=0:0004:(length(x)-1)0004;%一行数据
figure(4);%打开一个图形窗口
subplot(211); %子图1
plot(t1,x);%画图形
title('从人体采集的原始的ECG信号');%加上子图名称
subplot(212);%子图2
plot(t1,xc);%画图形
title('Birge-Massart策略阈值降噪后的ECG信号(wname=db5 level=4)');%加上子图名称
matlab读取excel文件比较方便,建议你把数据放到xls文件中保存,然后在matlab中用xlsread这个函数读取出来。
读取出的数据应该是一个一维数组了,用plot画出图的话,就是常见的曲线。
然后做小波分解:选用你觉得合适的小波基,例如haar,然后用这个小波基做小波分解,再把高频部分去掉,然后用低频部分还原,就得到了去噪后的信号。
其实你这个问题估计也可以用神经网络或者其它曲线拟合一类手段来解决。具体的情况要根据数据特征来判断。
以上。
专业路过的老狼
不好意思,没看到维纳滤波,程序就不删了
%谱减法语音增强
%输入参数s 语音数据,fs 采样频率,p 下面有说明,共11个,可不输入,有默认值
%“过度减法(oversubtraction)”作减法的时候,保留一小部分原来的背景噪音,用这部分背景噪音来掩盖住音乐噪音的谱峰,从而消除了令人不悦的音乐噪音。
%通过给的参数p,估计噪音,做谱减法。从而消除噪音。
function [ss,po]=specsubm(s,fs,p)
%利用频谱相减(spectral subtraction)增强 [SS,PO]=(S,FS,P)
%
% implementation of spectral subtraction algorithm by R Martin (rather slow)
% algorithm parameters: t in seconds, f in Hz, k dimensionless
% 1: tg = smoothing time constant for signal power estimate (004): high=reverberant, low=musical
% 2: ta = smoothing time constant for signal power estimate
%
used in noise estimation (01)
% 3: tw = fft window length (will be rounded up to 2^nw samples)
% 4: tm = length of minimum filter (15): high=slow response to noise increase, low=distortion
% 5: to = time constant for oversubtraction factor (008)
% 6: fo = oversubtraction corner frequency (800): high=distortion, low=musical
% 7: km = number of minimisation buffers to use (4): high=waste memory, low=noise modulation
% 8: ks = oversampling constant (4)
% 9: kn = noise estimate compensation (15)
% 10:kf = subtraction floor (002): high=noisy, low=musical
% 11:ko = oversubtraction scale factor (4): high=distortion, low=musical
%检查函数的输入参数,如果输入少于三个,po为默认值,po的参数上面有说明
if nargin<3 po=[004 01 0032 15 008 400 4 4 15 002 4]'; else po=p; end
ns=length(s);
ts=1/fs;
ss=zeros(ns,1);
ni=pow2(nextpow2(fspo(3)/po(8)));
ti=ni/fs;
nw=nipo(8);
nf=1+floor((ns-nw)/ni);
nm=ceil(fspo(4)/(nipo(7)));
win=05hamming(nw+1)/108;win(end)=[];
zg=exp(-ti/po(1));
za=exp(-ti/po(2));
zo=exp(-ti/po(5));
px=zeros(1+nw/2,1);
pxn=px;
os=px;
mb=ones(1+nw/2,po(7))nw/2;
im=0;
osf=po(11)(1+(0:nw/2)'fs/(nwpo(6)))^(-1);
imidx=[13 21]';
x2im=zeros(length(imidx),nf);
osim=x2im;
pnim=x2im;
pxnim=x2im;
qim=x2im;
for is=1:nf
idx=(1:nw)+(is-1)ni;
x=rfft(s(idx)win);
x2=xconj(x);
pxn=zapxn+(1-za)x2;
im=rem(im+1,nm);
if im
mb(:,1)=min(mb(:,1),pxn);
else
mb=[pxn,mb(:,1:po(7)-1)];
end
pn=po(9)min(mb,[],2);
%os= oversubtraction factor
os=zoos+(1-zo)(1+osfpn/(pn+pxn));
px=zgpx+(1-zg)x2;
q=max(po(10)sqrt(pn/x2),1-sqrt(ospn/px));
ss(idx)=ss(idx)+irfft(xq);
end
if nargout==0
soundsc([s; ss],fs);
end
是不能得出我家钥匙不如你家钥匙的结论滴,所以其一是可增加分解层数,你这个信号只有100个数,其实不易得到满意效果,你只能选择线性强的小波基,你这试验只适合你的假设,其实并不适合所有情形,个人认为其实不具说服力和可比性。如同我家钥匙开不了你家门,效果还行。
以上就是关于急!!!在线等,求解答:一个小波去噪的matlab程序,高手进全部的内容,包括:急!!!在线等,求解答:一个小波去噪的matlab程序,高手进、用matlab中工具箱进行小波去噪步骤、用Matlab语言编写一个语音信号或图象信号去噪的程序请高手帮忙等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)