重新采样一个 numpy 数组

新手上路,请多包涵

重新采样数组很容易

 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 数组进行重采样?

应用示例:音频信号重采样/重调

原文由 Basj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

由于 scipy.signal.resample 可能 非常慢,我搜索了其他适用于音频的算法。

Erik de Castro Lopo 的 SRC (又名 Secret Rabbit Code 又名 libsamplerate)似乎是可用的最佳重采样算法之一。

  • 它被 scikit 的 scikit.samplerate 使用,但是这个库安装起来似乎很复杂(我放弃了 Windows)。

  • 幸运的是,有一个易于使用且易于安装的 libsamplerate 的 Python 包装器,由 Tino Wagner 制作: https ://pypi.org/project/samplerate/。使用 pip install samplerate 安装。用法:

   import samplerate
  from scipy.io import wavfile
  sr, x = wavfile.read('input.wav')  # 48 khz file
  y = samplerate.resample(x, 44100 * 1.0 / 48000, 'sinc_best')

许多重采样解决方案的有趣阅读/比较:http: //signalsprocessed.blogspot.com/2016/08/audio-resampling-in-python.html


附录: 重采样频率扫描(20hz 到 20khz)的频谱图比较:

  1. 原创

  1. 用 libsamplerate / samplerate 模块重新采样

3)用 numpy.interp (“一维线性插值”)重新采样:

原文由 Basj 发布,翻译遵循 CC BY-SA 4.0 许可协议

NumPy 有 numpy.interp 进行线性插值:

 In [1]: numpy.interp(np.arange(0, len(a), 1.5), np.arange(0, len(a)), a)
Out[1]: array([  1. ,   2.5,   4. ,   5.5,   7. ,   8.5,  10. ])

SciPy 有 scipy.interpolate.interp1d 可以进行线性和最近插值(尽管哪个点最近可能并不明显):

 In [2]: from scipy.interpolate import interp1d
In [3]: xp = np.arange(0, len(a), 1.5)
In [4]: lin = interp1d(np.arange(len(a)), a)

In [5]: lin(xp)
Out[5]: array([  1. ,   2.5,   4. ,   5.5,   7. ,   8.5,  10. ])

In [6]: nearest = interp1d(np.arange(len(a)), a, kind='nearest')

In [7]: nearest(xp)
Out[7]: array([  1.,   2.,   4.,   5.,   7.,   8.,  10.])

原文由 xnx 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏