numpy выходной сигнал имеет гораздо большую мощность, чем исходный сигнал - PullRequest
0 голосов
/ 11 апреля 2020

У меня странная проблема с использованием класса numpy fft. У меня есть следующий бит тестового кода:

import numpy as np
import scipy.io.wavfile
import matplotlib.pyplot as plt  

fs, a = scipy.io.wavfile.read('test.wav')   # import audio file

spectrum = np.fft.fft(a)                    # create spectrum

b = np.real(np.fft.ifft(spectrum))          # reconstruct signal

# Print power of original and output signal
print(np.average(a**2))
print(np.average(b**2))

Он выводит:

1497.887578558565
4397203.934254291

Как и ожидалось для этих значений, выходной сигнал намного громче, чем входной. Документация для numpy .fft.ifft гласит:

"Эта функция вычисляет инверсию одномерного n-точечного дискретного преобразования Фурье, вычисленного с помощью fft. Другими словами, ifft (fft (a)) == a с точностью до цифры. "

Таким образом, сигнал должен быть почти одинаковым. И все же они, очевидно, нет. Что я тут не так делаю?

1 Ответ

0 голосов
/ 11 апреля 2020

Хорошо, в конце концов, мне удалось найти решение.

Проблема возникает из-за того, что вывод wavfile.read представляет собой целочисленный массив. По какой-то причине функция fft обрабатывает целые числа не так, как с плавающей точкой. Проблема решается путем типизации a к типу np.float64.

Почему это происходит, мне пока не совсем понятно.

...