与半汉宁卷积

信息处理 fft 声音的 频谱图
2022-02-17 14:31:43

目标是获得 200 毫秒的音频信号衰减延迟,同时保留攻击的锐度以模仿人类对声音的感知。我正在关注的论文将一个 200 毫秒的半汉宁窗与每个频带进行卷积来模拟它。

我正在使用 numpy.hanning() 因为没有半汉宁,并且尝试将汉宁窗口的前半部分设置为 0,将前半部分设置为 1,或者将其切掉并仅使用后半部分。我也在规范化窗口以保持比例相同。

既然我真的不知道,其中哪一个是“正确的”半汉宁?

对我来说似乎最有可能的截断版本有效,但向左偏移了 100 毫秒。我是否应该将其向右移动 100 毫秒并称之为好?

dataMasked = np.zeros(data.shape)
for i in xrange(freqs.size): # Loop through each frequency band
    winSize = round(0.4/(length/bins.size)) #Calc win size
    hann = np.hanning(winSize)
    halfPoint = np.argmax(hann)
    hann = hann[halfPoint:] #Chop at half
    hann = normHann(hann)
    dataMasked[i,:] = np.convolve(data[i,:],hann,mode='same')

这是我得到的图(蓝色是原始响度曲线,而绿色是调整过的)。

响度图

我正在关注的论文显示了这一点:

纸张响度图

谢谢!

1个回答

仅使用后半部分(切碎)是正确的方法。请注意,将前半部分设置为零实际上是相同的事情,直到一个恒定的延迟。您观察到的 100 毫秒延迟可能是由于对 numpy 卷积使用了“相同”标志。在我看来,这个应用程序的正确截断是使用numpy.convolve(signal, window, 'full')[:len(signal)]- 没有那种“相同”的居中。

正如您所注意到的,平滑包络函数中的峰值与原始包络中的峰值并不完全重合,并且没有魔术技巧可以使它们重合(延迟将取决于攻击的锐度) - 所以产生的曲线不适合非常准确的节拍检测和斩波。