问题描述
重采样数组很容易,比如
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] =>不是需要的...
应该是(使用线性插值):
[1 2.5 4 5.5 7 8.5 10]
或(通过取数组中最近的邻居)
[1 3 4 6 7 9 10]
如何使用非整数重采样因子对 numpy 数组进行重采样?
应用示例:音频信号重采样/重音
As scipy.signal.resample
可以是 (一维线性插值"):
It's easy to resample an array like
a = numpy.array([1,2,3,4,5,6,7,8,9,10])
with an integer resampling factor. For instance, with a factor 2 :
b = a[::2] # [1 3 5 7 9]
But with a non-integer resampling factor, it doesn't work so easily :
c = a[::1.5] # [1 2 3 4 5 6 7 8 9 10] => not what is needed...
It should be (with linear interpolation):
[1 2.5 4 5.5 7 8.5 10]
or (by taking the nearest neighbour in the array)
[1 3 4 6 7 9 10]
How to resample a numpy array with a non-integer resampling factor?
Example of application: audio signal resampling / repitching
As scipy.signal.resample
can be very slow, I searched for other algorithms adapted for audio.
It seems that Erik de Castro Lopo's SRC (a.k.a. Secret Rabbit Code a.k.a. libsamplerate) is one of the best resampling algorithms available.
It is used by scikit's
scikit.samplerate
, but this library seems to be complicated to install (I gave up on Windows).Fortunately, there is an easy-to-use and easy-to-install Python wrapper for
libsamplerate
, made by Tino Wagner: https://pypi.org/project/samplerate/. Installation withpip install samplerate
. Usage: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')
Interesting reading / comparison of many resampling solutions:http://signalsprocessed.blogspot.com/2016/08/audio-resampling-in-python.html
Addendum: comparison of spectrograms of a resampled frequency sweep (20hz to 20khz):
1) Original
2) Resampled with libsamplerate / samplerate
module
3) Resampled with numpy.interp
("One-dimensional linear interpolation"):
这篇关于重新采样一个 numpy 数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!