循环平移算法由Coifman和Donoho最先提出,其基本原理是将信号进行循环平移,将平移后的信号降噪后再做逆循环平移,改变平移位数,多次重复上述运算,将获得的所有结果求平均,得到最后的结果。
在理想情况下,选择一个优质的平移位数,就可以获得最小震荡的信号,但往往信号含有多个奇异点,一个平移位数可能使信号中的一些奇异点位置振荡降低,对于其他位置却反之,很难由一个循环位数h,确定其对所有的奇异点位置都最佳,采用多次循环的方法,并将每次获得的结果求平均,降低震荡得到更加接近真实信号。
鉴于此,采用一循环平移小波降噪方法对一维时间序列信号进行降噪,运行环境为MATLAB R2021b。
switch numcase {1,'blocks'} % blocks.tt = linspace(0,1,len); x = zeros(1,len);for j=1:11x = x + ( h(j)*(1+sign(tt-t(j)))/2 );endcase {2,'bumps'} % bumps.h = abs(h);w = 0.01*[0.5 0.5 0.6 1 1 3 1 1 0.5 0.8 0.5];tt = linspace(0,1,len); x = zeros(1,len);for j=1:11x = x + ( h(j) ./ (1+ ((tt-t(j))/w(j)).^4));endcase {3,'heavy sine'} % heavy sine.x = linspace(0,1,len);x = 4*sin(4*pi*x) - sign(x-0.3) - sign(0.72-x);case {4,'doppler'} % doppler.x = linspace(0,1,len);epsil = 0.05;x = sqrt(x.*(1-x)) .* sin( 2*pi*(1+epsil) ./ (x+epsil) );case {5,'quadchirp'} % quadchirp.t = linspace(0,1,len);x = sin( (pi/3) * t .* (len * t.^2) );case {6,'mishmash'} % mishmash.t = linspace(0,1,len);x = sin( (pi/3) * t .* (len * t.^2) );x = x + sin( pi * (len * 0.6902) * t );x = x + sin( pi * t .* (len * 0.125 * t) );完整代码:https://mbd.pub/o/bread/YpyYlp5uotherwiseerrargt(mfilename, ...getWavMSG('Wavelet:FunctionArgVal:Invalid_ArgVal'),'msg');error(message('Wavelet:FunctionArgVal:Invalid_ArgVal'));
工学博士,担任《Mechanical System and Signal Processing》《中国电机工程学报》《控制与决策》等期刊审稿专家,擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。