MemoryError при делении массивов NumPy - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь рассчитать импульсную характеристику сигнала.Вот код:

def impulse_response(self):
    # Inverse filter:
    T = self.recorded_data.shape[0] / self.samplerate
    t = np.arange(0, T*self.samplerate - 1) / self.samplerate
    R = np.log(20/20000)
    k = np.exp(t*R/T).astype(np.float32)
    f = self.recorded_data[::-1] / k  # Gives an MemoryError
    # Impulse response:
    return sig.fftconvolve(self.recorded_data, f, mode="same")

Деление при расчете фильтра f дает MemoryError.self.recorded_data - это синусоидальная развертка 15 с, частота дискретизации 44100 Гц и 2822400 байт.k имеет размер 2822396 байт (оба массива имеют 32-разрядные числа с плавающей запятой).Я не думал, что эти массивы будут проблемой для разделения, поскольку они не такие большие.Есть ли проблема с тем, как деление?Может быть, есть более эффективный способ сделать это?Или я должен использовать другой тип данных?

Размеры массивов, которые я нашел с помощью https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ndarray.nbytes.html

Я получаю ту же ошибку при делении массивов NumPY в моей функции transfer_function(), поэтому я предполагаю, что этота же проблема.

Я получил код от https://dsp.stackexchange.com/questions/41696/calculating-the-inverse-filter-for-the-exponential-sine-sweep-method

Кстати, мой компьютер имеет 8 ГБ ОЗУ.

Спасибо за любые ответы!

1 Ответ

0 голосов
/ 16 декабря 2018

Теперь я заработал, удалив -1 из t = np.arange(0, T*self.samplerate - 1) / self.samplerate.Глядя на код, который я скопировал, я не знаю, как он туда попал!k не должен быть на 1 образец короче, чем self.recorded_data, поэтому я получил эту ошибку: ValueError: operands could not be broadcast together with shapes (661500,) (661499,).Я должен быть более осторожным, чтобы перепроверить размеры данных, с которыми я работаю ...

...