Python Numpy fft冻结更长的样本

Python Numpy fft冻结更长的样本,python,audio,numpy,signal-processing,fft,Python,Audio,Numpy,Signal Processing,Fft,我目前正在使用numpy.fft库。我有200个带单音符的.wav文件,每个大约4秒长。我逐个运行numpy.fft,但对于4.5秒或更长时间的样本,numpy.fft会冻结。我不明白为什么会这样?此外,如果我明确指定fft的长度,该函数可以正常工作,但它检测到错误的频率(它检测到频率偏移了一个或两个半音) 这是我的密码: (framerate, sample) = wav.read(wav_file) monoChannel = sample.mean(axis=1) fft_length =

我目前正在使用numpy.fft库。我有200个带单音符的.wav文件,每个大约4秒长。我逐个运行numpy.fft,但对于4.5秒或更长时间的样本,numpy.fft会冻结。我不明白为什么会这样?此外,如果我明确指定fft的长度,该函数可以正常工作,但它检测到错误的频率(它检测到频率偏移了一个或两个半音)

这是我的密码:

(framerate, sample) = wav.read(wav_file)
monoChannel = sample.mean(axis=1)
fft_length = int(duration * framerate)     # duration is usually around 4sec long
FFT = numpy.fft(monoChannel, n=fft_length)
对于fft_长度小于216090 numpy的样本,fft工作正常,对于任何更长的fft,算法挂起,但在终端中按ctrl+C后继续

我正在使用python 2.7.3


我是FFT新手,我很想了解这里发生了什么。

np中使用的FFT算法。当输入长度有许多小素数因子时,FFT
的性能非常好(表示O(n logn)),而当输入大小为素数时,则非常差(表示需要O(n^2)的朴素DFT)。请参见2次幂和次最小素数的一些计时示例:

In [69]: a = np.random.rand(1024)
In [70]: b = np.random.rand(1031)

In [71]: %timeit np.fft.fft(a)
10000 loops, best of 3: 20.8 µs per loop

In [72]: %timeit np.fft.fft(b)
100 loops, best of 3: 2.09 ms per loop

In [73]: a = np.random.rand(65536)
In [74]: b = np.random.rand(65537)

In [75]: %timeit np.fft.fft(a)
100 loops, best of 3: 3.16 ms per loop

In [76]: %timeit np.fft.fft(b)
1 loops, best of 3: 11.8 s per loop
对于您的特殊情况,请注意:

216090 = 2 * 3**2 * 5 * 7**4
216091 = 216091 (prime)
216092 = 2**2 * 89 * 607
因此:

In [77]: %timeit np.fft.fft(np.random.rand(216090))
10 loops, best of 3: 37.1 ms per loop

In [78]: %timeit np.fft.fft(np.random.rand(216092))
10 loops, best of 3: 149 ms per loop

In [79]: %timeit np.fft.fft(np.random.rand(216091))
# Got bored and killed it before it finished, should take ~2 min
# based on the other results for prime numbers