评估自相关“质量”的最佳方法?

信息处理 自相关
2022-01-15 17:12:50

这是我的打鼾应用程序的附带说明。

我很擅长产生音频信号的自相关,看看它是否与打鼾/呼吸“相关”得很好。我有一个简单的算法(产生 1.0 作为第零个元素,这是一个好兆头),但我想知道如何评估结果以确定自相关是否强,也许更进一步,如何使用它来分离各种可能的声源。

问题 #1:自相关(跳过零元素)的 RMS 是否与任何“质量”指标一样好,还是有更好的指标?

详细说明: 我只是想要一种数字方式(与“查看”图表相比)来区分高度自相关的信号和不太好的自相关信号。

(我真的不知道要问什么其他问题。)

一些早期结果: 在某些情况下,自相关(RMS 或峰值)显示打鼾时的显着跳跃——正是我希望看到的响应。在其他情况下,在这些测量中根本没有明显的运动(这可能是两个连续的打鼾和两个响应),并且在高噪声情况下,测量值实际上在打鼾期间(略微)下降。

更新——5 月 22 日: 我终于有时间再做一些工作了。(我被另一个应用程序拖住了,这真的很痛苦。)我将自相关的输出输入到 FFT 中,输出有点有趣——当打鼾开始时,它在原点附近显示了一个相当戏剧性的峰值。

所以现在我面临着以某种方式量化这个峰值的问题。奇怪的是,就绝对幅度而言,最高峰出现在其他时间,但我尝试了峰值与算术平均值的比值,结果很好。那么有什么好方法可以测量 FFT 的“峰值”。不要说我需要对其进行 FFT 分析——这东西已经快要吞掉它自己的尾巴了。:))

此外,在我看来,如果我对输入的自相关结果进行镜像反射,FFT 的质量可能会有所提高,中间为零(根据定义为 1.0 量级)。这会将“尾巴”放在两端。这(可能)是个好主意吗?镜像应该是直立的还是倒立的?(当然,不管你说什么我都会尝试,但我想也许我可能会得到一些关于细节的提示。)

试过平整度——

我的测试用例大致可以分为“乖巧”类和“问题儿童”类。

对于“表现良好”的测试用例,自相关的 FFT 平坦度急剧下降,并且自相关峰值与平均自相关之比在打鼾期间攀升。这两个数字的比率(峰值比率除以平坦度)特别敏感,在呼吸/打鼾期间表现出 5-10 倍的爬升。

然而,对于“问题儿童”来说,数字却完全相反。峰均比略有下降,而平坦度实际上增加了 50-100%

这两个类别之间的区别(大部分)是三倍的:

  1. “问题儿童”的噪音水平(通常)更高
  2. “问题儿童”的音频水平(几乎总是)较低
  3. “问题儿童”往往包括更多的呼吸和更少的实际打鼾(我需要检测两者)

有任何想法吗?

更新 -- 2012 年 5 月 25 日: 跳胜利舞有点为时过早,但是当我反映一个点的自相关,对其进行 FFT,然后进行光谱平坦度时,我的组合比率方案显示出很好的跳跃几种不同的环境。反映自相关似乎可以提高 FFT 的质量。

不过,一个小问题是,由于反射“信号”的“直流分量”为零,第零个 FFT 结果始终为零,这有点打破了包含零的几何平均值。但是跳过第零个元素似乎有效。

我得到的结果远远不足以单独识别打鼾/呼吸,但它似乎是一个相当敏感的“确认”——如果我没有得到“跳跃”,那么它可能不是打鼾/呼吸。

我没有仔细分析它,但我怀疑正在发生的事情是在呼吸/打鼾的某个地方出现了哨声,而哨声就是被检测到的。

2个回答

预赛

使用 MATLAB 包a​​udioread可以更轻松地进行此演示,该包支持读取/写入 MP3 文件。或者,您可以手动将示例中的 MP3 文件转换为 WAV。

简易案例

在我们检查您的有问题的文件之前,让我们前往 SoundCloud 并获得一个像样的鼾声,这样我们就知道当 SNR 很高时会发生什么。这是一个 52s 立体声 44.1KHz MP3。将其下载到 MATLAB 路径中的文件夹中。

现在让我们计算频谱图(我选择了 8192 个样本的 Hann 窗口)和频谱平坦度:

[snd1,fs1]=mp3read('snoring - brobar.mp3'); % use wavread if you converted manually
[s1,f,t,p1]=spectrogram(mean(snd1,2),hann(8192));
sf1=10*log10(geomean(p1)./mean(p1)); % spectral flatness
plot(linspace(0,length(snd1)/fs1,length(sf1)),sf1); axis tight

布罗巴鼾声的光谱平坦度

光谱平坦度的巨大下降(即与白噪声的偏差)尖叫着“我在打鼾”。我们可以通过查看与基线(中值)的偏差来轻松对其进行分类:

stem(linspace(0,length(snd1)/fs1,length(sf1)),median(sf1)-sf1>2*std(sf1)); axis tight

布氏鼾声的分类光谱平坦度

我们有两个以上的净空标准差。作为参考,标准变体本身是6.8487

硬壳

现在让我们看一下您的文件这是一个 10 分钟的 8KHz WAV 文件。由于电平如此之低,它有助于压缩信号。

[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));
sf=10*log10(geomean(p)./mean(p));
plot(linspace(0,600,length(sf)),sf);

噪声文件的光谱平坦度

看到伴随着每次鼾声的那些美妙的下降了吗?我也没有。漂亮的山峰怎么样?他们不是打鼾,而是对象移动的声音。标准差是微不足道的0.9388

结论

如果要依赖频谱平坦度,则需要获取更清晰的信号!我有压缩它只是为了听到任何东西。如果检测到低 SNR,请促使用户将手机放在更近的地方或使用麦克风,例如耳机随附的手机。

好消息是,即使在有问题的情况下可以检测到打鼾。但是,由于这个问题不仅仅是关于打鼾检测,我将在此停止,并您的另一个问题中解释如何做到这一点

自相关与信号功率谱密度的逆 DFT 直接相关。从这个意义上说,DFT 的幅度平方中包含的任何信息也包含在自相关函数中。

尽管如此,自相关可以告诉您的一件事是谐波的存在。(从中心峰到下一个最高峰的距离)。也许打鼾 VS 呼吸具有不同的基本谐波,如果是这样,“自相关方法”肯定是一个很好的起点,因此可以提取特征(在这种情况下是谐波)。

因此,白噪声的自相关将是一个增量函数,并且在其中心峰值之外不会有任何次要峰值(或任何其他峰值)。相反,如果信号确实有谐波,那么它的自相关函数将包含二次和三次峰值,与存在的基波谐波相称。从主(中心)峰到次峰的距离是基本频率的周期。

编辑:

我认为您所追求的是一个度量 - 一个数字 - 编码自相关函数与增量的相似程度,VS 自相关函数看起来有很多峰值。为此,光谱平坦度的测量可能适用,或者在更一般的情况下,测量几何平均值到算术平均值。