我有一个声音文件,其计算的频谱图从 0 到 8000 Hz(跨越约 5 个八度音阶)。频谱图有 128 个对数间隔的频率区间。如何减少 bin 的数量,以便在倍频程中保持相等的带宽?我可以平均相邻的 bin 吗?
例如,假设我有 128 个带通滤波器,它们沿对数频率轴等距分布,中心频率为 180-7040 Hz,跨越 5.3 个八度音阶。如何将其减少到 42 个具有相同八度音阶带宽的 bin?欢迎使用 Matlab 或 python 示例。
我有一个声音文件,其计算的频谱图从 0 到 8000 Hz(跨越约 5 个八度音阶)。频谱图有 128 个对数间隔的频率区间。如何减少 bin 的数量,以便在倍频程中保持相等的带宽?我可以平均相邻的 bin 吗?
例如,假设我有 128 个带通滤波器,它们沿对数频率轴等距分布,中心频率为 180-7040 Hz,跨越 5.3 个八度音阶。如何将其减少到 42 个具有相同八度音阶带宽的 bin?欢迎使用 Matlab 或 python 示例。
我建议您根据以下代码在线性域中对频谱进行插值:
from scipy import interpolate
f_lin = np.arange(180, 7040) # the range of test frequencies
# a function that we use to test the interpolation
H_lin_func = lambda f: np.sin(2*np.pi*0.001*f) * np.cos(2*np.pi*0.00011*f)
# Frequencies of the measured samples
input_samples = np.logspace(np.log10(180), np.log10(7040), 128)
# Frequencies where we want to interpolate to
output_samples = np.logspace(np.log10(180), np.log10(7040), 42)
# "measure" the function at the 128 known points
H_at_input_samples = H_lin_func(input_samples)
# Interpolate to the 42 points
interpolationFunc = interpolate.interp1d(input_samples, H_at_input_samples)
H_at_output_samples = interpolationFunc(output_samples)
# plot the results
plt.figure(figsize=(10,6))
plt.plot(f_lin, H_lin_func(f_lin), label='Original function')
plt.plot(input_samples, H_at_input_samples, 'rx', label='Input samples')
plt.plot(output_samples, H_at_output_samples, 'go', label='Output samples')
plt.grid(True)
plt.legend()
在代码中,我提出了一个(任意)函数 H_lin_func,它代表了我们采样的原始频谱。然后,我们用测量的样本创建一个插值函数(例如使用 scipy.interpolate)。然后,最后我们用我们想知道插值的样本调用插值函数。
如您所见,由于对数间距,较低频率的样本更多。然而,对于更高频率的更宽间距,插值也可以正常工作。
编辑作为来自 hotpaw2 的评论:这种对更少样本的插值本质上是一种下采样操作,容易受到混叠的影响。在“正常”系统中,如果下采样后的采样频率仍然是原始信号带宽的 2 倍,则混叠不是问题。但是,您有一个特殊情况,即您的样本不是等间距的,而是对数间距的。因此,我会说您的频谱需要在对数域中进行频带限制以防止混叠。如果不是这种情况,您需要在日志域中应用抗锯齿过滤器,然后进行插值/下采样。更多关于别名的信息可以在这个问题和这篇文章中找到。
一种可能性是使用类似于 MFCC Mel 三角滤波器组的东西与您的 FFT 输入向量,但对三角滤波器中心使用对数间距而不是 Mel 间距。请参阅:http ://cmusphinx.sourceforge.net/doc/sphinx4/edu/cmu/sphinx/frontend/frequencywarp/MelFrequencyFilterBank.html和https://www.mathworks.com/matlabcentral/answers/195651-creating-mel- triangular-filters-function,并根据需要修改三角频率。