STFT澄清(实时输入的FFT)

4
我了解基于相关的DFT如何工作,并以此为基础理解FFT的结果。如果我有一个被采样率为44.1kHz的离散信号,那么这意味着如果我要取1秒钟的数据,我将有44,100个样本。为了在此信号上运行FFT,我需要一个包含44,100个元素的数组和一个N=44,100的DFT,以获得检测频率高达22kHz所需的分辨率,对吗?(因为FFT只能将输入与最高频率为N/2的正弦成分进行相关)。
这显然是大量的数据点和计算时间,我已经了解到这就是短时傅里叶变换(STFT)的用途。然后我取前1024个样本(约23毫秒)并在其上运行FFT,接着取一个重叠的1024个样本,我就能每隔23毫秒得到连续的信号频域。那么我该如何解释输出结果呢?如果FFT在静态数据上的输出是N/2个数据点,具有fs/(N/2)带宽,那么STFT频率输出的带宽是多少?
以下是我在Mathematica中运行的一个例子:
44.1kHz采样率下的100Hz正弦波: enter image description here 然后我只对前1024个点进行FFT: enter image description here 感兴趣的频率在数据点3处,应该与100Hz有关。我认为44100/1024 = 43这样一个缩放因子,这意味着在此小窗口中具有1Hz信号将对应于完整数据数组中的43Hz信号。然而,这会给出129Hz的输出。我的逻辑正确但实现可能存在问题吗?

3
我认为你对DFT、FFT和STFT有误解。你不需要N=44100来检测高达22Khz的频率,无论N是多少(比如N可以是200、2000等),你都可以获得高达22KHz的频率。变量N只影响你得到的频率分辨率,而不影响频率的最大或最小值。 - KillaKem
STFT被用于频谱随时间变化的信号,例如音乐。 - KillaKem
我应该说,我打算将其用于连续输入,比如音乐或麦克风。 - MrUser
是的@KillaKem。我的问题说我必须要有N=44100才能检测到22k的频率。我应该说,“检测单一频率高达22kHz”。谢谢你澄清这一点。然后我意识到,通过应用您的评论,29Hz的误差可能是因为我的分辨率不够细。当我对4096个点进行STFT时,我得到107.6。可以看出,随着N的增加,这将趋向于100Hz。(如果您发布了评论,我会接受您的评论作为答案。)再次感谢。 - MrUser
1个回答

5

正如我在之前的评论中所述,变量N影响输出频谱可达到的分辨率,而不是您可以检测到的频率范围。更大的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的情况下,您处理的带宽都是这个范围内的数据点。(保留HTML标签)
我还想指出,如果你的输入是变化的信号(比如音乐),那么STFT很可能不会减少你的计算时间,因为在这种情况下,你需要在整首歌曲的持续时间内多次执行它才有用,但它将使你更好地了解你的歌曲的频率特性,这比你只执行一次FFT要好得多。
为了可视化FFT的结果,你可以使用频率(和/或相位)谱图,但为了可视化STFT的结果,你很可能需要创建一个spectrogram,它基本上是通过将单个FFT谱图并排放置而制成的图形。创建谱图的过程可以在下面的图中看到(来源:Dan Ellis - 语音处理简介)。谱图将显示您的信号的频率特性随时间变化的方式,您如何解释它将取决于您要从音频中提取/检测的具体特征。您可能需要查看spectrogram维基百科页面获取更多信息。

enter image description here


感谢您提供详尽的总结,并补充了有关频谱图的内容。 - MrUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接