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


9

这是我打app应用程序的一个小路

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

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

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

(我不太了解要问什么其他问题。)

一些早期的结果: 在某些情况下,自相关(均方根或峰值)显示出打ore声的急剧跳跃-正是我希望看到的响应。在其他情况下,在这些测量中根本没有明显的运动(这可能是具有两个响应的两个连续打sn),而在高噪声情况下,测量实际上在打ore时会稍微下降。

更新-5月22日: 我终于有时间再做一些工作。(我从另一个应用程序退出,这确实很痛苦。)我将自相关的输出输入到FFT中,输出有些有趣-当打sn开始时,它在原点附近显示了一个相当大的峰值。

因此,现在我面临以某种方式量化此峰值的问题。奇怪的是,就绝对幅度而言,最高峰有时在其他时间出现,但我尝试了峰均值与算术平均值的比率,并且跟踪得很好。因此,有什么好的方法可以测量FFT的“峰值”。(并且不要说我需要对其进行FFT-这东西已经快要吞噬自己的尾巴了。:))

同样,我想到,如果我镜射输入自相关结果,中间为零(定义为1.0幅度),则FFT的质量可能会有所提高。这将把“尾巴”放在两端。这(可能)是个好主意吗?镜像应该竖直放置还是倒置?(当然,无论您说什么,我都会尝试,但是我想也许我会得到一些关于细节的提示。)

尝试过平坦度-

我的测试用例可以大致分为“行为良好”类别和“问题儿童”类别。

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

但是,对于“问题孩子”,数字正好相反。峰/平均比略有下降,而平坦度实际上增加了50-100%

这两类之间的差异(主要是三方面):

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

有任何想法吗?

更新-2012年5月25日: 进行胜利跳舞还为时过早,但是当我反映出某个点的自相关性,对该点进行FFT并进行频谱平坦度时,我的组合比率方案显示出几个不同的环境。反映自相关似乎可以改善FFT的质量。

但是,有一点要注意的是,由于反射的“信号”的“ DC分量”为零,因此第零个FFT结果始终为零,这有点破坏了包含零的几何平均值。但是跳过第零个元素似乎可行。

我得到的结果不足以单独识别打sn /呼吸,但这似乎是一个相当敏感的“确认”-如果我没有“跳”,则可能不是打sn /呼吸。

我没有仔细分析它,但是我怀疑正在发生的是在呼吸/打no期间某处发出了啸叫声,并且正在检测到啸叫声。


至于相关性的“强度”度量,您需要做的是在进行相关性之前将两个相关的信号归一化。(归一化后,每个信号的总和应为1)。这样,相关峰将始终存在于-1和1之间。这就是您的优势。对于其余的问题,我不确定,也许您可​​以进行一些编辑。
太空

我正在处理自相关,因此这两个信号是相同的,并且根据定义,它们是相对于彼此“标准化”的。“强度”是指有多少自相关。
Daniel R Hicks

我不明白您想要什么,但我想您想测量自相关峰的最大值,而不是整个事情的RMS值。
Endlith 2012年

@endolith我他可能会问您的自相关函数的“峰值”度量,它是为了将一个delta信号(噪声的自相关)与许多峰值信号区分开来?(信号与谐波的自相关)。也许在这里也可以使用频谱平坦度测量...
Spacey 2012年

听起来他想要的是光谱平坦度。丹尼尔:您想确定信号与白噪声有何不同?
Emre 2012年

Answers:


3

初赛

使用MATLAB包audioread,可以轻松读取/写入MP3文件,从而使演示更加容易。或者,您可以将示例中的MP3文件手动转换为WAV。

简单的情况

在检查您有问题的文件之前,让我们转到SoundCloud并抓住一个不错的打ore声,以便我们了解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

布罗尔打sn的光谱平坦度

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

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

Brobar打sn的分类频谱平坦度

我们有两个以上的净空标准差。供参考的标准变量本身是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);

噪声文件的频谱平坦度

看到每次打sn时伴随着的美妙倾角吗?我也不。漂亮的山峰怎么样?他们不是打呼,,而是被摄对象移动的声音。标准偏差仅为0.9388

结论

如果要依靠频谱平坦度,则需要获取更清晰的信号!我已经压扩它只是为了听到任何声音。如果检测到低SNR,则促使用户将电话放在更近的位置,或者使用麦克风(如耳机随附的电话)。

好消息是,它可以检测即使在有问题的情况下,打呼噜。但是,由于这个问题不仅与打sn检测有关,所以我将在这里停止,并在另一个问题中说明如何执行此操作


现在,您已经了解了我要面对的挑战。在我必须处理的样本中,该样本的质量为“中等”,但情况要差得多。我可以使用现有算法很好地阅读该示例。
Daniel R Hicks

这些是什么算法?
Emre

简而言之:声音每秒经过FFT 8次,将频谱切成5个频段,计算每个频段的功率和频谱差异,然后对结果进行计分,使出现的频段更具权重以正确的速度变化。
Daniel R Hicks

@Emre我正在跟踪您的链接,建立了一个soundcloud帐户,但看不到您下载此打sn的精确程度。旁边或其他任何地方都没有下载按钮。
Spacey 2012年

@Mohammad:我提供了一个下载链接。
Emre

1

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

也就是说,自相关可以告诉您的一件事是谐波的存在。(从中心峰到下一个最高峰的距离)。打VS VS呼吸可能具有不同的基本谐波,如果这样,“自相关方法”无疑将是一个很好的起点,以便可以提取特征(在这种情况下为谐波)。

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

编辑:

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


我的印象是,自相关可以更好地将(有节奏的)信号与(随机)噪声区分开来-噪声将在接近零的情况下自相关。DFT OTOH将噪声表示为噪声-扩频。至少这是我所理解的“理论”。
Daniel R Hicks

请查看我的修改。
Spacey 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.