像这样重新采样数组很容易
a = numpy.array([1,2,3,4,5,6,7,8,9,10])
具有整数重采样因子。例如,系数为2时:
b = a[::2] # [1 3 5 7 9]
但对于非整数重采样因子,它并不那么容易工作:
c = a[::1.5] # [1 2 3 4 5 6 7 8 9 10] => not what is needed...
它应该是(线性插值):
[1 2.5 4 5.5 7 8.5 10]
或者(在数组中取最近的邻居)
[1 3 4 6 7 9 10]
如何对具有非整数重采样因子的numpy数组重采样?
应用示例:音频信号重采样/重采样
NumPy有^{} 进行线性插值:
SciPy有^{} 可以进行线性和最近的插值(尽管哪个点最近可能不明显):
由于
scipy.signal.resample
可以是very slow,我搜索了其他适合音频的算法。看起来,Erik de Castro Lopo的SRC(又称秘密兔子代码,又称libsamplerate)是可用的最佳重采样算法之一。
scikit的
scikit.samplerate
使用它,但是这个库的安装似乎很复杂(我在Windows上放弃了)。幸运的是,有一个易于使用且易于安装的Python包装器,
libsamplerate
,由Tino Wagner:https://pypi.org/project/samplerate/制作。使用pip install samplerate
安装。用法:许多重采样解决方案的有趣阅读/比较: http://signalsprocessed.blogspot.com/2016/08/audio-resampling-in-python.html
附录:重新采样扫频(20hz至20khz)的光谱图比较:
1)原件
2)使用libsamplerate/
samplerate
模块重新采样3)使用^{} (“一维线性插值”)重新采样:
既然您提到这是来自audio.WAV文件的数据,那么您可以查看
scipy.signal.resample
。你的线性数组
a
不是一个好的测试对象,因为它在外观上不是周期性的。但考虑一下sin
数据:把这些和
相关问题 更多 >
编程相关推荐