1. 连续小波变换(CWT)与时频图生成原理
连续小波变换(Continuous Wavelet Transform, CWT)是信号处理中一种强大的时频分析工具,它通过将信号与一系列缩放和平移的小波基函数进行卷积运算,能够同时提供信号在时间和频率域上的局部特征信息。与短时傅里叶变换(STFT)相比,CWT具有可变的时频分辨率,在高频区域提供更好的时间分辨率,在低频区域提供更好的频率分辨率。
在Matlab中实现CWT时频图生成,核心步骤包括:
小波基函数选择:Matlab的Wavelet Toolbox提供了多种小波基函数,如Morlet、Mexican hat、Daubechies等。对于时频分析,Morlet小波因其良好的时频局部化特性常被选用。
尺度参数设置:尺度参数决定了小波的伸缩程度,对应不同的频率成分。通过
cwtfilterbank函数可以创建滤波器组:fb = cwtfilterbank(SignalLength=1000, SamplingFrequency=128, VoicesPerOctave=12);时频系数计算:使用
wt方法计算小波系数:[cfs,frq] = wt(fb,signal);时频图可视化:将小波系数的绝对值转换为时频图:
pcolor(t,frq,abs(cfs)); set(gca,"yscale","log"); shading interp;
2. Matlab批量生成时频图的实现方案
2.1 数据准备与参数配置
批量处理前需统一数据格式和参数。假设有N个信号存储在ECGData结构体中:
% 统一参数设置 Fs = 128; % 采样频率 signalLength = 1000; % 信号长度 voicesPerOctave = 12; % 每八度音阶的声数 % 创建滤波器组(提前创建以提高效率) fb = cwtfilterbank(SignalLength=signalLength,... SamplingFrequency=Fs,... VoicesPerOctave=voicesPerOctave);2.2 批量处理核心代码
使用循环结构实现批量处理,并将结果保存为图像文件:
outputDir = '时频图结果'; if ~exist(outputDir, 'dir') mkdir(outputDir) end for i = 1:size(ECGData.Data,1) % 获取当前信号 sig = ECGData.Data(i,:); % 计算CWT系数 [cfs,frq] = wt(fb,sig); % 创建时频图 fig = figure('Visible','off'); pcolor((0:signalLength-1)/Fs, frq, abs(cfs)); set(gca,'yscale','log'); shading interp; axis tight; xlabel('时间(s)'); ylabel('频率(Hz)'); title(['时频图 - 信号',num2str(i)]); % 保存图像 saveas(fig, fullfile(outputDir, ['时频图_',num2str(i),'.png'])); close(fig); end2.3 性能优化技巧
并行计算加速:对于大规模数据,使用
parfor替代for循环:parfor i = 1:N % 处理代码 end内存预分配:提前分配存储空间:
cfs_all = zeros(length(frq), signalLength, N);批量保存优化:将多个图像存储在MAT文件中而非单独文件:
save('batch_results.mat','cfs_all','-v7.3');
3. 时频图后处理与深度学习应用
3.1 时频图标准化处理
为适应深度学习模型输入要求,需对时频图进行标准化:
% 将CWT系数转换为RGB图像 cfs_norm = rescale(abs(cfs),0,1); rgb_img = ind2rgb(round(cfs_norm*255), jet(256)); % 调整大小为224x224(适配常见CNN输入尺寸) rgb_img = imresize(rgb_img, [224 224]); % 保存为JPEG格式 imwrite(rgb_img, 'tf_image.jpg');3.2 与深度学习模型集成
时频图可作为CNN的输入特征,以下示例展示如何与预训练网络结合:
% 加载预训练网络 net = googlenet; % 修改网络最后一层 numClasses = 3; % 分类类别数 lgraph = layerGraph(net); newLayers = [ dropoutLayer(0.6,'Name','newDropout') fullyConnectedLayer(numClasses,'Name','newFc') softmaxLayer('Name','newSoftmax') classificationLayer('Name','newOutput')]; lgraph = replaceLayer(lgraph,'pool5-drop_7x7_s1',newLayers(1)); lgraph = replaceLayer(lgraph,'loss3-classifier',newLayers(2)); lgraph = replaceLayer(lgraph,'prob',newLayers(3)); lgraph = replaceLayer(lgraph,'output',newLayers(4)); % 创建图像数据存储 imds = imageDatastore('时频图结果','IncludeSubfolders',true,... 'LabelSource','foldernames');4. 实际应用中的关键问题与解决方案
4.1 常见问题排查
频率范围不合适:
- 症状:时频图显示频率成分集中在狭窄范围
- 解决方法:调整
cwtfilterbank的FrequencyLimits参数
fb = cwtfilterbank(...,'FrequencyLimits',[0.5 64]);时间分辨率不足:
- 症状:快速变化信号特征模糊
- 优化方案:增加
VoicesPerOctave值
fb = cwtfilterbank(...,'VoicesPerOctave',24);边界效应处理:
- 现象:信号两端出现虚假频率成分
- 解决方案:使用
SignalPadding参数
fb = cwtfilterbank(...,'SignalPadding',1000);
4.2 高级应用技巧
多信号对比分析:
% 计算多信号平均时频特征 avg_cfs = mean(abs(cfs_all),3); figure; imagesc(avg_cfs);动态范围调整:
% 使用对数缩放增强弱信号可视化 log_cfs = log10(abs(cfs)+eps);三维时频可视化:
surf(t,frq,abs(cfs),'EdgeColor','none'); view(0,90); axis tight;
5. 完整项目结构建议
规范的目录结构有助于批量处理:
项目根目录/ ├── input_data/ # 原始信号数据 │ ├── signal1.mat │ └── signal2.mat ├── src/ # 源代码 │ ├── batch_cwt.m # 批量处理主脚本 │ └── utils/ # 工具函数 ├── output/ # 输出结果 │ ├── time_freq_images/ # 时频图 │ └── features/ # 提取的特征 └── docs/ # 文档典型批处理脚本框架:
% 初始化环境 clear; clc; close all; addpath(genpath('src/utils')); % 加载数据 dataDir = 'input_data'; files = dir(fullfile(dataDir,'*.mat')); % 创建滤波器组 fb = cwtfilterbank(...); % 并行处理 parfor i = 1:length(files) % 加载信号 data = load(fullfile(files(i).folder,files(i).name)); sig = preprocess(data.raw); % 预处理 % 生成时频图 [cfs,~] = wt(fb,sig); saveTfImage(cfs, files(i).name); % 提取特征 features = extractFeatures(cfs); saveFeatures(features, files(i).name); end % 后处理 mergeFeatures('output/features');