【问题标题】:FFT Algorithm - How to convert samples to complex structs?FFT 算法 - 如何将样本转换为复杂结构?
【发布时间】:2012-07-30 13:36:47
【问题描述】:

我的问题的简短版本:

如何从音频样本数组(如 Int16)转换为常见 FFT 库(如 AForge)使用的复杂结构?

我的问题的长版本:

我是音频处理的新手,我希望分析音乐中的音频(定位节拍、速度等)。经过几天的阅读,快速傅里叶变换 (FFT) 算法似乎朝着正确的方向迈出了一步。

为了不必从头开始实现算法,我下载了几个开源库,Exocortex 和 AForge.net。

我正在将音频解码到内存缓冲区。在我的 16 位 48kHz 音频立体声轨道的每个周期中,我得到 48000 字节或 24000 个样本。这些当前被复制到一个短数组(Int16)中。我现在需要将我的数组转换为复杂结构(在 AForge 的情况下)。这又用“实数”和“虚数”双精度值初始化。但是这些到底是什么,我如何从我的数组转到这两个双精度值?另外,我需要在传递之前将左/右通道分开吗?

不幸的是,只要不是以代码形式呈现的数学公式,我阅读数学公式就很糟糕。到目前为止,在我访问过的几乎所有网站上,很快就会出现希腊符号和复杂的数学公式来帮助解释算法。结果,我马上就迷失在翻译中。相信我,我努力寻找“傻瓜的 FFT 算法”。 ;)

版主注意:这不是Convert Audio samples from bytes to complex numbers? 的重复,即使问题相似。

【问题讨论】:

    标签: c# fft audio-processing


    【解决方案1】:

    您需要拆分通道并单独处理它们,或者将它们平均到单个单声道 - 这最好取决于您最终要完成的任务。

    至于转换数据类型 - 每个实数也是一个复数,其“虚部”为 0,因此转换本质上是用样本创建一个复数数组(最好是标准化的 - 在这种情况下除到 32768,所以实部的值在 [-1,+1]) 范围内,虚部的值为零。

    【讨论】:

    • 感谢您的回答。会尝试的。出于好奇,为什么我必须将虚数设置为 0。它是什么,为什么会存在?
    • 这将不得不涉及所有你说你不想深入研究的公式 - 复杂的数学是一个相当重要和复杂的主题,甚至没有足够的空间在这里开始解释.如果你真的想知道,找一本关于复杂数学的教科书或其他东西;不过,在目前的情况下,我认为“这就是它的工作方式”是最好的答案——如果你使用了 0 以外的任何东西,你会得到错误的答案。
    • 很公平。它现在似乎可以工作了,所以我会接受这个作为答案。
    • 请注意,某些 FFT 库还提供实数到复数 FFT,这比使用将输入数据的所有虚部设置为 0 的复数到复数 FFT 更有效。这接受纯真实输入,但当然您仍然会在频域中获得复杂的输出数据。
    猜你喜欢
    • 2021-05-02
    • 2013-05-15
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多