我试图根据给定的频率得到正确的FFT bin索引。音频是在44.1k Hz采样和快速傅立叶变换大小是1024。如果信号是真实的(从PyAudio捕获,通过numpy.fromstring解码,由scipy.signal.hann加窗),然后通过scipy.fftpack.rfft执行FFT,并计算结果的分贝,总体上是magnitude = 20 * scipy.log10(abs(rfft(audio_sample)))。
在这和这的基础上,我最初进行了从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到frequency 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时如何正确地完成映射。我相信我的映射被一小部分抵消了,这在我的应用程序中是至关重要的。如有可能,请指出错误或提出建议,非常感谢。
发布于 2014-02-03 11:58:56
首先为你澄清几件事:
对fftpack文档的快速引用显示,rfft只为您提供0..512的输出向量(在您的例子中)。这完全是因为在计算实值输入: yk = y*恩克的离散傅里叶变换时所存在的对称性。因此,rfft函数只计算和存储N/2+1值,因为您可以只使用复杂的共轭来计算另一半(如果您真的希望它用于绘图(例如))。fft函数对输入值不作任何假设(它们可以有实的和虚的部分),因此在输出中没有对称性,它给出了一个具有N值的完整输出向量。诚然,大多数应用程序都使用真实的输入,因此人们倾向于假设对称总是存在的。注意,快速傅里叶变换( FFT )是计算离散傅里叶变换(DFT)的有效算法,rfft函数也使用FFT进行计算。
根据以上所述,访问输出向量的索引超出了范围,即> 512。您可以这样做的原因取决于您的代码。您应该清楚地区分“逻辑N”(用于映射bin频率、定义DFT等)。以及“计算N”(输出向量中的实际数值),那么您的所有问题都应该消失。
具体地回答你的问题:
希望事情现在更清楚了。
https://stackoverflow.com/questions/21517998
复制相似问题