Python scipy.signal.resample的行为异常

Python scipy.signal.resample的行为异常,python,numpy,scipy,Python,Numpy,Scipy,我目前正在进行一些信号处理(使用scipy),但我遇到了一个奇怪的问题,无法找出问题所在。也就是说,我正在从.wav文件中读取一些音频数据,但在进一步处理之前必须重新采样。该信号有超过500000个样本 现在,scipy.signal.resample仅在其中一个通道上需要10分钟以上。好的,我想,这可能是正常的,因为有很多样本。然而,随后我决定用另外两个“信号”(即随机生成的数字数组和零数组)对1000000个样本进行实验,并对这些样本进行重新采样。奇怪的是,在这种情况下,重采样只需要几毫秒,

我目前正在进行一些信号处理(使用scipy),但我遇到了一个奇怪的问题,无法找出问题所在。也就是说,我正在从.wav文件中读取一些音频数据,但在进一步处理之前必须重新采样。该信号有超过500000个样本

现在,scipy.signal.resample仅在其中一个通道上需要10分钟以上。好的,我想,这可能是正常的,因为有很多样本。然而,随后我决定用另外两个“信号”(即随机生成的数字数组和零数组)对1000000个样本进行实验,并对这些样本进行重新采样。奇怪的是,在这种情况下,重采样只需要几毫秒,因此大小显然不是问题

我的最后一个实验是从我的原始信号中提取零(大约有50000个样本是零值的)并重新采样。我非常惊讶地看到,仅对50000个零进行重新采样大约需要一分钟。以前,我对一个在几毫秒内有1000000个样本的零数组进行了重采样,现在我需要等待大约一分钟才能得到一个50000个样本的数组。一定是出了什么问题,但我不知道是什么

我真的看不出这种行为有什么原因;尤其是零(1000000毫秒和仅仅几毫秒,而50000毫秒和一分钟)让我大吃一惊

下面是一个示例代码,让您知道我在说什么:

import scipy.io.wavfile as wavfile
import numpy
import scipy.signal as signal

sample_rate, signal_data = wavfile.read('file.wav')

test_channel = numpy.array(signal_data[:,0], dtype=float)
channel_zeros = numpy.array(signal_data[numpy.where(signal_data[:,0]==0)[0],0], dtype=float)
test_signal = numpy.random.rand((1000000))
test_signal_2 = numpy.zeros((1000000))

number_of_samples = 500

#both of these are executed in less than a second
resampled_random = signal.resample(test_signal, number_of_samples)
resampled_zeros = signal.resample(test_signal_2, number_of_samples)

#this takes minutes
resamples_original_signal = signal.resample(test_channel, number_of_samples)

#this takes about a minute
resampled_original_zeros = signal.resample(channel_zeros, number_of_samples)

你知道这有什么问题吗?提前感谢。

当数据长度为2的幂次方(例如,2、4、8、16、32)时,FFT的numpy实现(基于)最快,而当数据长度为素数时最慢。为了加快信号处理速度,您可以将数据归零至长度为2的幂次方

在Python中,可以使用以下代码查找给定数字的下一个最大幂2:

y = np.floor(np.log2(n))
nextpow2 = np.power(2, y+1)
您可以使用此选项将数据数组填充到此大小:

sample_rate, signal_data = wavfile.read('file.wav')
n = signal_data.shape[0]

y = np.floor(np.log2(n))
nextpow2  = np.power(2, y+1)

signal_data  = np.pad(signal_data , ((0, nextpow2-n), (0,0)), mode='constant')

有关scipy/numpy和FFT的更多背景信息,请参阅。

从“file.wav”读取的数组的确切大小是多少?
resample
做的第一件事是计算数据的FFT,如果大小是素数,那么速度可能非常慢。scipy.signal.resample使用FFT,如果数据长度是素数,那么速度非常慢。您能显示数据的长度吗<代码>测试通道。形状。是的,大小是一个素数:595117是总长度,58897是零的数目。这就是问题的原因。非常感谢。fft对于长度为2次方的阵列最为有效,有时即使有更多的样本,也会增加0以达到下一次2次方的速度更快