您的位置:

Matlab STFT详解

一、什么是STFT

短时傅里叶变换(Short-Time Fourier Transform,STFT)是一种在频谱分析中常用的算法,它的基本思想是将长时序信号通过窗函数分成多个较短的时间段,对每个时间段内的信号进行傅里叶变换得到频谱图,可以观察信号在不同时间段内频率成分的变化。STFT最早在语音信号的处理中被广泛使用,现在已经在音乐信号分析、图像处理、语音识别等多个领域得到了应用。

二、Matlab STFT函数

Matlab中提供了多个STFT相关函数,如stft、spectrogram等,其中stft是最基本的函数,可以对信号进行STFT分析并绘制谱图。以下代码是一个基本的stft调用示例。

fs=1000;
t=0:1/fs:5;
x=cos(2*pi*100*t)+0.5*cos(2*pi*200*t)+0.2*cos(2*pi*300*t);
w=hamming(128);
noverlap=numel(w)-1;
nfft=256;
[S,F,T]=stft(x,fs,'Window',w,'OverlapLength',noverlap,'FFTLength',nfft);
surf(T,F,abs(S))

其中,fs为采样频率,t为时域数组,x为信号数组,w为窗函数,noverlap为重叠长度,nfft为傅里叶变换长度,S、F、T是分别代表STFT谱、频率、时间的输出。

三、stft函数的参数

stft函数已经被广泛使用,它提供了大量的参数供用户选择和设置,这些参数将直接影响到函数的执行效果和分析结果。以下列举了一部分stft函数的常用参数。

1、窗函数

窗函数(Window)是一个用于把原始信号分割成多个片段的函数,窗函数之间的选择能够影响到整个STFT分析的结果和性能。在Matlab中,STFT函数提供了多种窗函数可供选择,如矩形窗(rectwin)、汉明窗(hamming)、黑曼窗(blackman)等。

% 使用矩形窗
w=rectwin(128);

% 使用汉明窗
w=hamming(128);

% 使用黑曼窗
w=blackman(128);

2、重叠长度

重叠长度(OverlapLength)是指相邻两个窗函数之间交叠的长度,相当于窗函数的移动距离。在实际应用中,通常采取50%的重叠长度,能够较好地平滑分段信号,在Matlab中可以这样设置。

w=hamming(128);
noverlap=numel(w)/2;

3、FFT长度

FFT长度(FFTLength)是指FFT计算中所采用的数据点数目,也称为零填充长度,零填充是为了避免频谱图中出现泄漏(leakage)现象。一般情况下,FFT长度应该尽量选取小的值以节省计算时间,但是有时候由于分析需求,需要选取较大的值对于细节进行分析。

四、STFT谱图分析

STFT谱图是一种可以显示信号随时间变化的频谱图,直观地表现信号在不同时间段内的频率成分。在Matlab中,可以使用surf函数将STFT谱图绘制成三维图形,同时也可以使用imagesc、pcolor等函数绘制二维图形。

下面的代码展示了绘制谱图的基本方法,其中S、F、T是分别代表STFT谱、频率、时间的输出,surf函数将谱图绘制成3D形式展示。

fs=1000;
t=0:1/fs:5;
x=cos(2*pi*100*t)+0.5*cos(2*pi*200*t)+0.2*cos(2*pi*300*t);
w=hamming(128);
noverlap=numel(w)-1;
nfft=256;
[S,F,T]=stft(x,fs,'Window',w,'OverlapLength',noverlap,'FFTLength',nfft);
surf(T,F,abs(S))

绘制出来的STFT谱图如下图所示。

STFT谱图示例

五、STFT谱图应用

由于STFT谱图可以反映信号在不同时刻的频域信息,因此在多个领域得到了广泛的应用。

1、音频信号处理

在音频信号处理领域,STFT谱图被广泛应用于音乐分析、语音识别、声音合成等方面。例如,通过对音乐信号进行STFT分析,可以提取出某个时间段内的主旋律、和声、节奏等音乐元素,可以做到自动和弦识别、乐器分类、音符对齐等。

2、图像处理

在图像处理领域,STFT谱图被广泛应用于纹理分析、边缘检测、特征提取等方面。由于图像在空间和频率两个维度上具有不同的特性,因此采用STFT谱图可以通过频域信息反映出图像的纹理、条纹等信息。

3、语音识别

在语音识别领域,STFT谱图可以用于提取音频信号的特征,进而用于语音识别。例如,通过对语音STFT分析,可以提取出某个时间段内的共振峰、形状等信息,进而提取出语音信号的语音特征。

六、总结

本文对STFT的概念、Matlab的STFT函数以及谱图绘制和应用进行了较为详细的阐述,希望可以对读者有所启示。在实际应用中,需要根据问题的需求采用合适的参数和窗函数,根据STFT谱图的特点进行分析和处理。