我想检测的不是音高,而是所唱音符的音高等级。
因此,无论是 C4 还是 C5 并不重要:它们必须都被检测为 C。
想象一下钟面上排列的 12 个半音,指针指向音级。这就是我所追求的!理想情况下,我希望能够判断所唱的音符是准确还是略微偏离。
这不是之前提出的问题的重复,因为它引入了以下约束:
声源是单一人声,希望背景干扰可以忽略不计(尽管我可能需要处理这个问题)
Octave 不重要,只有音级
编辑——链接:
Real time pitch detection
Using the Apple FFT and Accelerate Framework
最佳答案
请在此处查看我的答案以获得顺利的频率检测:https://stackoverflow.com/a/11042551/1457445
就将此频率捕捉到最近的音符而言——这是我为我的调谐器应用程序创建的一种方法:
- (int) snapFreqToMIDI: (float) frequencyy {
int midiNote = (12*(log10(frequencyy/referenceA)/log10(2)) + 57) + 0.5;
return midiNote;
}
这将返回 MIDI 音符值 ( http://www.phys.unsw.edu.au/jw/notes.html )
为了从这个 MIDI 音符值中得到一个字符串:
- (NSString*) midiToString: (int) midiNote {
NSArray *noteStrings = [[NSArray alloc] initWithObjects:@"C", @"C#", @"D", @"D#", @"E", @"F", @"F#", @"G", @"G#", @"A", @"A#", @"B", nil];
return [noteStrings objectAtIndex:midiNote%12];
}
有关使用输出平滑实现音高检测的示例,请查看 musicianskit.com/developer.php
关于iphone - C/C++/Obj-C 实时算法从人声输入中确定音符(不是音高),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4062099/