我写了个HHT变化去噪去趋势的matlab代码,但是我随机写了个信号,并不能达到去噪效果,哪里出了问题呢。是根据归一化互相关性选取IMF的。
% 生成复杂信号,包括正弦波、方波和高斯噪声
Fs = 1000; % 采样率
t = 0:1/Fs:1; % 时间向量
signal = sin(2*pi*5*t) + square(2*pi*10*t) + 0.5*randn(size(t)); % 信号
%signal=XTrain(170,:);
% 进行 EMD 分解,假设结果存储在 imfs 矩阵中
imfs = emd(signal);
% 计算每个 IMF 与原始信号的交叉相关性
N = size(imfs, 2); % IMF 的数量
ncc_values = zeros(1, N);
figure;
subplot(N+1, 1, 1);
plot(signal, 'k');
title('原始复杂信号');
for i = 1:N
subplot(N+1, 1, i+1);
plot(imfs(:, i), 'b');
title(['IMF ', num2str(i)]);
end
for i = 1:N
% 计算滞后为 0 时的交叉相关性 Rxyi_0
Rxyi_0 = sum(signal .* conj(imfs(:, i))');
% 计算分母 denominator,用于归一化
denominator = sqrt(sum(abs(signal).^2) * sum(abs(imfs(:, i)).^2));
% 计算归一化滞后交叉相关性 ncc
ncc = Rxyi_0 / denominator;
ncc_values(i) = ncc;
end
% 计算阈值 TH
max_ncc = max(ncc_values);
TH = max_ncc / (10 * max_ncc - 3);
% 选择最相关的 IMF(假设需要大于阈值 TH)
relevant_imf_indices = find(ncc_values > TH);
% 重构信号,只使用最相关的 IMF
reconstructed_signal = sum(imfs(:,2:6), 2);
% 绘制原始信号和重构后的信号
figure;
subplot(2,1,1);
plot(signal);
title('Original Signal');
subplot(2,1,2);
plot(real(reconstructed_signal)); % 使用 real() 取实部
title('Reconstructed Signal (Selected IMF)');
公式是如下两张图片

