Реализация ДПФ, обратная функция не работает должным образом - PullRequest
1 голос
/ 29 мая 2019

Я реализовал DFT и обратную функцию DFT по следующим формулам:

Функция DFT работает, но при тестировании обратного вывода я нене получить оригинальную серию.

import numpy as np
import random

exp = np.exp
pi = np.pi

def mydft(X):
    n = len(X)
    out = []
    for k in range(n):
        temp = 0
        for i in range(n):
            temp += X[i] * exp(-2j*pi*k*i/n)
        out.append(temp)
    return np.array(out)

def myidft(X):
    n = len(X)
    out = []
    for k in range(n):
        temp = 0
        for i in range(n):
            temp += X[i] * exp(2j*pi*k*i/n)
        out.append(temp)
    return (1/n) * np.array(out)

Тестирование

orig = np.random.random(100)
trans = mydft(orig)

inv = myidft(trans)
print(np.allclose(inv, trans))
>>> False

print(np.allclose(trans, np.fft.fft(orig)))
>>> True

Поскольку оригинальная функция работает и модификации для обратного довольно просты, я понятия не имею, что пошло не так!?

1 Ответ

2 голосов
/ 29 мая 2019

Если ваш тест будет:

print(np.allclose(inv, orig))

с

orig = myidft(mydft(orig))

потому что, когда я строю свой DFT

DFTandFFTcomparison

и invDFT (из DFT исходного сигнала)

iDFTandiFFTcomparison

по сравнению с алгоритмом numpy FFT результаты точно такие же. Ваша реализация кажется правильной. Ваш тест неверен.

...