我想重现这篇论文的结果,其中作者使用群延迟图作为机器学习模型的输入。机器学习方面不是我遇到的问题。我在计算音频文件的群延迟函数时遇到问题。
首先,我知道群延迟本身是滤波器的一个属性。然而,该论文的作者写了这样的东西
群时延 [10] 定义为 STFT 相位谱的负导数: 由于等式 (2) 的实现需要解缠相位谱,群延迟函数也可以仅使用幅度值来计算: 其中和分别表示实部和虚部。和分别表示和的 STFT 。
我相信,这应该会在论文中生成如图 3 所示的图像,看起来像这样(在沿时间轴截断或填充到 256 的长度之后)
和都是非对称的,因此无法进行矩阵乘法。这是原始论文,在本文和 [10] 中都被引用,作者在其中推导方程 (3)。
据我了解,矩阵乘法是标准乘法,而不是元素乘法(元素乘法不会产生论文中的结果)。在下面的实现中,我使用长度为 800 个样本的窗口,因为本文的作者使用 50 ms 窗口,这对应于 16 kHz 采样率音频文件的 800 个样本。我试图在python中实现它,如下所示:
from scipy.io import wavfile
from scipy.signal import stft, get_window
import numpy as np
import matplotlib.pyplot as plt
rate, data = wavfile.read("test.wav")
n_data = np.multiply(data, np.arange(len(data)))
f, t, X = stft(data, rate, window="hamming", nperseg=800, return_onesided=False)
f_n, t_n, Y = stft(n_data, rate, window="hamming", nperseg=800, return_onesided=False)
group_delay = (np.dot(X.real, Y.real) + np.dot(Y.imag, X.imag)) / np.power(np.abs(X), 2)
但代码失败了
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-8-0058b9785caf> in <module>
----> 1 group_delay = (np.dot(X.real, Y.real) + np.dot(Y.imag, X.imag)) / np.power(np.abs(X), 2)
ValueError: shapes (800,109) and (800,109) not aligned: 109 (dim 1) != 800 (dim 0)
这是相当明显的。我也尝试在 Matlab 中实现它,希望这可能是 python 错误,但它也失败了。
[x,fs] = audioread('test.wav');
n_x = x .* [1:size(x,1)];
X = spectrogram(x, 800, 400, 2048, fs);
Y = spectrogram(n_x, 800, 400, 2048, fs);
T = (real(X) * real(Y) + imag(Y) * imag(X)) / abs(X)^2;
如何使用上述方程计算群延迟函数