STFT 说明(实时输入的 FFT)

STFT Clarification (FFT for real-time input)

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

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

这是我在 Mathematica 中 运行 的一个例子:

44.1kHz 采样率下的 100Hz 正弦波:

然后我 运行 仅对前 1024 个点进行 FFT:

感兴趣的频率位于数据点 3,它应该以某种方式对应于 100Hz。我认为 44100/1024 = 43 类似于比例因子,这意味着这个小 window 中的 1Hz 信号将对应于完整数据阵列中的 43Hz 信号。但是,这会给我 43Hz*3 = 129Hz 的输出。我的逻辑正确但我的实现不正确吗?

正如我在之前的评论中所述,变量 N 会影响输出频谱可实现的分辨率,而不是您可以达到的频率范围 detect.A 较大的 N 会为您提供更高的分辨率,但代价是较高的计算时间和较低的 N 会降低计算时间,但会导致 spectral leakage,这就是您在上图中看到的效果。

关于您的其他问题,理论上 FFT 的带宽是无限的,但我们将结果限制在 [-fs/2 到 fs/2] 范围内的频带内因为该频段外的所有频率都容易受到 aliasing 的影响,因此不会受到 use.Furthermore 的影响,如果输入信号是真实的(在大多数情况下都是如此,包括我们的),那么来自 [-[=26] 的频率=] 到 0] 只是从 [0 到 fs/2] 的频率的反映,所以一些 FFT 程序只输出从 [0 到 fs/2] 的 FFT 频谱,我认为这适用于你的 case.This 表示您作为输出收到的 N/2 数据点代表 [0 到 fs/2] 范围内的频率,因此这就是您在 FFT 的情况下使用的带宽和同样在 STFT 的情况下(STFT 只是一系列 FFT,STFT 中的每个 FFT 都会为您提供包含该频段中数据点的频谱)。

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

要可视化 FFT 的结果,您可以使用频率(and/or 相位)频谱图,但为了可视化 STFT 的结果,您很可能需要创建一个 spectrogram which is basically a graph can is made by just basically putting the individual FFT spectrums side by side.The process of creating a spectrogram can be seen in the figure below (Source: Dan Ellis - Introduction to Speech Processing).The spectrogram will show you how your signal's frequency characteristics change over time and how you interpret it will depend on what specific features you are looking to extract/detect from the audio.You might want to look at the spectrogram 维基百科页面获取更多信息。