我正在寻找从声音信号中提取音高.
IRC上的某个人刚刚向我解释了如何采用双FFT实现这一目标.特别:
我正在尝试使用vDSP
我无法理解我之前没有遇到过这种技术.我做了很多狩猎和提问; 几周值得.更重要的是,我无法理解为什么我没有想到它.
我试图用vDSP库实现这一目标.它看起来好像有处理所有这些任务的功能.
但是,我想知道最终结果的准确性.
我之前使用的技术是将单个FFT的频率区域扫描为局部最大值.当它遇到一个时,它使用一种狡猾的技术(自上次FFT以来的相位变化)来更准确地将实际峰值放置在箱内.
我担心这种精确度会因为我在这里介绍的技术而丢失.
我想这种技术可以在第二次FFT之后使用,以准确地得到基波.但有点看起来信息在第2步中丢失了.
由于这是一个潜在的棘手过程,有经验的人可以只看一下我正在做的事情并检查它的理智吗?
此外,我听说有一种替代技术涉及在相邻的箱子上安装二次方.这是否具有可比性?如果是这样,我会赞成它,因为它不涉及记住bin阶段.
所以,问题:
有人能指出我对这种技术的一些研究或文献吗?
主要问题:它足够准确吗?可以提高准确度吗?一位专家刚刚告诉我,准确性是不充分的.这是行的结束吗?
皮
PS当我想创建标签时,我很生气,但不能.:| 我已向维护人员建议SO跟踪尝试的标签,但我确信我被忽略了.我们需要vDSP标签,加速框架,倒谱分析
我目前正在从事我的第四年项目(计算机科学),该项目涉及音乐的自动转录 - >乐谱.我现在在Matlab中这样做,但是必须在某个阶段转换为java.
我的问题:我的程序返回纯正弦音的正确音符,现在我遇到了从自然乐器演奏的音符中检索基频的问题.对于某些音符,代表音符基础的峰值似乎完全没有.例如,当我从车库带播放G3音符时,它显示为G4,因为我的情节中只出现了第1,第3,第5和第7次谐波.我试图添加图像,但这是我的第一篇文章,它不允许我.任何指向正确方向的人都会非常感激.
我得到了傅立叶变换的频谱。它看起来像这样:

警察刚从附近经过
颜色代表强度。
X 轴是时间。
Y 轴是频率 - 其中 0 位于顶部。
虽然吹口哨或警笛只留下一点痕迹,但许多其他音调似乎包含很多谐波频率。
电吉他直接插入麦克风(标准调音)
真正糟糕的是,正如你所看到的,没有主要的强度——有 2-3 个频率几乎相等。
我编写了一个峰值检测算法来突出显示最重要的峰值:
function findPeaks(data, look_range, minimal_val) {
if(look_range==null)
look_range = 10;
if(minimal_val == null)
minimal_val = 20;
//Array of peaks
var peaks = [];
//Currently the max value (that might or might not end up in peaks array)
var max_value = 0;
var max_value_pos = 0;
//How many values did we check without changing the max value
var smaller_values = 0;
//Tmp variable for performance …Run Code Online (Sandbox Code Playgroud)