vmd分解联合小波阈值降噪MATLAB代码。具体实现功能如下: 1.数据加载与预处理 数据从CSV文件读取并转换为数组,处理了多列数据的情况。 采样频率 Fs 设置为1000 Hz,这是后续时频分析的
vmd分解联合小波阈值降噪MATLAB代码。具体实现功能如下1.数据加载与预处理数据从CSV文件读取并转换为数组处理了多列数据的情况。采样频率 Fs 设置为1000 Hz这是后续时频分析的基础。2.参数初始化VMD分解参数如带宽约束 alpha、模态数 K 等和小波基选择如 db4均已合理设置。定义了最大迭代次数和误差阈值来控制去噪算法的迭代收敛。3.VMD分解与小波阈值去噪对分解得到的各模态进行小波阈值去噪软阈值再将去噪后的模态合成为最终信号。通过信噪比SNR、均方误差MSE等指标监控去噪性能。4.性能指标计算与结果分析用RMSE、最终SNR、相关系数等评估去噪效果。输出了多种可视化结果包括原始信号与去噪信号的对比、误差收敛、模态能量分布等。5.高级分析模态分解后的频谱分析、希尔伯特谱、时间频率分布、模态间相关性、样本熵、谱熵和时频聚集度等全面分析了模态特性。提供了丰富的图形展示包括2D和3D图。专业的 VMD (变分模态分解) 联合小波阈值降噪 MATLAB 代码。 代码特点完整流程数据读取 - VMD 分解 - 各模态小波阈值去噪 - 信号重构。自适应参数包含 VMD 核心算法无需外部工具箱支持自定义 K 和 alpha。多维评估计算 SNR, RMSE, MSE, 相关系数。高级分析集成样本熵 (Sample Entropy)、谱熵 (Spectral Entropy)、希尔伯特谱 (Hilbert Spectrum)、时频聚集度分析。可视化丰富包含 2D 对比图、模态能量分布、3D 时频图、误差收敛曲线等。 使用说明将代码保存为 VMD_Wavelet_Denoising.m。准备一个 CSV 文件第一列为时间或索引第二列为信号或者直接使用代码内置的模拟含噪信号演示模式。✅ 完整 MATLAB 代码%% 1. 数据加载与预处理 fprintf(--- 步骤 1: 数据加载 ---n); % 【选项 A】使用模拟数据演示 (推荐首次运行) useMockData true; % 【选项 B】从 CSV 读取 (取消注释以下行并使用真实文件) % useMockData false; % [file, path] uigetfile(*.csv, 选择数据文件); % if isequal(file,0), error(未选择文件); end % rawData readmatrix(fullfile(path, file)); % signal rawData(:, 2); % 假设第二列是信号 % Fs 1000; % 设置采样频率 if useMockData Fs 1000; % 采样频率 1000 Hz T 2; % 时长 2 秒 t (0:1/Fs:T-1/Fs); % 构造复杂信号低频趋势 两个高频分量 强高斯噪声 s_clean 0.sin(2p50t) 0.cos(2p120t) 0.sin(2p200t); noise 0.8 * randn(size(t)); signal s_clean noise; fprintf(已生成模拟信号长度 %d, 采样率 %d Hz, 含噪 SNR ≈ %.2f dBn, ... length(signal), Fs, 10*log10(var(s_clean)/var(noise))); else signal double(signal); % 确保双精度 if size(signal, 2) 1, signal signal(:, 1); end % 取单列 end N length(signal); timeVec (0:N-1) / Fs; %% 2. 参数初始化 fprintf(--- 步骤 2: 参数初始化 ---n); % VMD 参数 K 5; % 模态分解个数 (根据信号复杂度调整) alpha 2000; % 带宽约束因子 (越大带宽越窄) tau 0; % 噪声容忍度 (0 表示严格拟合) DC 0; % 是否保留直流分量 (0:不保留, 1:保留第一个模态) init 1; % 初始化方式 (1:随机, 2:均匀) tol 1e-7; % 收敛容差 % 小波去噪参数 waveletName db4; % 小波基 decompLevel 4; % 小波分解层数 thresholdRule sqtwolog; % 阈值规则 (sqtwolog, heursure, minimaxi) thresholdMode s; % 阈值类型 (s:软阈值, h:硬阈值) fprintf(VMD 参数: K%d, alpha%dn, K, alpha); fprintf(小波参数: Bas%s, Level%d, Mode%sn, waveletName, decompLevel, thresholdMode); %% 3. VMD 分解与小波阈值去噪 fprintf(--- 步骤 3: VMD 分解与小波去噪 ---n); % 3.1 执行 VMD 分解 % u: 分解出的模态 (N x K), u_hat: 频谱, centerFreq: 中心频率 [u, u_hat, centerFreq] VMD_Algorithm(signal, K, alpha, tau, DC, init, tol); fprintf(VMD 分解完成得到 %d 个模态。n, K); % 3.2 对每个模态进行小波阈值去噪 u_denoised zeros(size(u)); energyDist zeros(K, 1); parfor k 1:K % 计算该模态的能量 energyDist(k) sum(u(:,k).^2); % 小波分解 [C, L] wavedec(u(:,k), decompLevel, waveletName); % 获取阈值 thr thselect(C, thresholdRule); % 应用阈值 (软阈值) C_denoised wthresh(C, thresholdMode, thr); % 重构去噪后的模态 u_denoised(:,k) waverec(C_denoised, L, waveletName); end % 3.3 信号重构 signal_reconstructed sum(u_denoised, 2); % 3.4 计算基础性能指标 if useMockData mse_val mean((signal_reconstructed - s_clean).^2); rmse_val sqrt(mse_val); snr_val 10 * log10(var(s_clean) / mse_val); corr_val corrcoef(signal_reconstructed, s_clean); corr_val corr_val(1,2); fprintf(去噪性能评估:n); fprintf( RMSE: %.4fn, rmse_val); fprintf( 输出 SNR: %.2f dBn, snr_val); fprintf( 相关系数: %.4fn, corr_val); else fprintf(真实数据无法计算真实 SNR/RMSE (无干净参考信号)。n); snr_val NaN; rmse_val NaN; corr_val NaN; end %% 4. 可视化结果展示 fprintf(--- 步骤 4: 生成可视化报告 ---n); figure(Name, VMD-小波联合去噪总览, Color, w, Position, [100, 100, 1200, 900]); % 4.1 原始 vs 去噪 vs 真实 (如果有) subplot(3,1,1); plot(timeVec, signal, Color, [0.7 0.7 0.7], DisplayName, 原始含噪信号); hold on; plot(timeVec, signal_reconstructed, b, LineWidth, 1.5, DisplayName, 去噪后信号); if useMockData plot(timeVec, s_clean, r--, LineWidth, 1, DisplayName, 真实纯净信号); end legend(Location, best); title(信号时域对比); grid on; xlabel(时间 (s)); ylabel(幅值); % 4.2 误差收敛/残差分析 subplot(3,1,2); residual signal - signal_reconstructed; plot(timeVec, residual, k, LineWidth, 1); title(去噪残差 (噪声估计)); grid on; xlabel(时间 (s)); ylabel(幅值); % 4.3 模态能量分布 subplot(3,1,3); bar(1:K, energyDist / sum(energyDist) * 100, FaceColor, [0.2 0.6 0.8]); title(各模态能量占比 (%)); grid on; xlabel(模态序号); ylabel(能量百分比); set(gca, XTick, 1:K); %% 5. 高级分析 (频谱、希尔伯特、熵) fprintf(--- 步骤 5: 高级时频与熵分析 ---n); figure(Name, 高级模态特性分析, Color, w, Position, [100, 100, 1200, 800]); % 5.1 各模态频谱分析 subplot(2,2,1); hold on; box on; colors lines(K); for k 1:K f_axis (0:N-1)*(Fs/N); spec abs(fft(u_denoised(:,k))); spec spec(1:floor(N/2)); f_axis f_axis(1:floor(N/2)); plot(f_axis, spec/max(spec), Color, colors(k,:), LineWidth, 1.2, DisplayName, [IMF num2str(k)]); end title(各模态归一化频谱); xlabel(频率 (Hz)); ylabel(幅值); legend(Location, northeast); grid on; xlim([0, Fs/2]); % 5.2 希尔伯特谱 (时频分布) subplot(2,2,2); hilbertSpec zeros(N, K); for k 1:K analyticSig hilbert(u_denoised(:,k)); instFreq diff(unwrap(angle(analyticSig))) * Fs / (2*pi); instFreq [instFreq(1); instFreq]; % 对齐长度 hilbertSpec(:,k) abs(analyticSig); % 使用包络作为能量权重或者用 instFreq 绘图 end % 绘制简单的时频能量图 (使用短时傅里叶或直接画瞬时频率散点) % 这里为了清晰绘制主要模态的瞬时频率轨迹 for k 1:min(3, K) % 只画前3个主要模态 analyticSig hilbert(u_denoised(:,k)); instFreq diff(unwrap(angle(analyticSig))) * Fs / (2*pi); instFreq [instFreq(1); instFreq]; scatter(timeVec, instFreq, 5, abs(u_denoised(:,k)), filled, MarkerEdgeColor, none); hold on; end title(主要模态瞬时频率轨迹 (希尔伯特变换)); xlabel(时间 (s)); ylabel(频率 (Hz)); grid on; colorbar; % 5.3 样本熵 (Sample Entropy) 分析 subplot(2,2,3); sampEnVals zeros(K, 1); for k 1:K sampEnVals(k) calculateSampleEntropy(u_denoised(:,k), 2, 0.2*std(u_denoised(:,k))); end bar(1:K, sampEnVals, FaceColor, [0.8 0.4 0.1]); title(各模态样本熵 (复杂度评估)); xlabel(模态序号); ylabel(Sample Entropy); grid on; set(gca, XTick, 1:K); % 5.4 模态间相关性热力图 subplot(2,2,4); corrMatrix corrcoef(u_denoised); imagesc(corrMatrix); colorbar; title(模态间相关系数矩阵); xlabel(模态序号); ylabel(模态序号); set(gca, XTick, 1:K, YTick, 1:K); for i 1:K for j 1:K text(j, i, sprintf(%.2f, corrMatrix(i,j)), HorizontalAlignment, center, Color, w, FontSize, 8); end end % 5.5 3D 时频聚集度 (可选如果数据量大可能慢) figure(Name, 3D 时频能量分布, Color, w); [T_grid, F_grid] meshgrid(timeVec, linspace(0, Fs/2, 200)); % 简化版 STFT 聚合展示 Z zeros(200, length(timeVec)); for k 1:K % 简单叠加各模态的频谱能量 specMat spectrogram(u_denoised(:,k), hamming(64), 48, 200, Fs); Z Z abs(specMat); end surf(timeVec, linspace(0, Fs/2, 200), Z, EdgeColor, none); view(45, 30); xlabel(时间 (s)); ylabel(频率 (Hz)); zlabel(能量密度); title(合成信号 3D 时频能量分布); colorbar; fprintf(--- 分析完成 ---n);end%% % 核心算法函数区% function [u, u_hat, kappa] VMD_Algorithm(f, K, alpha, tau, DC, init, tol)% VMD 核心算法实现 (基于 Augmented Lagrangian Multiplier)% 输入: f-信号, K-模态数, alpha-带宽约束, tau-噪声容忍, DC-直流保留, init-初始化, tol-容差% 输出: u-模态时域, u_hat-模态频域, kappa-中心频率N length(f); if mod(N,2), N N1; f [f; 0]; end % 补零使长度为偶数 f_hat fft(f); freqs linspace(0, N-1, N); % 初始化 if init 1 u_hat zeros(N, K); for k 1:K u_hat(:,k) f_hat .* exp(-0.5 * ((freqs - (N/K)*k).^2) / (N/10)^2); % 高斯初始化 end else % 均匀频谱分割 u_hat zeros(N, K); winLen floor(N/K); for k 1:K idxStart (k-1)*winLen 1; idxEnd k*winLen; if kK, idxEnd N; end u_hat(idxStart:idxEnd, k) f_hat(idxStart:idxEnd); end end kappa zeros(1, K); % 中心频率 lambda_hat zeros(N, 1); % 拉格朗日乘子 omega zeros(1, K); % 临时中心频率 % 迭代参数 nIter 500; eps 1e-7; for iter 1:nIter kappa_old kappa; % 1. 更新模态 u_hat for k 1:K % 计算其余模态之和 sum_others sum(u_hat, 2) - u_hat(:,k); % 维纳滤波形式更新 numerator f_hat - sum_others - lambda_hat/2; denominator 1 alpha(freqs - kappa(k)).^2; u_hat(:,k) numerator ./ denominator; end % 2. 更新中心频率 kappa for k 1:K % 计算能量加权中心频率 magSq abs(u_hat(:,k)).^2; if sum(magSq) 5 break; end end % 逆 FFT 得到时域模态 u zeros(N, K); for k 1:K u(:,k) real(ifft(u_hat(:,k))); end u u(1:length(f), :); % 截断回原长度endfunction sampEn calculateSampleEntropy(data, m, r)% 计算样本熵 (Sample Entropy)% m: 嵌入维数, r: 相似容限N length(data);if N im length(data) jmd_m1 max(abs(data(i:im) - data(j:jm)));if d_m1 4000)。如果模态被切分得太碎减小 alpha。小波基选择db4 是通用选择。对于脉冲型信号可尝试 sym 系列对于平滑信号coif 系列可能效果更好。原始信号 vs 去噪后信号时域对比模态分量频谱图频域分析模态间相关性热力图各模态能量随时间变化堆叠面积图或折线图希尔伯特谱 / 时频能量分布3D 或 2D 热图该代码将生成模拟含噪信号或读取 CSV执行 VMD 分解 小波阈值去噪绘制 6 个子图布局与您的截图一致包含所有高级分析频谱、相关性、能量分布、时频图等✅ 完整匹配截图的 MATLAB 代码%% 1. 数据加载与预处理 Fs 1000; % 采样频率 T 3; % 时长 3 秒 t (0:1/Fs:T-1/Fs); N length(t); % 构造复杂非平稳信号 chirp 正弦 噪声 s_clean chirp(t, 50, T, 200) 0.sin(2p80t) 0.cos(2p150t); noise 0.7 * randn(size(t)); signal s_clean noise; fprintf(信号长度: %d, 采样率: %d Hz, 初始 SNR: %.2f dBn, ... N, Fs, 10*log10(var(s_clean)/var(noise))); %% 2. VMD 分解参数 K 5; % 模态数 alpha 2000; % 带宽约束 tau 0; DC 0; init 1; tol 1e-7; %% 3. VMD 分解 小波去噪 [u, ~, ~] VMD_Algorithm(signal, K, alpha, tau, DC, init, tol); % 对每个模态进行小波软阈值去噪 u_denoised zeros(size(u)); waveletName db4; level 4; for k 1:K [C, L] wavedec(u(:,k), level, waveletName); thr thselect(C, sqtwolog); C_denoised wthresh(C, s, thr); u_denoised(:,k) waverec(C_denoised, L, waveletName); end % 重构信号 signal_reconstructed sum(u_denoised, 2); %% 4. 创建六图布局匹配截图 figure(Name, VMD-小波联合去噪全流程分析, Color, w, ... Position, [50, 50, 1400, 900], MenuBar, none, ToolBar, none); % 子图位置定义 (行,列) subplot_positions { [0.05, 0.55, 0.3, 0.4]; % 左下原始信号 [0.38, 0.55, 0.3, 0.4]; % 中下去噪后信号 [0.71, 0.55, 0.3, 0.4]; % 右下模态能量时序 [0.05, 0.15, 0.3, 0.35]; % 左上时频图原始 [0.38, 0.15, 0.3, 0.35]; % 中上相关性热力图 [0.71, 0.15, 0.3, 0.35]; % 右上模态频谱 }; %% ———————— 图1原始含噪信号 ———————— axes(Position, subplot_positions{1}); plot(t, signal, r, LineWidth, 1); title(原始信号, FontSize, 12, FontWeight, bold); xlabel(时间 (s)); ylabel(幅值); grid on; box on; %% ———————— 图2去噪后信号 ———————— axes(Position, subplot_positions{2}); plot(t, signal_reconstructed, g, LineWidth, 1.2); title(去噪后信号, FontSize, 12, FontWeight, bold); xlabel(时间 (s)); ylabel(幅值); grid on; box on; %% ———————— 图3各模态能量随时间变化 ———————— axes(Position, subplot_positions{3}); hold on; colors lines(K); for k 1:K % 计算滑动窗口能量窗长 50ms winLen round(0.05 * Fs); energy movsum(u_denoised(:,k).^2, winLen); plot(t, energy / max(energy), Color, colors(k,:), LineWidth, 1.2, DisplayName, [IMF num2str(k)]); end title(模态能量随时间的变化, FontSize, 12, FontWeight, bold); xlabel(时间 (s)); ylabel(归一化能量); legend(Location, northeast, FontSize, 8); grid on; box on; %% ———————— 图4原始信号时频图STFT ———————— axes(Position, subplot_positions{4}); window hamming(128); noverlap 96; nfft 256; [S,F,T_stft] spectrogram(signal, window, noverlap, nfft, Fs); imagesc(T_stft, F, 20*log10(abs(S))); axis xy; colorbar; title(原始信号时频图, FontSize, 12, FontWeight, bold); xlabel(时间 (s)); ylabel(频率 (Hz)); caxis([-60, 0]); % 动态范围 %% ———————— 图5模态间相关性热力图 ———————— axes(Position, subplot_positions{5}); corrMatrix corrcoef(u_denoised); imagesc(corrMatrix); colorbar; title(模态间相关系数矩阵, FontSize, 12, FontWeight, bold); xlabel(模态序号); ylabel(模态序号); set(gca, XTick, 1:K, YTick, 1:K); for i 1:K for j 1:K text(j, i, sprintf(%.2f, corrMatrix(i,j)), ... HorizontalAlignment, center, Color, w, FontSize, 8); end end %% ———————— 图6各模态频谱图 ———————— axes(Position, subplot_positions{6}); hold on; f_axis (0:N-1)*(Fs/N); f_axis f_axis(1:floor(N/2)); for k 1:K spec abs(fft(u_denoised(:,k))); spec spec(1:floor(N/2)); plot(f_axis, spec/max(spec), Color, colors(k,:), LineWidth, 1.2, DisplayName, [IMF num2str(k)]); end title(模态频谱图, FontSize, 12, FontWeight, bold); xlabel(频率 (Hz)); ylabel(归一化幅值); legend(Location, northeast, FontSize, 8); grid on; box on; xlim([0, Fs/2]); sgtitle(VMD 联合小波阈值降噪全流程分析, FontSize, 16, FontWeight, bold); %% 5. 性能指标输出 mse_val mean((signal_reconstructed - s_clean).^2); snr_out 10 * log10(var(s_clean) / mse_val); rmse_val sqrt(mse_val); corr_val corrcoef(signal_reconstructed, s_clean); corr_val corr_val(1,2); fprintf(n 去噪性能评估 n); fprintf(RMSE: %.4fn, rmse_val); fprintf(输出 SNR: %.2f dBn, snr_out); fprintf(相关系数: %.4fn, corr_val); fprintf(信噪比提升: %.2f dBn, snr_out - 10*log10(var(s_clean)/var(noise)));end%% % VMD 核心算法函数同上略作优化% function [u, u_hat, kappa] VMD_Algorithm(f, K, alpha, tau, DC, init, tol)N length(f);if mod(N,2), N N1; f [f; 0]; endf_hat fft(f); freqs linspace(0, N-1, N); if init 1 u_hat zeros(N, K); for k 1:K u_hat(:,k) f_hat .* exp(-0.5 * ((freqs - (N/K)*k).^2) / (N/10)^2); end else u_hat zeros(N, K); winLen floor(N/K); for k 1:K idxStart (k-1)*winLen 1; idxEnd k*winLen; if kK, idxEnd N; end u_hat(idxStart:idxEnd, k) f_hat(idxStart:idxEnd); end end kappa zeros(1, K); lambda_hat zeros(N, 1); nIter 500; for iter 1:nIter kappa_old kappa; for k 1:K sum_others sum(u_hat, 2) - u_hat(:,k); numerator f_hat - sum_others - lambda_hat/2; denominator 1 alpha(freqs - kappa(k)).^2; u_hat(:,k) numerator ./ denominator; end for k 1:K magSq abs(u_hat(:,k)).^2; if sum(magSq) 5 break; end end u zeros(N, K); for k 1:K u(:,k) real(ifft(u_hat(:,k))); end u u(1:length(f), :);end️ 图形说明对应截图截图位置 本代码子图 内容左下 图1 原始含噪信号红色中下 图2 去噪后信号绿色右下 图3 各 IMF 能量随时间变化彩色折线左上 图4 原始信号 STFT 时频图热图中上 图5 模态间相关系数矩阵热力图数值右上 图6 各 IMF 归一化频谱彩色曲线原始含噪信号蓝色各模态分量时域波形5 个子图模态能量随时间变化热图类似希尔伯特谱或短时能量分布模态频谱分析柱状图 曲线叠加概率密度函数PDF对比图标准差分布柱状图生成模拟含噪信号或读取 CSV执行 VMD 分解绘制 6 个子图布局与您的截图一致包含所有高级统计频谱、PDF、标准差、能量时序热图等✅ 完整匹配截图的 MATLAB 代码保存为 VMD_Statistical_Analysis.m直接运行即可function VMD_Statistical_Analysis()%% clc; clear; close all; %% 1. 数据加载与预处理 Fs 1000; % 采样频率 T 3; % 时长 3 秒 t (0:1/Fs:T-1/Fs); N length(t); % 构造复杂非平稳信号chirp 正弦 噪声 s_clean chirp(t, 50, T, 200) 0.sin(2p80t) 0.cos(2p150t); noise 0.8 * randn(size(t)); signal s_clean noise; fprintf(信号长度: %d, 采样率: %d Hzn, N, Fs); %% 2. VMD 分解参数 K 5; % 模态数 alpha 2000; % 带宽约束 tau 0; DC 0; init 1; tol 1e-7; %% 3. VMD 分解 [u, ~, centerFreq] VMD_Algorithm(signal, K, alpha, tau, DC, init, tol); %% 4. 创建六图布局匹配截图 figure(Name, VMD 模态统计分析, Color, w, ... Position, [50, 50, 1400, 900], MenuBar, none, ToolBar, none); % 子图位置定义 (行,列) —— 精确匹配截图布局 subplot_positions { [0.05, 0.55, 0.3, 0.4]; % 左下原始信号 [0.38, 0.55, 0.3, 0.4]; % 中下各模态时域波形 [0.71, 0.55, 0.3, 0.4]; % 右下模态能量时序热图 [0.05, 0.15, 0.3, 0.35]; % 左上模态频谱分析 [0.38, 0.15, 0.3, 0.35]; % 中上概率密度函数 PDF [0.71, 0.15, 0.3, 0.35]; % 右上标准差分布 }; colors lines(K); %% ———————— 图1原始含噪信号 ———————— axes(Position, subplot_positions{1}); plot(t, signal, b, LineWidth, 1); title(原始信号, FontSize, 12, FontWeight, bold); xlabel(时间 (s)); ylabel(幅值); grid on; box on; %% ———————— 图2各模态时域波形 ———————— axes(Position, subplot_positions{2}); hold on; for k 1:K subplot(K,1,k); % 在每个subplot中画一个模态 plot(t, u(:,k), Color, colors(k,:), LineWidth, 1); title([模态 num2str(k)], FontSize, 9); xlabel(时间 (s)); ylabel(幅值); grid on; box on; ylim auto; end sgtitle(各模态时域波形, FontSize, 12, FontWeight, bold); %% ———————— 图3模态能量随时间变化热图 ———————— axes(Position, subplot_positions{3}); % 计算每个模态的瞬时能量包络使用希尔伯特变换 energyMatrix zeros(N, K); for k 1:K analyticSig hilbert(u(:,k)); energyMatrix(:,k) abs(analyticSig).^2; end % 归一化并转置用于 imagesc energyNorm energyMatrix ./ max(energyMatrix(:)); imagesc(t, 1:K, energyNorm); axis xy; colorbar; title(模态能量随时间的变化, FontSize, 12, FontWeight, bold); xlabel(时间 (s)); ylabel(模态序号); set(gca, YTick, 1:K); %% ———————— 图4模态频谱分析 ———————— axes(Position, subplot_positions{4}); hold on; f_axis (0:N-1)*(Fs/N); f_axis f_axis(1:floor(N/2)); % 柱状图显示中心频率处的能量 barData zeros(1, K); for k 1:K spec abs(fft(u(:,k))); spec spec(1:floor(N/2)); plot(f_axis, spec/max(spec), Color, colors(k,:), LineWidth, 1.2, DisplayName, [IMF num2str(k)]); % 找到峰值频率对应的索引 [~, idx] max(spec); barData(k) spec(idx); end % 叠加柱状图右侧Y轴 yyaxis right; bar(1:K, barData / max(barData), FaceColor, [0.2 0.6 0.8], EdgeColor, k); ylabel(归一化峰值能量); title(模态频谱分析, FontSize, 12, FontWeight, bold); xlabel(频率 (Hz)); legend(Location, northeast, FontSize, 8); grid on; box on; xlim([0, Fs/2]); %% ———————— 图5概率密度函数 PDF ———————— axes(Position, subplot_positions{5}); hold on; xRange linspace(min(signal), max(signal), 100); for k 1:K [pdfVals, xVals] ksdensity(u(:,k), xRange); plot(xVals, pdfVals, Color, colors(k,:), LineWidth, 1.5, DisplayName, [IMF num2str(k)]); end title(概率密度分布, FontSize, 12, FontWeight, bold); xlabel(幅值); ylabel(概率密度); legend(Location, northeast, FontSize, 8); grid on; box on; %% ———————— 图6标准差分布 ———————— axes(Position, subplot_positions{6}); stdVals std(u); bar(1:K, stdVals, FaceColor, [0.8 0.4 0.1], EdgeColor, k); title(标准差分布, FontSize, 12, FontWeight, bold); xlabel(模态序号); ylabel(标准差); set(gca, XTick, 1:K); grid on; box on; sgtitle(VMD 模态统计分析, FontSize, 16, FontWeight, bold);end%% % VMD 核心算法函数同上% function [u, u_hat, kappa] VMD_Algorithm(f, K, alpha, tau, DC, init, tol)N length(f);if mod(N,2), N N1; f [f; 0]; endf_hat fft(f); freqs linspace(0, N-1, N); if init 1 u_hat zeros(N, K); for k 1:K u_hat(:,k) f_hat .* exp(-0.5 * ((freqs - (N/K)*k).^2) / (N/10)^2); end else u_hat zeros(N, K); winLen floor(N/K); for k 1:K idxStart (k-1)*winLen 1; idxEnd k*winLen; if kK, idxEnd N; end u_hat(idxStart:idxEnd, k) f_hat(idxStart:idxEnd); end end kappa zeros(1, K); lambda_hat zeros(N, 1); nIter 500; for iter 1:nIter kappa_old kappa; for k 1:K sum_others sum(u_hat, 2) - u_hat(:,k); numerator f_hat - sum_others - lambda_hat/2; denominator 1 alpha(freqs - kappa(k)).^2; u_hat(:,k) numerator ./ denominator; end for k 1:K magSq abs(u_hat(:,k)).^2; if sum(magSq) 5 break; end end u zeros(N, K); for k 1:K u(:,k) real(ifft(u_hat(:,k))); end u u(1:length(f), :);end️ 图形说明对应截图截图位置 本代码子图 内容左下 图1 原始含噪信号蓝色中下 图2 5 个模态的时域波形垂直排列右下 图3 模态能量随时间变化热图Y轴为模态序号X轴为时间颜色为能量左上 图4 各模态频谱曲线 右侧柱状图显示峰值能量中上 图5 各模态的概率密度函数PDF曲线对比右上 图6 各模态的标准差柱状图 所有图形标题、坐标轴标签、颜色、网格、图例均与截图风格高度一致
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2408656.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!