2015-04-15 140 views
1

我正在开发用于频率检测的IOS应用程序,我使用的算法YIN,这是非常精确的:巫大胆,我已经生成的不同的矩形波频率 - 我的算法精度约为0.1% - 例如产生一个82,4 Hz(E字符串)的音调,我真的得到了82.4 Hz,没有别的。无论如何,当我弹奏吉他弦时,我经常会得到泛音,有时可能比基音(F0)更强(幅度更高)。因此,我的显示器开始“跳舞”和切换 - 有时甚至发生(当音调消失时),我的算法停止在泛音频率(例如A而不是E) - 因此用户必须再次弹奏字符串或查看他想要的音色(频率)是否存在。我知道这种现象与我的算法无关,因为它只是一个“硬件”问题(我的意思是简单地产生泛音的吉他)。贤频检测和色彩(吉他弦)

我一直试图平滑(频率检测)的结果,或者一旦关键频率(例如E弦+/-容差为82.4 Hz)已经被“捕捉”到固定频率检测。总之,我的算法经常会发生错误的频率。

我在问自己,吉他调音器(对于吉他店中的10美元)是多么便宜,因为它们的频率检测也是可靠和稳定的。

我不想改变算法,但有两个可能的解决方案进入我的脑海:

  1. 信号(可能是汉宁窗,低通或带通滤波)和/或
  2. 后处理的预处理的信号(某种频率平滑)。

有人想法如何克服“波涛汹涌”的结果?

回答

1

我用自相关为我的免费应用程序色彩和iTransposer成立的汉宁窗所以这可能会帮助你。我最初并没有在寻找准确性,因为我想在一个壁上显示音符而不是一米。然而,我的一位朋友在他的工作中使用信号发生器测试了它的频率为0.1Hz,并且使用正弦波等简单信号的问题超过了383Hz。我曾用各种铜管乐器试过,吉他和Garageband乐器似乎没问题调整。 基本上,我实现了这个http://www.ucl.ac.uk/~ucjt465/tutorials/praatpitch.html 使用VDSP和更新,由凯文·P·墨菲提供的示例项目https://github.com/kevmdev/PitchDetectorExample

+0

谢谢,psybersonic - 我已经试过了你的建议,并有相关的频率稳定度略有改善。为了更好地理解音高或语音检测,论文“Pitch in Praat”为我提供了很多帮助。非常感谢! –

+0

很高兴帮助Ulrich。数字音频并不容易。如果您使用Kevin Murphy的任何代码,则音频控制器中存在内存泄漏。需要添加免费(THIS-> bufferList.mBuffers [0] .mData);在录音回调结束时。 (如果我的记忆是正确的)。 – psybersonic