STFT澄清(用于实时输入的FFT)

时间:2015-05-26 18:42:16

标签: fft

我了解DFT通过相关如何工作,并将其作为理解FFT结果的基础。如果我有一个以44.1kHz采样的离散信号,那么这意味着如果我要获取1个数据,我将有44,100个样本。为了在其上运行FFT,我必须有一个44,100的阵列和一个N = 44,100的DFT,以便获得检测高达22kHz的频率所需的分辨率,对吧? (因为FFT只能将输入与正弦分量相关联,频率为N / 2)

这显然是很多数据点和计算时间,我已经读过这是短时间FT(STFT)的用武之地。如果我接着前1024个样本(~23ms)并运行FFT然后,采取重叠的1024个样本,我可以每23ms得到信号的连续频域。那么我该如何解释输出呢?如果静态数据上的FFT输出是带有fs /(N / 2)带宽的N / 2个数据点,那么STFT频率输出的带宽是多少?

以下是我在Mathematica中运行的一个示例:

采样率为44.1kHz的100Hz正弦波: enter image description here

然后我只在前1024个点上运行FFT: enter image description here

然后,感兴趣的频率在数据点3处,其应该以某种方式对应于100Hz。我认为44100/1024 = 43就像一个缩放因子,这意味着在这个小窗口中1Hz的信号将对应于完整数据阵列中的43Hz信号。但是,这会给我一个43Hz * 3 = 129Hz的输出。我的逻辑是正确的但不是我的实现吗?

1 个答案:

答案 0 :(得分:4)

正如我在之前的评论中已经说过的那样,变量N会影响输出频谱可实现的分辨率,而不会影响您可以检测到的频率范围。较大的N会以更高的计算时间为代价提供更高的分辨率较低的N会降低你的计算时间,但会导致spectral leakage,这是你在上一个数字中看到的效果。

至于你的另一个问题,理论上,FFT的带宽是无限的,但是我们将结果限制在[-fs / 2到fs / 2]范围内的频带,因为该频段以外的所有频率都是如此。容易受aliasing影响,因此没有用。此外,如果输入信号是真实的(在大多数情况下包括我们的情况都是如此)那么从[-fs / 2到0]的频率只是从[0到fs / 2]的频率,所以一些FFT程序只输出[0到fs / 2]的FFT频谱,我认为这适用于你的情况。这意味着你收到的N / 2数据点输出表示[0到fs / 2]范围内的频率,因此这是您在FFT情况下使用的带宽,也是STFT的情况(STFT只是一系列FFT,每个FFT都在STFT将为您提供该频段内数据点的频谱。)

我还想指出,如果你的输入是一个变化的信号,如音乐,STFT很可能不会减少你的计算时间,因为在这种情况下你需要执行几次在歌曲的持续时间内,只要你执行一次FFT,它就能让你更好地理解你的歌曲的频率特性。

为了可视化FFT的结果,您可以使用频率(和/或相位)频谱图,但为了可视化STFT的结果,您很可能需要创建spectrogram,这基本上是一个图表可以基本上将各个FFT频谱并排放置。制作频谱图的过程如下图所示(来源:Dan Ellis - 语音处理简介)。频谱图将显示信号的频率特性如何变化随着时间的推移以及您如何解释它将取决于您希望从音频中提取/检测的具体功能。您可能需要查看spectrogram维基百科页面以获取更多信息。

enter image description here