我正在尝试找到一种算法,以便使用C#在WM6设备上检测用户吹入麦克风的声音(例如Ninentdo DS或iPhone)。我考虑使用Waveform实时从麦克风读取到一个小缓冲区中,但是我不太清楚如何识别吹气声,我猜它听起来像白噪音。有人知道如何做吗?任何帮助都将不胜感激。
在麦克风上吹气并不一定会显示高频(10,00Hz以上)的主导频率。在PC麦克风上吹气很可能会导致信号饱和和失真,这也会产生很多低频频率。结果信号只是一个大的饱和爆发。
我以前也做过类似的项目,我的方法就是简单地寻找远高于正常说话水平的音量峰值。效果不错。
sthg的回答提到吹麦克风可能会导致失真。我进行了一个快速测试,在便宜的麦克风上录制的吹声录音显示出许多最小和最大值的样本(例如,在16位每个样本的WAV文件上为32767和-32768),这看起来像是在每个峰值上应用了平顶。检测吹声的一种非常简单的方法可能只是计算所有处于最小/最大值的样本,并且如果它们占总数的5%以上(或其他阈值)则假定发生了吹声。
这并不完全相同,但这是我对于关于音符起始检测的问题的回答:
该回答描述了一种依赖于信号强度超过给定阈值的方法。这种方法可以用来检测吹气声,但它也会响应任何噪音,比如说说话等。
你可以使用FFT,但我认为这在实时处理方面太慢了,特别是在Windows Mobile设备上(虽然它可能足够快)。然而,除非吹气者吹奏特定的音符,否则吹气声不太可能有主导频率。如果FFT足够快,你实际上可能想要寻找没有主导频率(假设任何具有主导频率或频率的东西都是语音或某种乐器)且重点放在听觉范围的上限(大约在10,000赫兹以上)的噪音。
我还没有研究过其频谱,但我认为你应该看到一个带限噪声频谱,大部分能量应该在几百赫兹以下。这意味着你不需要进行完整的音频带宽FFT,16000个点是过度杀伤了。即使在256个点FFT上,你也能够通过一个小带宽中的噪声来区分出噪声和语音。