如何监控麦克风的噪音声音?

6
我正在尝试找到一种算法,以便使用C#在WM6设备上检测用户吹入麦克风的声音(例如Ninentdo DS或iPhone)。我考虑使用Waveform实时从麦克风读取到一个小缓冲区中,但是我不太清楚如何识别吹气声,我猜它听起来像白噪音。有人知道如何做吗?任何帮助都将不胜感激。

“噪音声音”…似乎是一个尴尬的组合。 - mmcdole
你在意声音是吹的还是只是很大声吗?如果你并不在乎声音是什么,那问题就变得容易得多了。 - Steve Rowe
5个回答

4
如果我要解决这个问题,我会对着麦克风吹气并录音(记录下来)。然后在波形数据上运行FFT以获取主频率(或几个频率)。我会对几次“吹气”都进行相同的操作,看它们是否产生类似的结果。如果它们确实如此(我相当确定它们会),那么我会使用算法来查找那个相同的频率。
这不是一项琐碎的任务,但由于大部分录音和数学工作已经完成,所以你可能可以在不太费力的情况下让它工作。

实际上,我们有两个不同的实现,我很久以前就完成了(可能是在1.2版本或更早之前)。 - ctacke
我认为“噪音”(至少是吹麦克风应该产生的白噪声)根据定义是所有频率的混合物;占主导地位的频率将意味着音高,这将使声音“不是噪音”。 - Steven A. Lowe
不同的麦克风会产生不同的频率特征。我认为在频域中尝试检测这一点只会是一个太过于“棘手”的算法...在某些情况下工作,在其他情况下失败。 - Nik Reiman

3

在麦克风上吹气并不一定会显示高频(10,00Hz以上)的主导频率。在PC麦克风上吹气很可能会导致信号饱和和失真,这也会产生很多低频频率。结果信号只是一个大的饱和爆发。

我以前也做过类似的项目,我的方法就是简单地寻找远高于正常说话水平的音量峰值。效果不错。


1万赫兹的事情完全是瞎猜 - 我从来没有看过吹奏的录音。你提到失真让我想到了另一个答案的主意。 - MusiGenesis

3

sthg的回答提到吹麦克风可能会导致失真。我进行了一个快速测试,在便宜的麦克风上录制的吹声录音显示出许多最小和最大值的样本(例如,在16位每个样本的WAV文件上为32767和-32768),这看起来像是在每个峰值上应用了平顶。检测吹声的一种非常简单的方法可能只是计算所有处于最小/最大值的样本,并且如果它们占总数的5%以上(或其他阈值)则假定发生了吹声。


简单,高效,快速...我认为这是我走的路线(虽然它没有滚动FFT那么有趣)。 - ctacke
谢谢。我希望有人能理解“假设正在发生吹气”的幽默意味。 :) - MusiGenesis

1

这并不完全相同,但这是我对于关于音符起始检测的问题的回答:

音符起始检测

该回答描述了一种依赖于信号强度超过给定阈值的方法。这种方法可以用来检测吹气声,但它也会响应任何噪音,比如说说话等。

你可以使用FFT,但我认为这在实时处理方面太慢了,特别是在Windows Mobile设备上(虽然它可能足够快)。然而,除非吹气者吹奏特定的音符,否则吹气声不太可能有主导频率。如果FFT足够快,你实际上可能想要寻找没有主导频率(假设任何具有主导频率或频率的东西都是语音或某种乐器)且重点放在听觉范围的上限(大约在10,000赫兹以上)的噪音。


在主频方面,我会相信你的话。我的FFT工作都是用于地震分析。我所知道的是,看起来“嘈杂”的波形通常会显示出几个由自然频率引起的主要峰值。我假设(可能是错误的),在白噪声中也会看到类似的情况。 - ctacke
我认为白噪声本身在所有频率上显示相同的强度(尽管可能是粉红噪声 - 现在已经很晚了,我太累了不想谷歌)。然而,我不认为一次打击实际上会产生白噪声。 - MusiGenesis

1

我还没有研究过其频谱,但我认为你应该看到一个带限噪声频谱,大部分能量应该在几百赫兹以下。这意味着你不需要进行完整的音频带宽FFT,16000个点是过度杀伤了。即使在256个点FFT上,你也能够通过一个小带宽中的噪声来区分出噪声和语音。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接