我正在尝试从音频流中提取音高数据。从我所看到的情况来看,FFT似乎是最好的算法。
不是直接挖掘数学,有人可以帮我理解这个FFT算法的作用吗?
请不要说'FFT从原始信号中提取频率数据'。我需要更高层次的细节。
我传递了什么,我该怎么办?
一旦我清楚地理解了界面,这将有助于我理解实施。
我认为我需要传入一个音频缓冲区,我需要告诉它每个计算要使用多少字节(比如说这个缓冲区最近的1024个字节)。也许我需要指定我想要它检测的音高范围。现在它会回传什么?一系列频率箱?这些是什么?
(编辑:)我找到了一个可以使用的C ++算法(如果我只能理解它)
Performous从麦克风中提取音高。代码也是开源的。下面是对编码它的人所做的算法的描述。
但有人可以帮我理解这是如何运作的吗?什么是从FFT发送到重新分配方法?
答案 0 :(得分:3)
FFT只是该过程中的一个构建块,它可能不是音调检测的最佳方法。阅读音高检测并决定首先要使用哪个算法(这将取决于你究竟要测量的音量,单个乐器,其他类型的声音等等。在进入低音之前先做好准备诸如FFT之类的电平细节(一些但不是所有的音调检测算法都在内部使用FFT)。
关于SO已经有很多类似的问题,例如: Real-time pitch detection using FFT和Pitch detection using FFT for trumpet,还有好overview material on Wikipedia等 - 阅读这些内容,然后决定是否仍要推出自己的基于FFT的解决方案,或者使用适合的现有库你的特定应用。
答案 1 :(得分:2)
这里有一个选择元素。最直接的实现是复杂的数字(2 ^ n个样本)和2 ^ n个复数,所以也许你应该从那开始。
在DCT(离散余弦变换)的特殊情况下,通常进入的是2 ^ n个样本(通常是浮点数),并且输出2 ^ n个值,通常也是浮点数。 DCT是一个FFT,但它仅采用实数值,并根据余弦分析函数。
定义用于处理复杂值的结构是明智的(但通常会被跳过)。传统上,FFT是就地完成的,但如果不这样做,它就可以正常工作。
实例化包含FFT工作缓冲区的类(如果您不想就地进行FFT)并将其重用于多个FFT可能很有用。
答案 2 :(得分:1)
进入N个PCM样本(纯粹的真实复数)。输出来自频域的N个区间(每个区间对应于1 / N切片的采样率)。每个bin都是一个复数。这些值通常应以极坐标格式(绝对值和参数)处理,而不是实部和虚部。绝对值表示靠近箱中心频率的声音量,而参数告诉相位(正弦波正在哪个位置行进)。
编码人员通常只使用幅度(绝对值)并丢弃相位角(参数)。