【发布时间】:2014-02-26 09:16:38
【问题描述】:
我正在尝试根据给定的频率获取正确的 FFT bin 索引。音频在44.1k Hz 采样,FFT 大小为1024。给定信号是真实的(从 PyAudio 捕获,通过numpy.fromstring 解码,由scipy.signal.hann 加窗),然后我通过scipy.fftpack.rfft 执行FFT,并计算结果的分贝,总体而言,magnitude = 20 * scipy.log10(abs(rfft(audio_sample)))
基于this 和this,我最初将FFT bin 索引k 映射到任何频率F,如下:
F = k*Fs/N for k = 0 ... N/2-1 其中Fs 是采样率,N 是 FFT bin 大小,在本例中为 1024。反之为:
k = F*N/Fs for F = 0Hz ... Fs/2-Fs/N
但是,意识到rfft 的结果不像fft 那样对称,并在N 大小的数组中提供结果。我现在对映射和功能有一些疑问。不幸的是,文档没有提供太多信息,因为我是这方面的新手。
我的问题:
-
对我来说,
李>rfft在音频样本上的结果可以直接从第一个 bin 到最后一个 bin 使用,因为输出中没有出现对称性,对吗? 鉴于上述缺乏对称性,频率分辨率似乎有所提高,这种解释是否正确?
因为使用了
rfft,我的bin索引k到频率F的映射函数现在是F = k*Fs/(2N) for k = 0 ... N-1这样对吗?反之,从频率
F到bin索引k的反向映射函数现在变成了k = 2*F*N/Fs for F = 0Hz ... Fs/2-(Fs/2/N),这个正确性如何?
我的普遍困惑源于rfft 与fft 的关系,以及在使用rfft 时如何正确完成映射。我相信我的映射被少量抵消,这在我的应用程序中至关重要。如有可能,请指出错误或对此事提出建议,非常感谢。
【问题讨论】:
标签: python numpy scipy signal-processing fft