gpt4 book ai didi

python - scipy.signal.resample 行为异常

转载 作者:太空狗 更新时间:2023-10-29 20:29:24 26 4
gpt4 key购买 nike

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

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

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

我真的没有看到这种行为的任何原因;尤其是零(1,000,000 和几毫秒与 50,000 和一分钟)让我很惊讶。

这是一个示例代码,以便您了解我在说什么:

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)

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

最佳答案

FFT 的 numpy 实现(基于 FFTPACK )在数据长度为 2 的幂(例如 2、4、8、16、32)时最快,而在其为质数时最慢。为了加快信号处理速度,您可以将数据零填充到 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')

有关 scipy/numpy 和 FFT 的更多背景信息,请参阅 see this question .

关于python - scipy.signal.resample 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com