我目前正在做一些信号处理(使用scipy),但是我遇到了一个奇怪的问题,并且找不出出了什么问题。也就是说,我正在从一个.wav文件中读取一些音频数据,但是在进一步处理之前必须重新采样。信号有500,000多个样本。
现在,scipy.signal.resample仅在其中一个频道上就需要超过10分钟。好吧,我想,这可能是正常的,因为有很多样本。但是,我决定用另外两个“信号”(即随机生成的数字数组和一个零数组)对1,000,000个样本进行实验,并对这些样本进行重采样。奇怪的是,在这种情况下重采样只需几毫秒,因此大小显然不是问题。
我的最后一个实验是从我的原始信号中提取零(大约有5万个零值的样本)并重新对它们进行采样。我很惊讶地看到,重采样5万个零只需要大约一分钟。以前,我重放了一个零位数组,在几毫秒内就有100万个样本,现在我必须等待大约一分钟,才能得到5万个样本。一定是出了问题,但我想不出是什么。
我真的没有看到这种行为的任何理由,尤其是0 (1,000,000和几毫秒vs 50,000和1分钟)给我很大的惊喜。
下面是一个示例代码,这样您就知道我在说什么了:
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)你知道这可能有什么问题吗?提前谢谢。
发布于 2016-01-07 12:57:05
当数据的长度是2的幂(例如2、4、8、16、32)时,it (基于FFTPACK)的numpy实现是最快的,当它是素数时最慢。为了加快信号的处理速度,您可以将数据零点到2倍长的功率。
在Python中,您可以使用以下代码查找给定数字的下一个最大功率2:
y = np.floor(np.log2(n))
nextpow2 = np.power(2, y+1)您可以将此与numpy.pad一起用于将数据数组放置到此大小:
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')想了解更多关于见这个问题中的枕木/矮胖和快速傅立叶变换的背景知识。
https://stackoverflow.com/questions/20037444
复制相似问题