检测录音中信号削波的好方法是什么?

信息处理 声音的 算法
2021-12-18 21:54:57

给定一段录音,我需要检测是否发生了任何剪辑。

如果任何(一个)样本达到最大样本值,我是否可以安全地得出结论,或者我应该在最大水平上寻找一系列后续样本?

记录可能来自 16 位或 24 位 A/D 转换器,并转换为浮点值,范围为1...1. 如果这种转换采用除法的形式2151要么2231,那么大概负峰值可能会略低于-1,并且值为-1的样本不会被剪裁?

显然,人们总是可以专门创建一个信号来击败削波检测算法,但我正在查看语音、音乐、正弦波或粉红/白噪声的录音。

4个回答

我正在输入一个与Yoda非常相似的答案他可能是最可靠的,但我会提出一个不同的解决方案,所以你有一些选择。


如果您获取信号的直方图,则根据信号类型,您很可能会出现类似钟形或三角形的形状。干净的信号往往会遵循这种模式。许多录音室添加了“响度”效果,导致顶部附近有一点凸起,但看起来仍然有些平滑。这是一个来自主要音乐家的真实歌曲的示例:

直方图

这是尤达在他的回答中给出的信号直方图:

没有剪裁的直方图

现在他们被剪裁的情况:

带裁剪的直方图

这种方法有时会被愚弄,但对于 FFT 方法似乎对您不起作用或对您的环境计算过多的情况,它至少可以放入您的工具包中。

如果您正在处理短录音,最简单的答案是听它并在回放中检测“pops”(短尖声)。然而,更稳健的解决方案是分析录音的频谱。

回想一下,当信号在某个阈值处被削波时,它在局部类似于削波区域中的方波。这会在频谱中引入原本不存在的高次谐波。如果您的信号是带限的(大多数现实世界的信号都是),并且您的采样率远高于奈奎斯特速率,那么这一点非常明显。

这是 MATLAB 中的一个简短示例来演示这一点。在这里,我创建了一个持续时间为 1s 的带限信号,以 1000Hz 采样,然后将其剪辑到两者之间±0.8(见下图中的顶部图)

time = 0:0.001:1;
cleanSignal = sin(2*pi*75*time).*chirp(time,50,1,200);
clippedSignal = min(abs(cleanSignal),0.8).*sign(cleanSignal);

在此处输入图像描述

您可以清楚地看到原始未削波波形的频谱是干净的并且在带宽之外变为零(左下角),而在削波信号中,频谱普遍存在轻微失真(如果削波则预期)并且大多数重要的是,信号带宽之外的频谱中的高次谐波/尖峰/非零贡献(右下)。

这通常可能是一种更好的方法,因为通过查看值来检测削波通常是不准确的,除非您自己设计了设备并且准确地知道阈值的值。

这一点取决于记录的方法。听起来您只使用了 1 个转换器,这在一定程度上简化了事情。

您应该寻找超过某个阈值的任何东西,特别是彼此相邻的多个点。通常,除非您对其进行非常精确的测试,否则 A/D 转换器实际上不会读取到它们的最大值,因此请注意最大值可能低于看起来可能的值。

给定您的参数,我会寻找高于 0.98 或低于 -.98 的连续信号,并进行一些调整以确定最佳阈值应该是多少(我不会将其降至 0.9 以下)。最好检测一个最大值,另一个接近 0.8。

忽略 1 个特定测量的原因是,通常会出现与信号完全无关的尖峰。如果您使用的是已知良好的 A/D 转换器,这将减少。如果您使用的是检测器阵列或图像,则某些检测器可能会出现问题,可能会频繁出现削波。

MLS(最大长度序列)对于剪裁分析特别棘手。它们的波峰因数 (=peak/rms) 非常接近 1,甚至比正弦波的波峰因数小 3 dB。许多 D/A 转换器设计为将正弦波作为最坏情况,并且以全幅值播放的 MLS 可以轻松削波 D/A 的输出插值电路。

下一个问题是削波 MLS 看起来几乎与未削波的 MLS 相同,因为首先幅度几乎都是 + 峰值。此外,PDF 分析不起作用,因为 MLS 的 PDF 只是边缘处的两个大峰。

在典型的房间脉冲响应测量中,最可能的削波点实际上是 D/A、放大器或扬声器。一旦它通过房间,它看起来就不像 MLS 了,因此使用上述方法更容易评估剪裁。

在几乎所有的声学测量中,本底噪声由麦克风的自身噪声或背景噪声决定,而不是 A/D。因此,优化 A/D 的输入增益并在削波(10dB 左右)完全没问题之前留出足够的余量并不是很重要。

使用许多不同的激发电平进行测量并查看测量的 SNR 通常是一个好主意。在低电平时,声学背景噪声占主导地位,而在高电平时,某些东西会限制、压缩或削波。进行良好测量的诀窍是在两者之间找到一个好点。