背景:我正在开发一个iPhone应用程序(在其他几篇文章中也有提及),它在一个人入睡时“听着”打呼//呼吸,并确定是否有睡眠呼吸暂停的迹象(作为“睡眠实验室”的预屏)测试)。该应用程序主要使用“频谱差异”来检测打sn /呼吸,并且在针对睡眠实验室记录(实际上是很嘈杂的)进行测试时,效果很好(大约为0.85--0.90)。

问题:大多数“卧室”噪音(风扇等)我都可以通过几种技术过滤掉,并且经常以人耳无法检测到的S / N级别可靠地检测到呼吸。问题是语音噪音。在后台运行电视或广播(或者只是在远处说话的人)并不罕见,并且声音的节奏与呼吸/打呼closely紧密匹配。实际上,我通过该应用程序对已故的作家/讲故事者比尔·霍尔姆(Bill Holm)进行了录音,与打的节奏,水平变化和其他几种测量方法基本上没有区别。 (尽管我可以说他显然没有睡眠呼吸暂停,至少在清醒时没有。)

所以这有点远(可能是一些论坛规则),但是我正在寻找有关如何区分声音的一些想法。我们不需要以某种方式过滤掉打ore声(这会很好),但是我们只需要一种方法来拒绝被声音过度污染的“太吵”的声音。

任何想法吗?

文件已发布:我已经在dropbox.com上放置了一些文件: recordedFile20120408010300_first_ten_wav.dat

第一个是相当随机的摇滚(我猜)音乐,第二个是已故比尔·霍尔姆演讲的录音。两者(我将其作为“噪声”样本从打中区分出来)都与噪声混合在一起,以使信号模糊。 (这使识别它们的任务变得更加困难。)第三个文件是您录音的十分钟,真正的录音中前三分之一主要是呼吸,中间三分之一是呼吸/打呼mixed,最后三分之一是稳定的打nor。 (您会咳嗽以获取奖金。)

由于许多浏览器都非常难以下载wav文件,所有这三个文件都已从“ .wav”重命名为“ _wav.dat”。下载后,只需将它们重命名为“ .wav”即可。加上设计得不太好的算法。在一般情况下,熵对我的作用很小。和其他一些措施)每秒大约采样8次(从主要FFT周期(每1024/8000秒)获取一次统计信息)。对于1024个样本,这涵盖了大约两分钟的时间范围。我希望由于打/呼吸与声音/音乐的节奏较慢,我能够看到这种模式(并且它可能也是解决“可变性”问题的更好方法),但是尽管有提示到处都是模式,没有什么我可以真正锁定的。

(更多信息:在某些情况下,信号幅度的FFT会产生一个非常明显的模式,在0.2Hz处有一个很强的峰值,并产生阶梯谐波。但是这种模式在大多数情况下并没有那么明显,语音和音乐产生的声音也不太明显可能有某种方法可以计算品质因数的相关值,但似乎需要对约4阶多项式进行曲线拟合,而在电话中每秒进行一次拟合似乎不切实际。

我还尝试了将频谱划分为5个单独“频段”的平均幅度的FFT。频段为4000-2000、2000-1000、1000-500和500-0。前4个频段的模式通常与总体模式相似(尽管没有真正的“突出”频段,并且在较高频段中的信号往往消失了),但500-0频段通常只是随机的。

赏金:我将给予弥敦道赏金,尽管他没有提供任何新的东西,因为他是迄今为止最有成效的建议。不过,如果他们提出了一些好主意,我仍然会愿意奖励其他人。

评论

您可以张贴一些代表性的频谱图吗? (让数据开始讨论。)您如何计算“光谱差异”?

有时将“光谱差异”称为“光谱通量”和其他一些术语。基本上,它是声音的连续FFT中个体差异的平方和。

想一想,音频片段会更好。感谢您的澄清。

我正在尝试找出最好的演示文稿。我没有花哨的软件来为短样本制作频谱(除了我的实际FFT),Audacity需要太长的样本来捕获单个声音的频谱。发布实际的患者声音有一些医疗隐私问题。

@DanielRHicks带有电视+打no的频谱图,只是打sn或类似的东西,实际上会走很长的路。

#1 楼

背景

根据下面的论文,打nor的特征是在约130Hz处出现一个峰值,并且完全集中在12kHz以下:在用于居家护理的整夜睡眠分析中
一种有效的快速打of检测方法,用于研究睡眠障碍
一种有效的对睡眠声音打//不打classification分类的方法

让我们看看是否可以利用这一点。

MATLAB示例

我们对儿童打的记录不佳;一个10分钟的8位单声道WAV文件。采样率为8KHz,这意味着音频信号的带宽为4KHz。电平很低,因此我将首先对其进行压扩。您在0.1处看到的陷波对应于400Hz的频率。在〜186s有一个对应于咳嗽的尖峰;忽略那个。我们可以隐约看到每次打ly时的刻痕。不仅如此,而且它们似乎集中在0.2 x 4KHz = 800Hz以下。让我们仔细看看。

[snd,fs]=wavread('recordedFile20120408010300_first_ten_minutes');
cmp=compand(snd,255,1);
wavwrite(cmp,'companded'); % used for listening purposes
[s,f,t,p]=spectrogram(snd,hann(8192));
surf(linspace(0,600,length(t)),f/pi,10*log10(p),'edgecolor','none'); 
axis tight; view(0,90);




这次,频率轴用赫兹标记。现在的缺口很清楚。我们甚至可以看到电源线噪声的泛音始于60Hz(180Hz,300Hz,420Hz)。现在是算法的本质:让我们根据该子带中的能量对信号进行分类,并去除线路噪声。

idx_max_freq=round(0.2*length(f));
surf(linspace(0,600,length(t)),fs*f(1:,idx_max_freq:)/(2*pi),10*log10(p(1:idx_max_freq,:)),'edgecolor','none');
axis tight; view(0,90);


如果想花哨的话,我们可以丢弃超大的尖峰:
freq_list=round([1:57 63:177 183:297 303:417 423:800]*idx_max_freq/800);
y=10*log10(sum(p(freq_list,:)));
plot(linspace(0,600,length(y)),y-median(y))
stem(linspace(0,600,length(y)),y-median(y)>.5*std(y))


SNR低,表现为困难在第一张图中辨别信号,意味着我们只有标准偏差的一半(其值为4.1)。茎上有打the声。

评论


$ \ begingroup $
是的,我目前的算法通过将处于大致恒定水平的FFT桶归零来消除嗡嗡声和其他谐波噪声(通风机噪声通常约为110Hz)。我不清楚当您说“让我们根据该子带中的能量对信号进行分类”时的意思-您指的是哪个子带?
$ \ endgroup $
–Daniel R Hicks
2012年5月25日,0:42

$ \ begingroup $
哦,我明白了,您是在谈论800 Hz以下的频率-我错过了这一点。
$ \ endgroup $
–Daniel R Hicks
2012年5月25日0:43

$ \ begingroup $
如果您查看上方的图表,则会发现顶部附近有很多信息,而中间区域则有另一个频段。这些频段的竞争噪音要小得多。我当前的方案对频谱进行切片,并尝试评估每个切片的SNR,然后对它们进行相应的加权。
$ \ endgroup $
–Daniel R Hicks
2012年5月25日0:48

$ \ begingroup $
您可以连接多个特征,例如选定子带中的能量,频谱平坦度等,以创建一个暂定的特征向量。然后执行PCA,找出最重要的部分,如上一论文所述。
$ \ endgroup $
–埃姆雷
2012年5月25日0:59



$ \ begingroup $
没有PCA的严格要求,这基本上就是我正在做的事情。
$ \ endgroup $
–Daniel R Hicks
2012年5月25日下午1:33

#2 楼

只是将其放入此处以涵盖所有可能性,您也许可以使用熵,我不知道打nor声与语音的熵水平是多少,但是如果打different与语音的熵水平足够大,那么它可能起作用。 /www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf

评论


$ \ begingroup $
我不完全了解我在做什么(信息理论使我大跌眼镜),但是我实现了粗略的熵计算,并进行了一些完全非理论上的归一化,似乎加工。音乐和声音的熵低(负),而打则明显高。通常,背景噪声似乎会降低(负)值,因此它提供了很好的品质因数。不过,还需要更多的实验。
$ \ endgroup $
–Daniel R Hicks
2012年3月27日18:04

$ \ begingroup $
要注意的一件事是,您还需要包括一个简单的电平门,因为您可能会产生极低的电平后向噪声,可能与您尝试通过的东西相匹配,我的经验似乎也暗示极端低级噪声的数字量化可能会增加信号的阶数,因为在低电平时,可能的采样值数量会减少,并且仅熵不会考虑幅度差异。
$ \ endgroup $
–弥敦道日
2012年3月27日22:20



$ \ begingroup $
是的,我经常与噪声作斗争,并且有一种很好的方法可以单独进行测量。当噪音超过一定水平时,我会打unt。 (实际上,测量噪声非常困难。)
$ \ endgroup $
–Daniel R Hicks
2012年4月2日在18:12

$ \ begingroup $
A,我发现我的原始熵计算所测量的大部分内容都是计算的假象(由于测试数据为零)。它可以满足我的需求,但不如我最初想象的那么好。
$ \ endgroup $
–Daniel R Hicks
2012年4月24日,1:12

$ \ begingroup $
后续工作:我将一直使用的固定/浮点FFT替换为一个完整的浮点1(在电平较低时不会产生零),并且熵的作用进一步降低了- -似乎没有提供任何特别有用的东西。
$ \ endgroup $
–Daniel R Hicks
2012年6月8日13:26

#3 楼

时域统计也许?打nor似乎具有相对较长的稳定状态,而语音能量在短时间内会发生很大变化。这也可以与频谱分析相结合。元音的低频成分更多,辅音的高频成分更多。在语音过程中,频谱可能会在这些状态之间快速来回反弹,而存储可能会在一种状态下保持更长的时间。

评论


$ \ begingroup $
基本的时域统计信息无法区分。但是,我可以考虑一下短期可变性(我通常会对此进行平滑处理)是一个好方法。寻找频带之间的“跳动”也是一个好主意……我目前分为5个频带,并拒绝具有明显较低S / N的频带。
$ \ endgroup $
–Daniel R Hicks
2012-03-25 0:14



$ \ begingroup $
@DanielRHicks我在其他地方看到了如何计算倒谱包络,但是也许您可以将其用作频谱变异性的度量,而不是纯频谱,因为纯频谱会更“嘈杂/呈锯齿状”,而倒谱则倾向于对我来说比较顺利。我还听说过在语音Recog中使用了Mel倒谱,这听起来像对您有用。
$ \ endgroup $
–太空
2012-3-25的3:36

$ \ begingroup $
@DanielRHicks:用什么方法无法区分?他们对我当然是有区别的。
$ \ endgroup $
– Endolith
2012年3月25日19:09

$ \ begingroup $
@endolith-根据我当前的度量标准,无法区分-“光谱差异”加总能量水平。但是它们经过约0.5秒时间常数的低通滤波。我想我会尝试查看未过滤的数据。
$ \ endgroup $
–Daniel R Hicks
2012年3月26日上午11:50

$ \ begingroup $
我可以尝试获取短期时间统计信息。一些“提示”,但没有确定的含义。
$ \ endgroup $
–Daniel R Hicks
2012年3月27日18:12

#4 楼

随时间变化的光谱复杂度。我假设人类的语音可能比打nor的音素序列使用更多的音素,并且其音序在统计上要复杂得多。

这比连续的语音识别要容易得多您实际上不需要正确识别任何特定的音素或句子,只需识别音素发音频谱段的数量,以及对其序列进行某种统计上的复杂性度量即可(熵或可压缩性测试可能会起作用)。然后查看是否可以确定这些措施的可靠阈值。

评论


$ \ begingroup $
问题是打非常复杂/随机,并且在检查其频谱时缺乏很多明显特征。
$ \ endgroup $
–Daniel R Hicks
2012年3月26日上午11:53

$ \ begingroup $
如果一个睡觉的人在睡觉时像醒着时一样形成许多不同的元音滤音器和爆破音(以及这种音调和三音图的密度随时间变化),音高变化(等),那将是一个有趣的信息。说。
$ \ endgroup $
– hotpaw2
2012年3月26日13:55



$ \ begingroup $
缺少功能可能是一个重要功能。语音具有特征。
$ \ endgroup $
– hotpaw2
2012年3月26日14:01

$ \ begingroup $
一个问题是打from可能会从一次呼吸到另一次呼吸而变化很大。一次简单的重呼吸非常“白”,但打sn声可能会产生一些非常强烈的尖峰。从本质上讲,这是一个方波,尽管这过于简化。而且我们需要在智能手机上实时进行分析,因此算法的复杂性受到限制。
$ \ endgroup $
–Daniel R Hicks
2012-3-27的1:43