加权平均、EMD、小波等方法去噪效果对比

加权平均、EMD、小波等方法去噪效果对比

代码

整体代码如下

javascript 复制代码
%%
clear all;
clc;

load('data_filter120Hz.mat'); %可自己生成随机噪声
fs=1000;%采样频率是1000Hz
%%
%生成正弦波信号
t=linspace(0, length(data)/fs-1/fs, length(data));
y1 =15*sin(2*pi* 2.8 *t);%生成频率为2.8Hz,幅值为15的正弦波
y2 =10*sin(2*pi* 10.5 *t);%生成频率为10.5Hz,幅值为10的正弦波
y3 =3*sin(2*pi* 27 *t);%生成频率为27Hz,幅值为3的正弦波
y4 =0.5*sin(2*pi* 43 *t);%生成频率为43Hz,幅值为0.5的正弦波

y_Sin =y1+y2+y3+y4;
% y_Sin =y1+y2+y3;

y = y_Sin'+data;
%%
saveTime =1;
signal = y(1:saveTime*fs);
dlmwrite('MultiSinWaveWithNoise_1s.txt',signal,'delimiter',' ');

saveTime =10;
signal = y(1:saveTime*fs);
dlmwrite('MultiSinWaveWithNoise_10s.txt',signal,'delimiter',' ');

%%
figure;
subplot(3,1,1);
plot(data);
title('noise');
subplot(3,1,2);
plot(y_Sin);
title('sin wave');
subplot(3,1,3);
plot(y);
title('sin wave + noise');


figure;
plot(y_Sin);
hold on;
plot(y);
legend({'raw','with noise'});

%%
p=0.9;
preTemp =0;
for i=1:length(y)
    y_winAve(i) = preTemp*(1-p)+ y(i)*p;
    preTemp = y_winAve(i);    
end

error_noise = sum(abs(data));
error_winave = sum(abs(y_winAve -y_Sin));

%%
figure;
plot(y_Sin);
hold on;
plot(y_winAve);
legend({'raw','win ave'});

figure;
plot(y);
hold on;
plot(y_winAve);
legend({'raw+noise','win ave'});


%% emd method
emd_num = 2;

imf = emd(y);
y_emd =sum(imf(:,emd_num:end),2);
figure;
plot(y);
hold on;
plot(y_emd);
title('emd denoise');

error_emd = sum(abs(y_emd' -y_Sin));

%% wpdencmp
wpden_num =3;

[thr,sorh,deepapp,crit]=ddencmp('den','wp',y);
[y_wpden,~,~,~]=wpdencmp(y,sorh,wpden_num,'sym6',crit,thr,deepapp);
figure;
plot(y);
hold on;
plot(y_wpden);
title('wpdencmp');

error_wpden = sum(abs(y_wpden' -y_Sin));


%% winave 2nd method
p2 =0.85;
winLen =10;
preTemp =0;
for i=1:length(y)
    if(i<length(y)-winLen)
        if(winLen>=i)
            preTemp =mean(y(1:i+winLen));
        else
            preTemp =mean(y(i-winLen:i+winLen));
        end
    else
        preTemp =mean(y(i-winLen:length(y)));
    end
    
    y_winAve02(i) = preTemp*(1-p2)+ y(i)*p2;
    preTemp = y_winAve02(i); 
end

error_winave02 = sum(abs(y_winAve02 -y_Sin));

figure;
plot(y);
hold on;
plot(y_winAve02);
legend({'raw+noise','win ave 02'});

%%
close all;

效果

从结果上去看,上述参数中,去噪效果:

小波 >EMD >加权平均 >移动平均(具体设置看上方代码)

Matlab转c++

emd和小波去噪的C++代码效果和matlab自带的效果不太一致(可能是我设置的问题),但都能达到去噪的效果,此时emd效果最好,小波的效果需要调整软阈值的值来优化(0.5->1);

EMD代码
小波代码

相关推荐
XiaoLeisj16 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
Jasmine_llq35 分钟前
《 火星人 》
算法·青少年编程·c#
闻缺陷则喜何志丹1 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
Lenyiin1 小时前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿1 小时前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v1 小时前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组