代码之家  ›  专栏  ›  技术社区  ›  P i

FFT算法:什么进/出?(回复:实时俯仰检测)

  •  4
  • P i  · 技术社区  · 14 年前

    我试图从音频流中提取音调数据。从我看来,FFT似乎是最好的算法。

    请不要说像“FFT从原始信号中提取频率数据”这样明显的话。我需要更详细的信息。

    一旦我清楚地理解了接口,这将帮助我理解实现。

    我认为我需要传入一个音频缓冲区,我需要告诉它每次计算要使用多少字节(比如这个缓冲区最近的1024字节)。也许我需要指定我想让它探测到的音高范围。现在它会传回来什么?一排频率箱?这些是什么?

    (编辑:)我找到了一个C++算法(如果我只能理解它)

    Performous

    • 动力系统控制模块输入(带缓冲)
    • 重新分配方法(与先前200个样本的FFT相比)
    • 峰值过滤(这部分可以做得更好,甚至可以忽略不计)
    • 把峰组合成一组谐波(我们称这种组合为音调)
    • 音调的时间滤波(更新先前检测到的音调集,而不是简单地使用新检测到的音调集)
    • 选择最好的声调(频率限制,加权,也可以使用谐波阵列,但我不认为我们这样做)

    但有人能帮我理解这是怎么回事吗?从FFT发送到重新分配方法的是什么?

    3 回复  |  直到 14 年前
        1
  •  2
  •   user180326 user180326    14 年前

    这里有一个选择的因素。最简单的实现方法是输入复数(2^n个样本),输出复数(2^n个样本),所以也许应该从这个开始。

    在DCT(离散余弦变换)的特殊情况下,通常输入的是2^n个样本(通常是浮动的),输出的是2^n个值,通常也是浮动的。DCT是一种FFT,但它只取实数,并用余弦来分析函数。

    实例化一个包含FFT工作缓冲区的类(如果您不想就地执行FFT)并将其重用到多个FFT是很有用的。

        2
  •  3
  •   Community Dan Abramov    7 年前

    已经有许多类似的问题,例如。 Real-time pitch detection using FFT Pitch detection using FFT for trumpet overview material on Wikipedia 等等-阅读这些,然后决定你是否仍然想要滚动你自己的基于FFT的解决方案,或者使用现有的适合你的特定应用程序的库。

        3
  •  1
  •   Tronic    14 年前

    PCM的N个样本(纯实数复数)。频率域的N个存储单元(每个存储单元对应于采样率的1/N切片)。每个箱子都是复数。这些值通常应以极坐标格式(绝对值和参数)处理,而不是实部和虚部。绝对值表示接近音箱中心频率的声音量,而参数表示相位(正弦波在哪个位置传播)。

    大多数情况下,编码器只使用幅度(绝对值)和丢弃相位角(参数)。