这是一个混合的音频信号(此处提供 WAV 文件):
2000 Hz 正弦曲线,从 1.00 秒开始,无淡入/淡出
一个 2005 Hz 正弦曲线,从 1.031 秒开始,结束时缓慢淡出
背景噪音
(实际上它更复杂:正弦曲线的幅度也可以变化......)
如何将信号分离成两个信号(两个正弦波),而且还具有良好的时间分辨率?
尝试 1
我将信号零填充到 2 的下一个幂(最终长度:524288),进行了实 FFT。
real-FFT 向量的大小h为 262145 个频率 bin,以覆盖频率范围 [0, 22050hz],因此每个 bin 的宽度为 0.084 Hz。好消息,我们可以用这个区分两个正弦曲线!
现在我们可以隔离两个正弦曲线:
h1 = h.copy() # the real-FFT
h1[:23750] = 0 # zeroing bins outside [23750, 23800]
h1[23800:] = 0
x1 = irfft(h1) # inverse real-FFT
h2 = h.copy()
h2[:23810] = 0 # zeroing bins outside [23810, 23860]
h2[23860:] = 0
x2 = irfft(h1) # inverse real-FFT
它可以工作,但时域分辨率非常差(这是正常的,因为频率分辨率非常高!):正弦在时域中的定位非常差。我们没有在分离的正弦曲线中快速攻击,而是缓慢淡入......
当然,在感兴趣的频率范围之外(bins [23750:23800])归零并不是最优的,我应该在频域中使用(非矩形)窗口:
h1[:23750] = 0
h1[:23800] = 0
h1[23750:23800] *= window
但即使有这样的窗口,我怀疑我能否避免分离后的慢时域分辨率。
尝试 2
使用 STFT 而不是信号的全局 FFT。这有助于定位,但是......为了有一个好的频率分辨率能够分离两个正弦波,我们必须取一个很大的 FFTSIZE,比如 16384。然后每个 8193 个频率箱(real-FFT)将有 2.7 Hz 的宽度!不足以区分或分离只有 5 Hz 差异的两个正弦曲线......所以这种方法会失败。
我知道这可能是时频权衡/不确定性原理的一个例子,但在这种精确的情况下,我们还能做些什么来改善分离吗?
备注:我已经读过分离非常接近波长的波,但它对这种情况没有帮助。

