EMD算法
EMD算法原理和动图讲解:https://www.cnblogs.com/gshang/p/15842773.html
close all;%% 参数设置
fs = 25; % 采样率 (Hz)
T = 20; % 信号时长 (秒)
t = 0:1/fs:T-1/fs; % 时间向量
A = 0.5; % 呼吸信号振幅 (cm)
f_resp = 0.25; % 呼吸频率 (Hz) [每分钟15次]
phi = pi/4; % 初始相位 (rad)
SNR_dB = 5; % 目标信噪比 (dB)%% 生成呼吸信号
signal_clean = A * sin(2*pi*f_resp*t + phi);%% 噪声生成与信噪比控制
% 计算信号功率
signal_power = mean(signal_clean.^2);% 根据SNR计算噪声功率
SNR_linear = 10^(SNR_dB/10);
noise_power = signal_power / SNR_linear;% 生成高斯白噪声
noise = sqrt(noise_power) * randn(size(t));%% 合成带噪声信号
signal_noisy = signal_clean + noise;%% 可视化
figure('Name' ,'生产信号');
% 时域波形
subplot(2,1,1);
plot(t, signal_clean, 'b');
title('呼吸信号时域波形:纯净信号');
xlabel('时间 (s)');
ylabel('幅度 (cm)');
grid on;
subplot(2,1,2);
plot(t, signal_noisy, 'r--');
title('呼吸信号时域波形,信噪比3db:含噪信号');
xlabel('时间 (s)');
ylabel('幅度 (cm)');% 频谱分析
figure('Name' ,'频谱分析');
N = length(signal_clean);
f = (0:N/2)*fs/N;% 计算功率谱密度
[pxx_clean, f_clean] = pwelch(signal_clean, [], [], [], fs);
[pxx_noisy, f_noisy] = pwelch(signal_noisy, [], [], [], fs);
subplot(2,1,1);
plot(f_clean, 10*log10(pxx_clean), 'b');
title('呼吸信号频谱分析 (dB/Hz):纯净信号');
xlabel('频率 (Hz)');
ylabel('功率谱密度');subplot(2,1,2);
plot( f_noisy, 10*log10(pxx_noisy), 'r--');
title('呼吸信号频谱分析 (dB/Hz):含噪信号');
xlabel('频率 (Hz)');
ylabel('功率谱密度');
grid on;%% 验证信噪比
measured_snr = 10*log10(signal_power / var(noise));
fprintf('实际信噪比: %.2f dB\n', measured_snr);% EMD分解
[IMFs, residual] = emd(signal_noisy, 'MaxNumIMF', 5);
% 可视化
figure('Name' ,'可视化');
subplot(6,1,1);
plot(t, signal_noisy);
title('仿真信号');
for i = 1:size(IMFs,2)subplot(6,1,i+1); plot(t,IMFs(:,i));title(['IMF_', num2str(i)]);
end
subplot(6,1,6);
plot(t,residual);
title('残余分量');