隔离循环模式与不断变化的背景声音

信息处理 fft 信号分析 自相关 源分离
2022-02-16 12:15:58

下面是一个合理的例子

假设我们有一个信号

s(t)=r(t)+e(t)

在哪里:

  • r(t)是在给定周期内重复出现的信号,即在我的示例中r(t)= 完全相同的军鼓样本,每 1 秒播放一次,从 00:00:00,500 开始

  • e(t)是一种不断发展的声音(在我的示例中,它是合成器垫软声音)

我假设信号是单声道的,并且没有应用压缩或其他主效果。


问:
如何恢复r(t)从混合s(t),通过分析哪个“模式”在s(t)? (周期1秒被认为是给定的)

一言以蔽之,如何从混音中分离出军鼓声?

我想通过每 1 秒切割一次信号来做到这一点:

slice1.wav
slice2.wav
slice3.wav
slice4.wav
slice5.wav
slice6.wav
slice7.wav

并分析所有切片中哪一部分信号是循环的(= 圈套),哪一部分不是(= 合成器)

是否有基于分析重复部分/非重复部分的分离算法?使用 FFT 或其他方法?

3个回答

因此,假设您建议的线性叠加,您要提取的声音存在于信号空间的周期性子空间中。这个子空间的独特之处在于声音实例之间的确切间距,我假设您在下面知道这一点。如果你不知道,你可以从计算你的合成信号的自相关序列中找到它。

如果没有进一步的知识,找到样本的唯一线性方法是将合成信号投影到它所在的周期性子空间。有两种明显的方法可以做到这一点。

第一种是对合成信号进行傅里叶级数,并将不属于与重复周期长度相对应的频率的整数倍的所有系数归零。对修改后的系列求和将为您提供所需的信号。

第二个是将样本准确地切割成与重复周期完全对齐的片段,然后将所有这些片段加起来成为一个样本。

这两个操作的结果将为您提供相同周期子空间的合成信号的表示。但是,由于子空间与总信号相比相对较大,因此组合信号的某些分量只是偶然包含在该子空间中。因此,分离将远非完美。您可以通过进行更多重复来改进分离,使整个信号空间比周期性子空间大得多。

如果您需要更好的方法,您将无法绕过表征您要提取的信号的性质。这就是感知模型、源模型、统计信号模型等的用武之地。我不能在这个答案中真正深入探讨这个问题。这是一个充满了许多书籍的主题,而且通常非常困难。

这可以作为一个通用的盲源分离问题来处理,其中包含用于小鼓和合成器的激励滤波器模型。对于军鼓,激励将是一个脉冲序列,滤波器将军鼓样本作为其脉冲响应。如果灵活的音频源分离工具箱 (FASST)找到足够好的模型来允许分离,您可以尝试。这些文章中描述了 FASST:

Y. Salaün、E. Vincent、N. Bertin、N. Souviraà-Labastie、X. Jaureguiberry、DT Tran 和 F. Bimbot,灵活的音频源分离工具箱 2.0 版,在 Show & Tell,IEEE 国际声学会议,语音和信号处理,2014。

A. Ozerov、E. Vincent 和 F. Bimbot,在音频源分离中处理先验信息的通用灵活框架,IEEE Transactions on Audio、Speech and Signal Processing 20(4),pp. 1118-1133 (2012) .

您应该尝试“谐波冲击源分离”......使用 librosa 的librosa.decompose.hpss(spectrogram)在您的 WAV 上快速测试:

中值滤波谐波冲击声源分离 (HPSS)。分解输入频谱图 S = H + P,其中 H 包含谐波分量,P 包含冲击分量。

以下是一些引文和论文:

菲茨杰拉德,德里。“使用中值滤波进行谐波/冲击分离。” (2010)。( PDF )

Jeongsoo Park, Kyogu Lee,“Harmonic-Percussive Source Separation Using Harmonicity and Sparsity Constraints”,国际音乐信息检索协会会议论文集 (ISMIR),第 148-154 页,西班牙马拉加,2015 ( PDF )


代码示例:

import librosa

y, sr = librosa.load('input.wav')
y_harmonic, y_percussive = librosa.effects.hpss(y)
librosa.output.write_wav('output_harmonic.wav', y_harmonic, sr)
librosa.output.write_wav('output_percussive.wav', y_percussive, sr)