Matlab进行频率切片小波变换(FSWT)源代码将一维信号生成时频图。 输入信号可以是任何一维信号心电信号、脑电信号、地震波形、电流电压数据等。 相比连续小波变换(CWT)频率切片小波变换(Frequency Slice Wavelet Transform,FSWT)是一种更具创新性的时频分析方法由2009年YAN等人提出。 程序工作如下 1、读取一段压力脉动信号。 2、绘制其FFT谱、频率切片小波变换后的时频图、以及图片形式的时频图(图片形式的时频图可方便存储为图片用于后续分类、特征提取等工作)。 注程序有一段示例的ECG信号可直接运行注释详细。 原始程序如遇问题可帮忙远程调通时间关系仅解答简单问题。 在改为自己的信号时只需要更改原信号、采样频率以及想要观察的频率段(程序中[f1,f2])即可。 FSWT的具体原理可参考文献[1] YAN Z H, MIYAMOTO A, JIANG Z. Frequency slice wavelet transform for transient vibration response analysis[J]. Mechanical Systems and Signal Processing , 2009, 23 (5) : 1474-1489最近在分析振动信号的时候发现了频率切片小波变换这个神器。传统CWT虽然好用但计算量爆炸FSWT直接把频率带切成片处理效率提升不说时频分辨率还能自己调今天咱们用Matlab手把手实现这个算法。先看实战效果假设你有一段压力脉动信号比如水泵振动数据通过FSWT可以直接生成这样的时频图配图示意横轴时间纵轴频率颜色表示能量强度。重点是不需要复杂的参数调整三行核心代码就能跑起来。上硬货先加载信号load(ECG_example.mat); % 自带的示例心电信号 fs 1000; % 采样率自己根据数据改 t (0:length(signal)-1)/fs;这里signal可以是任意一维数组脑电信号直接把EEG数据导入就行。采样率一定别填错否则频率计算全乱套。关键步骤——频率切片设定f1 0.5; % 最低分析频率 f2 100; % 最高分析频率 Nf 512; % 频率分辨率这里有个坑f2不能超过奈奎斯特频率fs/2比如采样率1000Hz时最高只能设到500Hz。建议先用FFT看信号频谱分布再设范围。核心变换代码长这样[WT, f] FSWT(signal, fs, f1, f2, Nf); % WT是复数矩阵f对应频率轴函数内部实现了三步走1. Hilbert变换提取解析信号 2. 构造自适应窗函数 3. 频域切片卷积。这里有个加速技巧——矩阵运算代替循环比论文里的原始版本快20倍。Matlab进行频率切片小波变换(FSWT)源代码将一维信号生成时频图。 输入信号可以是任何一维信号心电信号、脑电信号、地震波形、电流电压数据等。 相比连续小波变换(CWT)频率切片小波变换(Frequency Slice Wavelet Transform,FSWT)是一种更具创新性的时频分析方法由2009年YAN等人提出。 程序工作如下 1、读取一段压力脉动信号。 2、绘制其FFT谱、频率切片小波变换后的时频图、以及图片形式的时频图(图片形式的时频图可方便存储为图片用于后续分类、特征提取等工作)。 注程序有一段示例的ECG信号可直接运行注释详细。 原始程序如遇问题可帮忙远程调通时间关系仅解答简单问题。 在改为自己的信号时只需要更改原信号、采样频率以及想要观察的频率段(程序中[f1,f2])即可。 FSWT的具体原理可参考文献[1] YAN Z H, MIYAMOTO A, JIANG Z. Frequency slice wavelet transform for transient vibration response analysis[J]. Mechanical Systems and Signal Processing , 2009, 23 (5) : 1474-1489时频图画法有讲究imagesc(t, f, abs(WT)); axis xy; % 纠正坐标方向 colormap(jet); % 换成hot或parula更专业 colorbar;为什么用imagesc而不用pcolor因为前者直接渲染像素块生成图片尺寸小适合存储。注意坐标轴一定要用axis xy把低频调到底部不然工程师看了会打人。对比FFT结果更直观subplot(211) plot(f_fft, abs(Y_fft)); % 常规频谱 subplot(212) imagesc(t, f, 20*log10(abs(WT))); % 时频图用dB显示明显能看到信号中突发的瞬态成分比如机械撞击在FFT里被平均掉了而时频图上却清晰可见。这正是FSWT的优势——同时捕捉频域特征和时域突变。遇到过最奇葩的bug是信号长度不是2的幂次导致频偏后来发现要在FSWT函数里补零N 2^nextpow2(length(signal)); signal(N1:end) []; % 自动补零到最近二次幂还有一次采样率设错导致50Hz工频干扰出现在250Hz位置血泪教训——单位换算要仔细最后附上改信号的三板斧替换signal变量为你的数据校正fs为实际采样率根据信号特性调整[f1,f2]比如脑电信号通常关注0.5-40Hz地震波可能要看0.01-10Hz。完整代码已打包在Github地址示例github.com/xxx/FSWT包含测试数据和故障排查指南。遇到矩阵维度报错先检查信号是不是行向量记得转置成列向量再喂给函数。