2009-01-07 153 views
6

我试图找到一种算法来检测用户在WM6设备上用C#吹入麦克风(如Ninentdo DS或iPhone)时的情况。如何监听麦克风的噪音?

我正在考虑使用波形从麦克风实时读取到一个小缓冲区,但我有点失去了如何识别吹的声音,我想这听起来像白噪声。任何人有想法如何做到这一点?

任何帮助将不胜感激。

+0

“噪音”..似乎是一个尴尬的配对。 – mmcdole 2009-02-14 06:31:27

+0

你是否在意这种声音是吹的,而不仅仅是响亮的东西?如果你不关心声音是什么,这个问题变得更容易。 – 2009-02-14 06:31:44

回答

4

如果我要解决这个问题,我会吹进麦克风和record that。然后对波数据运行an FFT以获得主频(或少数)。我会这样做几次“打击”,看看他们是否会产生类似的结果。如果他们这样做(我确信他们会这样做),那么我会使用算法来寻找相同的频率。

这不是一项简单的任务,但是由于大量的录音和数学工作已经完成,您可能可以在没有太多痛苦的情况下工作。

+0

我不知道OpenNetCF有一个FFT函数。很酷。 – MusiGenesis 2009-01-08 02:24:32

+0

事实上,我们有两种不同的实现方式,我很久以前就做过了(可能在1.2版本左右)。 – ctacke 2009-01-08 02:48:57

+0

我认为“噪音”(至少是白噪声,这是吹入麦克风应该产生的噪音)是所有频率的混合;一个主导频率意味着音调,这会使声音“不是噪音” – 2009-02-14 07:16:26

1

这是不完全一样,但这里是我回答关于音符开始检测问题:

Note onset detection

答案描述了依赖于信号强度的上升高于给定的阈值的方法。这种方法可以检测吹气噪音,尽管它也会响应任何噪音,所以说话等也会触发它。

您可以使用FFT,但我认为这样做实时使用速度太慢,尤其是在Windows Mobile设备上(尽管它可能足够快)。但是,吹风机噪音不太可能具有主导频率,除非鼓风机鸣笛特定音符。如果FFT速度足够快,您可能实际上想要查找没有主频的噪声(假设任何具有主导频率或频率的是语音或某种仪器)并且权重很大朝着可听范围的上端(大约10,000hz左右)。

3

麦克风的击中不一定会显示高频范围(10,00hz +)的主频率。吹出PC麦克风很可能会导致信号失真和失真,同时也会产生很多低频率的频率。产生的信号将只是一个大的饱和突发。

几年前,我不得不做一个类似的项目,我所做的只是寻找音量高于正常水平的音量。工作很好。

3

sthg的回答提到变形可能是吹入话筒的结果。我只做了一个快速测试,并且我的吹风录音(在便宜的麦克风上)显示了大量样本的最小值和最大值(例如,每个样本16位WAV文件中的32767和-32768),其中看起来像一个平顶已被应用到每个峰值。检测吹气声音的一种非常简单的方法可能是对所有处于最小/最大值的样本进行计数,并且如果它们占总数(或其他阈值)的5%以上,则认为吹气发生。

1

我没有看过这个频谱,但我认为你应该看到一个频带限制的噪声频谱,大部分能量低于几百赫兹。这意味着你不需要完整的音频带宽FFT,16K点是矫枉过正的。即使是在一个小带宽上的256点FFT,你也应该能够告诉从话音中吹出麦克风的噪音。