【问题标题】:Python scipy.fftpack.rfft frequency bin mappingPython scipy.fftpack.rfft 频率仓映射
【发布时间】: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)))

基于thisthis,我最初将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到频率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 时如何正确完成映射。我相信我的映射被少量抵消,这在我的应用程序中至关重要。如有可能,请指出错误或对此事提出建议,非常感谢。

【问题讨论】:

标签: python numpy scipy signal-processing fft


【解决方案1】:

首先为你澄清几点:

fftpack documentation 的快速参考表明 rfft 只为您提供 0..512 的输出向量(在您的情况下)。其原因正是因为在计算 real-valued 输入的离散傅里叶变换时存在对称性: y[k] = y*[N-k](见Wikipedia page on DFTs)。因此,rfft 函数仅计算和存储 N/2+1 个值,因为您可以通过仅采用复共轭来计算另一半(如果您真的想要它来绘制(比如说))。 fft 函数不对输入值进行任何假设(它们可以同时具有实部和虚部),因此在输出中不能假设对称性,它会为您提供具有 N 个值的完整输出向量。诚然,大多数应用程序都使用真实输入,因此人们倾向于假设对称性始终存在。请注意,快速傅里叶变换 (FFT) 是一种计算离散傅里叶变换 (DFT) 的(高效)算法,而 rfft 函数也使用 FFT 进行计算。

鉴于上述情况,您用于访问输出向量的索引超出范围,即 > 512。执行此操作的原因/方式取决于您的代码。您应该清楚地区分“逻辑 N”(用于映射 bin 频率、定义 DFT 等)和“计算 N”(输出向量中的实际值数),然后所有问题都应该消失.

具体回答您的问题:

  1. 没有。存在对称性,您需要使用它来计算最后一个 bin(但它们不会给您额外的信息)。

  2. 没有。提高 DFT 分辨率的唯一方法是增加样本长度。

  3. 不,但差不多。 F = k*Fs/N 对于 k = 0..N/2

  4. 对于具有 N 个 bin 的输出向量,您将获得从 0 到 (N-1)/N*Fs 的频率。使用 rfft,您将获得一个带有 N/2+1 个 bin 的输出向量。你做数学,但我得到 0..Fs/2

希望现在情况更清楚了。

【讨论】:

  • 你有没有试过在长度为 N 的向量上使用scipy.fftpack.rfft?你会发现它确实给了你一个长度 N 的输出。你可能在想np.fft.rfft,它会给你一个长度为N // 2 + 1的输出。
  • 我没有使用过fftpack,也没有使用过Python,但是我引用的文档确实是针对fftpack的,并不影响理论的解释,我认为这是造成混乱的原因。
  • 正如我所暗示的,我不知道可以访问 N 个元素的原因(也许 N 个输入值被复制并且转换就地运行),但我不相信这些值高于 N/2,因为它与文档相矛盾,本质上与具有 rfft 函数的全部意义相矛盾。
  • 再次查看文档 - 对于偶数长度输入,输出为[y(0),Re(y(1)),Im(y(1)),...,Re(y(n/2))],即它似乎包含交错的实部和虚部。再往下,它澄清了“If n is not specified (the default) then n = x.shape[axis]”。对这个输出的解释让 OP 感到困惑,坦率地说,我也是。
  • 好的,我明白你的意思。我指的是复值的(逻辑)值,而不是数组的实际元素(我假设它存储为复杂数据类型)。假设输出将 (n/2 + 1) complex values 存储为向量中的 n 个单独 elements,而不是作为复数数据类型,那么应该只使用适当的指数来计算各种箱的大小。访问输出的机制/语法我无能为力。正如我所说,区分逻辑 n 和计算 n 很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多