如何为FFT表示立体声音频数据

5
如何为FFT表示立体声(2通道)音频数据?您应该
A. 取两个通道的平均值并将其赋给一个数字的实部,将虚部保留为0。
B. 将一个通道分配给实部,另一个通道分配给虚部。
是否有理由选择其中之一?我在网上搜索了很久也没有找到明确的答案。
我正在进行一些简单的频谱分析,不知道该怎么做,所以使用了选项A)。这给了我一个意外的结果,而选项B)则如预期一样。以下是更多细节:
我有一份钢琴“中央C”的WAV文件。根据定义,“中央C”是260Hz,因此我希望峰值频率在260Hz处,谐波处有较小的峰值。通过音频编辑软件(Sound Forge)查看频谱,我确认了这一点。但是当我使用选项A)自己进行FFT时,峰值在520Hz处。使用选项B)时,峰值在260Hz处。
我错过了什么吗?到目前为止,我想出的解释是,使用实部和虚部组成表示立体声数据意味着两个通道是独立的,我认为它们并不是独立的,因此出现了问题。
4个回答

4

我认为您没有正确理解平均值。:-)

C. 分别处理每个通道,将振幅赋值给实部,虚部保持为0。


或者直接使用真正优化的FFT - 大多数工具包都提供了这样一个功能,它可以防止关于实部和虚部的混淆,至少对于输入来说是这样的 ;)有些甚至提供“n维”变体;将声音输入的每个通道视为一个维度。当然,之后你需要找到FFT结果的平均值。 - T045T

2

选项B没有意义。选项A是可以的(如果你关心全局频谱),它相当于将信号转换为单声道。你的问题(双倍频)肯定与您的FFT例程使用上存在误解有关。


1
实际上这是有很多道理的。请参考该问题的答案以获取详细信息:https://dev59.com/zW3Xa4cB1Zd3GeqPf47H - Rémi

2
一旦你进行FFT,你需要获取复杂频谱的幅度。要获取幅度,需要取复杂频谱的绝对值|X(w)|。如果你想查看功率谱,可以将幅度谱平方,即|X(w)|^2。
关于你的频率偏移,我认为它与你将虚部设为零有关。如果你将复杂频谱想象为笛卡尔空间中的一系列复向量或位置向量,则如果你取一个离散频率bin X(w),它会有一个表示其在实轴(x-轴)上方向的实数部分,以及一个在虚轴(y-轴)上方向的虚数部分。这个离散频率有四个重要的值:1. 实数值,2. 虚数值,3. 幅度和4. 相位。如果你只取实数值并将虚数设为0,你就是在设置幅度=实数值和相位=0度或90度。因此,你修改了结果频谱,并对每个频率bin应用了偏置。查看向量的大小,也称为向量的欧几里得范数,以加深你的理解。Leonbloy是正确的,但我希望这更具信息性。

我觉得你对于 OP 何时将虚部设为零有些困惑,即在 FFT 的输入中。这是完全可以的,因为音频数据没有虚部,而变换后的数据有。 当然,一旦完成了 FFT,你是正确的。你需要计算幅度,而不仅仅是实部。 我认为 leonbloy 所提到的误解更多与频率区间的标签有关,而不是范数 :) - T045T

0
把FFT理解为从一个信号中获取信息的方式。你问的是如何以最佳的方式显示来自两个信号的数据。我的建议是将每个信号独立处理,并为每个信号显示FFT。
如果你想要一个快速的流式FFT,你可以阅读我在这里写的算法:www.depthcharged.us/?p=176

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接