Замораживание БПФ scipy.fftpack - PullRequest
0 голосов
/ 15 мая 2018

При вычислении БПФ массива размером ~ 1,5 миллиона элементов:

import numpy as np
from scipy.fftpack import fft

x0 = np.ones(1492828, dtype=np.int32)
fft(x0)
print 'hello'

вычисление БПФ никогда не заканчивается, и программа зависает.Если я поменяю 1492828 на 1492827, это похоже на работу.Но если я изменю 1492828 на 1492826, он все равно зависнет, что немного странно.

Это известная ошибка?

Примечание:

  • Процессор остается на 25% (нормально, у меня 4-ядерный процессор), а использование ОЗУ процесса Python остается на уровне ~ 75 МБ

  • Яиспользование 64-разрядной версии Python 2.7.15 в 64-разрядной версии Windows 7:

    print scipy.__version__     # 1.1.0
    print sys.version           # 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]
    

1 Ответ

0 голосов
/ 15 мая 2018

Обычные алгоритмы БПФ намного быстрее для длины, имеющей небольшие простые множители, как объяснено здесь .

Решение состоит в том, чтобы заполнить массив нулями до следующей степени 2:

def zeropad_nextpoweroftwo(A):
    return np.concatenate([A, np.zeros(int(2 ** np.ceil(np.log2(len(A))))-len(A), 
        dtype=A.dtype)])

Или, еще более простым / приятным решением является использование next_fast_len и тот факт, что 2-й аргумент fftpack.fft позволяет делать ноль-заполнение автоматически:

fftpack.fft(a, next_fast_len(len(a)))
...