提供sym8小波,四层全局软阈值滤波源代码,采用Matlab语言编写,可移植性强。
源代码
clear;clc;
load leleccum;
indx = 1:3450;
noisez = leleccum(indx);
wname = 'sym8';
lev = 4;
[c,l] = wavedec(noisez,lev,wname);
[Lo_D,Hi_D,Lo_R,Hi_R] = wfilters(wname);
% threshold value
sigma = wnoisest(c,l,1);%使用库函数wnoisest提取第一层的细节系数来估算噪声的标准偏差
N = numel(noisez);%整个信号的长度
thr = sigma*sqrt(2*log(N));%最终阈值
%全局阈值处理
keepapp = 1;%近似系数不作处理
denoisexs = wdencmp('gbl',c,l,wname,lev,thr,'s',keepapp);
denoisexh = wdencmp('gbl',c,l,wname,lev,thr,'h',keepapp);
sigOut1 = WDEN(noisez, N);
sigOut2 = wden(noisez, 'sqtwolog', 's', 'sln', 4, 'sym8')';
% 作图
plot(noisez)
hold on
plot(denoisexs)
plot(denoisexh)
plot(sigOut1)
plot(sigOut2)
hold off
legend('原始噪声信号', 'matlab软阈值去噪信号', 'matlab硬阈值去噪信号', 'WDEN', 'wden');
函数定义如下:
function sigOut = WDEN(sigIn, sigLen)
% sym8小波,4层全局软阈值滤波
[Lo_D, Hi_D, Lo_R, Hi_R] = wfilters('sym8'); % 滤波器参数
filterLen = length(Lo_D); % 滤波器长度
Scale = 4;
srcLen = sigLen;
msgLen = zeros(Scale + 2, 1);
msgLen(1) = srcLen;
for i = 2 : Scale + 1
exLen = floor((srcLen + filterLen - 1) / 2);
srcLen = exLen;
msgLen(i) = exLen;
end
msgLen(Scale + 2) = srcLen;
allSize = sum(msgLen(2 : end));
dstCoef = WaveDec(sigIn, msgLen, allSize, Scale, Lo_D, Hi_D, filterLen);
pDet = dstCoef(allSize - msgLen(2) + 1 : allSize);
thr = GetThr(pDet, msgLen);
dstCoef = Wthresh(dstCoef, thr, allSize, msgLen(Scale + 1));
sigOut = WaveRec(dstCoef, msgLen, Scale, Lo_R, Hi_R, filterLen);
end
function dstCoef = WaveDec(srcData, msgLen, allSize, Scale, Lo_D, Hi_D, filterLen)
tmpSrc = srcData;
gap = msgLen(2) * 2;
dstCoef = zeros(allSize, 1);
for i = 1 : Scale
curSigLen = msgLen(i);
tmpDst = DWT(tmpSrc, curSigLen, Lo_D, Hi_D, filterLen);
dstCoef(allSize - gap + 1 : allSize - gap + 2 * msgLen(i + 1)) = tmpDst(1 : 2 * msgLen(i + 1));
tmpSrc(1 : msgLen(i + 1)) = tmpDst(1 : msgLen(i + 1));
gap = gap - msgLen(i + 1);
gap = gap + 2 * msgLen(i + 2);
end
end
function dstCoef = DWT(srcData, srcLen, Lo_D, Hi_D, filterLen)
decLen = floor((srcLen + filterLen - 1)/2);
dstCoef = zeros(2 * decLen, 1);
for i = 0 : decLen - 1
for j = 0 : filterLen - 1
k = 2 * i - j + 1;
if k <0 && k >&#61; -filterLen &#43; 1
tmp &#61; srcData(-k);
elseif k >&#61; 0 && k <&#61; srcLen - 1
tmp &#61; srcData(k &#43; 1);
elseif k > srcLen - 1 && k <&#61; srcLen &#43; filterLen - 2
tmp &#61; srcData(2 * srcLen - k);
else
tmp &#61; 0;
end
dstCoef(i &#43; 1) &#61; dstCoef(i &#43; 1) &#43; Lo_D(j &#43; 1) * tmp;
dstCoef(i &#43; 1 &#43; decLen) &#61; dstCoef(i &#43; 1 &#43; decLen) &#43; Hi_D(j &#43; 1) * tmp;
end
end
end
function thr &#61; GetThr(detCoef, msgLen)
detCoef &#61; abs(detCoef);
% detCoef &#61; sort(detCoef);
sigma &#61; median(detCoef)/0.6745;
thr &#61; sigma * sqrt(2 * log(msgLen(1)));
end
function dstCoef &#61; Wthresh(dstCoef, thr, allSize, gap)
for i &#61; gap : allSize - 1
if abs(dstCoef(i &#43; 1)) dstCoef(i &#43; 1) &#61; 0;
else
if dstCoef(i &#43; 1) <0
dstCoef(i &#43; 1) &#61; thr - abs(dstCoef(i &#43; 1));
else
dstCoef(i &#43; 1) &#61; abs(dstCoef(i &#43; 1)) - thr;
end
end
end
end
function dstData &#61; WaveRec(srcCoef, msgLen, Scale, Lo_R, Hi_R, filterLen)
tmpSrcCoef &#61; zeros(2 * msgLen(2), 1);
tmpSrcCoef(1 : 2 * msgLen(Scale &#43; 1)) &#61; srcCoef(1 : 2 * msgLen(Scale &#43; 1));
gap &#61; 2 * msgLen(Scale &#43; 1);
for i &#61; Scale : -1 : 1
curDstLen &#61; msgLen(i);
dstData &#61; IDWT(tmpSrcCoef, curDstLen, Lo_R, Hi_R, filterLen);
if i ~&#61; 1
tmpSrcCoef(1 : curDstLen) &#61; dstData(1 : curDstLen);
tmpSrcCoef(curDstLen &#43; 1 : 2 * curDstLen) &#61; srcCoef(gap &#43; 1 : gap &#43; curDstLen);
gap &#61; gap &#43; msgLen(i);
end
end
end
function recData &#61; IDWT(srcCoef, dstLen, Lo_R, Hi_R, filterLen)
recLen &#61; floor((dstLen &#43; filterLen - 1) / 2);
recData &#61; zeros(dstLen, 1);
for i &#61; 0 : dstLen - 1
recData(i &#43; 1) &#61; 0;
for j &#61; 0 : recLen - 1
k &#61; i - 2 * j &#43; filterLen - 2;
if k >&#61; 0 && k recData(i &#43; 1) &#61; recData(i &#43; 1) &#43; Lo_R(k &#43; 1) * srcCoef(j &#43; 1) &#43; Hi_R(k &#43; 1) * srcCoef(j &#43; 1 &#43; recLen);
end
end
end
end