我了解了通过相关性进行DFT的工作原理,并将其用作理解FFT结果的基础。如果我有一个以44.1kHz采样的离散信号,则意味着如果我要采集1s的数据,那么我将有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中运行的示例:
100Hz正弦波,采样率为44.1kHz:

然后,我仅在前1024个点上运行FFT:

然后,感兴趣的频率在数据点3处,该点应以某种方式对应于100Hz。我认为44100/1024 = 43类似于比例因子,这意味着在此小窗口中具有1Hz的信号将对应于整个数据阵列中的43Hz的信号。但是,这将给我输出43Hz * 3 = 129Hz。我的逻辑正确但我的实现不正确吗?
正如我在前面的评论中已经指出的那样,变量N影响输出频谱可实现的分辨率,而不影响您可以检测到的频率范围。 N使您的计算时间减少,但会导致频谱泄漏,这是您在上图中看到的效果。
至于您的另一个问题,理论上FFT的带宽是无限的,但是我们将结果限制在[-fs / 2至fs / 2]范围内,因为该频带之外的所有频率都容易受到影响。混叠此外,如果输入信号是真实的(在包括我们的大多数情况下都是真实的),则从[-fs / 2到0]的频率只是从[0到fs / 2],因此某些FFT程序仅输出从[0到fs / 2]的FFT频谱,我认为这适用于您的情况。这意味着您作为输出接收到的N / 2个数据点代表了[ 0到fs / 2],因此对于FFT以及STFT而言,这就是您正在使用的带宽(STFT只是一系列FFT,STFT中的每个FFT都会为您提供频谱该频段中的数据点)。
我还要指出的是,如果您输入的是诸如音乐之类的变化信号,则STFT很有可能不会减少您的计算时间,因为在这种情况下,您需要在歌曲的播放过程中多次执行它,以便但是,它可以使您更好地理解歌曲的频率特性,这比仅执行一次FFT时要好得多。
为了可视化FFT的结果,您可以使用频率(和/或相位)频谱图,但是为了可视化STFT的结果,您很可能需要创建一个频谱图,基本上可以通过仅将各个FFT频谱并排显示。创建频谱图的过程如下图所示(来源:Dan Ellis-语音处理简介)。频谱图将向您展示信号的频率特性如何随时间变化以及如何解释它将取决于您要从音频中提取/检测哪些特定功能。您可能需要查看频谱图 Wikipedia页面以获取更多信息。
