MATLAB 短时傅里叶变换与 K-means 聚类:时频信号分析
MATLAB 短时傅里叶变换与 K-means 聚类:时频信号分析
本示例展示了如何使用 MATLAB 的 stft 函数对信号进行短时傅里叶变换,生成时频图,并利用 K-means 聚类对时频图的高度进行分类。
代码示例:
% 生成示例信号
Fs = 1000; % 采样频率
t = 0:1/Fs:1; % 时间向量
f1 = 10; % 信号频率1
f2 = 100; % 信号频率2
x = sin(2*pi*f1*t) + sin(2*pi*f2*t); % 信号
% 进行短时傅里叶变换
window = 256; % 窗口大小
overlap = 128; % 重叠大小
nfft = 256; % FFT长度
[S,F,T] = spectrogram(x,window,noverlap,nfft,Fs,'yaxis');
% 绘制三维图像
figure;
surf(T,F,abs(S),'edgecolor','none');
axis tight;
view(0,90);
xlabel('时间');
ylabel('频率');
colorbar;
% 对高度进行k-means聚类
height = abs(S(:)); % 将矩阵转换为向量
k = 2; % 聚类数
[idx, ~] = kmeans(height,k);
% 将聚类结果还原为矩阵形式
idx_matrix = reshape(idx,size(S));
% 绘制聚类结果
figure;
surf(T,F,idx_matrix,'edgecolor','none');
axis tight;
view(0,90);
xlabel('时间');
ylabel('频率');
colorbar;
步骤说明:
- 生成示例信号: 使用
sin函数生成一个包含两个不同频率的信号x。 - 短时傅里叶变换: 使用
spectrogram函数对信号x进行短时傅里叶变换,得到时频矩阵S,以及频率向量F和时间向量T。 - 绘制三维图像: 使用
surf函数绘制S的三维图像,其中T为横轴,F为纵轴,abs(S)为高度。 - K-means 聚类: 将
S的高度(即幅度谱)提取出来,将其视为一个向量,并使用kmeans算法将其分为两类。 - 还原聚类结果: 将聚类结果
idx还原为与S相同大小的矩阵idx_matrix。 - 绘制聚类结果: 使用
surf函数绘制idx_matrix的三维图像,其中T为横轴,F为纵轴,idx_matrix为高度。
总结:
通过短时傅里叶变换和 K-means 聚类,可以有效地分析时频信号,并根据其高度进行分类,从而揭示信号中隐藏的特征。
原文地址: https://www.cveoy.top/t/topic/vX2 著作权归作者所有。请勿转载和采集!