```
%% 波形相似度分析(MATLAB 2024b 优化版)
% 生成示例数据(含时间偏移和噪声的正弦波)
fs = 100; % 采样率 (Hz)
t = 0:1/fs:2; % 时间向量 (s)
f = 2; % 基频 (Hz)
% 波形1:标准正弦波
signalReference = sin(2*pi*f*t);
% 波形2:加入时移、噪声和幅度变化的波形
timeShift = 0.2; % 时间偏移量 (s)
noiseAmplitude = 0.3; % 噪声幅度
signalTest = 0.8*sin(2*pi*f*(t-timeShift)) + noiseAmplitude*randn(size(t));
% 数据标准化(消除幅度/偏移影响)
signalReference = zscore(signalReference);
signalTest = zscore(signalTest);
%% 方法1:相关系数分析
correlationCoefficient = corr(signalReference(:), signalTest(:));
fprintf('相关系数: %.4f\n', correlationCoefficient);
%% 方法2:动态时间规整 (DTW)
if ~license('test', 'Signal_Toolbox')
error('Signal Processing Toolbox required for DTW');
end
[dtwDistance, ~, ~, dtwPath] = dtw(signalReference, signalTest, 'AbsoluteDistance', false);
dtwSimilarity = 1 / (1 + dtwDistance); % 相似度映射
fprintf('DTW相似度: %.4f (原始距离: %.4f)\n', dtwSimilarity, dtwDistance);
%% 方法3:交叉相关分析
[crossCorrSequence, lags] = xcorr(signalReference, signalTest, 'normalized');
[maxCorr, maxIdx] = max(crossCorrSequence);
optimalLag = lags(maxIdx);
fprintf('最大交叉相关: %.4f (最佳时移: %d samples)\n', maxCorr, optimalLag);
%% 方法4:互信息计算(使用内置函数)
if exist('mutualinfo', 'file')
mi = mutualinfo(signalReference, signalTest, 'NumBins', 20);
fprintf('互信息: %.4f bits (内置函数)\n', mi);
else
% 兼容旧版本的直方图法
numBins = 20;
jointHist = histcounts2(signalReference, signalTest, numBins, numBins);
jointProb = jointHist / sum(jointHist, 'all');
pSignal1 = sum(jointProb, 2);
pSignal2 = sum(jointProb, 1);
H1 = -sum(pSignal1 .* log2(pSignal1 + eps), 'omitnan');
H2 = -sum(pSignal2 .* log2(pSignal2 + eps), 'omitnan');
HJoint = -sum(jointProb .* log2(jointProb + eps), 'all', 'omitnan');
mutualInfo = H1 + H2 - HJoint;
fprintf('互信息: %.4f bits (手动计算)\n', mutualInfo);
end
%% 可视化(使用现代图形布局)
figure('Position', [100 100 1200 800], 'Color', 'w')
tiledLayout(3,1, 'TileSpacing', 'compact');
% 波形对比
nexttile
plot(t, signalReference, 'LineWidth', 1.5, 'DisplayName', '参考波形')
hold on
plot(t, signalTest, 'LineWidth', 1.5, 'DisplayName', '测试波形')
title('波形时空对比')
xlabel('时间 (s)'), ylabel('标准化幅值')
legend('Location', 'northeastoutside')
grid on
xlim([0 2])
% DTW路径
nexttile
plot(dtwPath(:,1), dtwPath(:,2), 'k', 'LineWidth', 1)
hold on
plot([1 length(signalReference)], [1 length(signalTest)], 'r--', 'LineWidth', 1)
title('DTW对齐路径')
xlabel('参考波形索引'), ylabel('测试波形索引')
axis equal tight
box on
% 交叉相关分析
nexttile
stem(lags, crossCorrSequence, 'Marker', 'none', 'LineWidth', 1.5)
hold on
plot(optimalLag, maxCorr, 'ro', 'MarkerSize', 10, 'LineWidth', 2)
title(sprintf('交叉相关峰值: %.2f at lag %d', maxCorr, optimalLag))
xlabel('时移 (samples)'), ylabel('归一化相关系数')
grid on```请将此代码优化为符合matlab2024b的代码