这又是我的打鼾探测器。
当那里有任何东西时,我已经非常擅长检测信号 - 可以从墙壁剥离的鼾声到你甚至在录音中都听不到的呼吸。问题是,我无法判断信号何时降至可检测水平以下,而应用程序只是“听到声音”。而且,不幸的是,打鼾/呼吸通常是不规则的,简单的自相关或类似的间隔计时方案不太可能有太大帮助。(实际上,在某些情况下,噪音可能比呼吸更规律。)
那么,我是否缺少任何技巧来确定没有信号的时间?鉴于“信号”一开始就很像噪音,我似乎在这里遇到了一个困难的地方。
(也许这与我遇到的另一个问题有关:奇怪的是,即使声音很大,我也无法准确(甚至近似)测量信号电平。因为无论如何我都需要使用滚动平均值和比率来检测信号,关卡信息会丢失。我正在寻找一些技巧来重建它。)
基本技术
(尤达)
音频信号被采样(通常以 8000Hz,由于各种原因),然后在 1024 个块中进行 FFT。(在我的实验中,汉明过滤器和重叠块似乎没有什么影响,尽管稍后可能会重新访问。)
FFT 被划分为“波段”(目前为 5 个,大小略微倾斜以将更多细节放在低端),并将每个波段的“光谱差异”和电平相加。峰值限制值的长期平均值用作“阈值”,并使用进一步的偏差调整来保持大约 20% 的“超过阈值”率。
每个“超过阈值”值的权重为 1(低于阈值的权重为 0),但随后该权重通过频段中明显的“可变性”(大约 2Hz)进行调整,以赋予频段更多权重携带更明显的信号。
将频带的权重相加,然后将后续块的权重相加大约一秒钟以产生运行“分数”。这再次与运行平均阈值(加上几个启发式)进行比较,以检测打鼾的开始/偏移。
更新
我突然想到,如果我的算法有效地保持恒定电平信号(根据我的信号电平问题),有效测量 SNR 的方法是在没有信号时测量噪声。
方便的是,打鼾是间歇性的,中间有很多“死气”。而且我已经检测到打鼾信封了。因此,信封之外的任何东西(在一次鼾声结束和下一次鼾声开始之间)都可能是噪音!我可以(以一定程度的准确度/可重复性)测量。(当然,我们花了 3 次尝试才想出一个中规中矩的算法——现实永远与理论不符。)
所以我还没有完整的答案,但我已经取得了进展。
(虽然上述技术为我提供了一个相当好的 SNR 代理,但我仍然无法估计实际信号电平。我的“相对电平”指示可能超出了几乎听不见的呼吸声的范围,而对于窗户嘎嘎声则马马虎虎。我需要某种绝对级别的代理。)