首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.signal.resample行为怪异

scipy.signal.resample行为怪异
EN

Stack Overflow用户
提问于 2013-11-17 23:10:49
回答 1查看 3.3K关注 0票数 9

我目前正在做一些信号处理(使用scipy),但是我遇到了一个奇怪的问题,并且找不出出了什么问题。也就是说,我正在从一个.wav文件中读取一些音频数据,但是在进一步处理之前必须重新采样。信号有500,000多个样本。

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

我的最后一个实验是从我的原始信号中提取零(大约有5万个零值的样本)并重新对它们进行采样。我很惊讶地看到,重采样5万个零只需要大约一分钟。以前,我重放了一个零位数组,在几毫秒内就有100万个样本,现在我必须等待大约一分钟,才能得到5万个样本。一定是出了问题,但我想不出是什么。

我真的没有看到这种行为的任何理由,尤其是0 (1,000,000和几毫秒vs 50,000和1分钟)给我很大的惊喜。

下面是一个示例代码,这样您就知道我在说什么了:

代码语言:javascript
复制
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)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-07 12:57:05

当数据的长度是2的幂(例如2、4、8、16、32)时,it (基于FFTPACK)的numpy实现是最快的,当它是素数时最慢。为了加快信号的处理速度,您可以将数据零点到2倍长的功率。

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

代码语言:javascript
复制
y = np.floor(np.log2(n))
nextpow2 = np.power(2, y+1)

您可以将此与numpy.pad一起用于将数据数组放置到此大小:

代码语言:javascript
复制
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')

想了解更多关于见这个问题中的枕木/矮胖和快速傅立叶变换的背景知识。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20037444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档