首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python scipy.fftpack.rfft频率宾映射

Python scipy.fftpack.rfft频率宾映射
EN

Stack Overflow用户
提问于 2014-02-03 00:11:58
回答 1查看 3.4K关注 0票数 2

我试图根据给定的频率得到正确的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大小数组中提供结果。我现在在映射和函数方面有一些问题。不幸的是,文档没有提供太多的信息,因为我在这方面是新手。

我的问题:

  1. 对我来说,音频样本上的rfft结果可以直接用于从第一个bin到最后一个bin,因为输出中没有对称性,对吗?
  2. 由于上述不对称,频率分辨率似乎有所提高,这一解释正确吗?
  3. 由于使用了rfft,我从bin索引k到frequency F的映射函数现在是F = k*Fs/(2N) for k = 0 ... N-1了,这是正确的吗?
  4. 相反,从频率F到bin索引k的反向映射函数现在变成k = 2*F*N/Fs for F = 0Hz ... Fs/2-(Fs/2/N),这是否正确?

我的一般困惑来自于rfftfft的关系,以及在使用rfft时如何正确地完成映射。我相信我的映射被一小部分抵消了,这在我的应用程序中是至关重要的。如有可能,请指出错误或提出建议,非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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”(输出向量中的实际数值),那么您的所有问题都应该消失。

具体地回答你的问题:

  1. 不是的。这是对称的,你需要用它来计算最后的回收箱(但它们没有给你额外的信息)。
  2. 不是的。提高DFT分辨率的唯一方法是增加样品长度。
  3. 不,但差不多了。F= k*Fs/N (k=0.N/2)
  4. 对于有N个bins的输出向量,你可以得到从0到(N1)/N*Fs的频率.使用rfft,您将有一个N/2+1桶的输出矢量。你做数学,但我得到0..f/2

希望事情现在更清楚了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21517998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档