实施 DFT,反函数无法正常工作
Implementing DFT, inverse function not working properly
我已经根据以下公式实现了 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
既然原来的函数是有效的,逆函数的修改也很简单,我不知道哪里出了问题!?
你的测试不应该是
print(np.allclose(inv, orig))
因为
orig = myidft(mydft(orig))
因为当我绘制你的 DFT 时
和invDFT(原始信号的DFT)
与numpy FFT algorithm相比,结果完全一样。您的实施似乎是正确的。你的测试是错误的。
我已经根据以下公式实现了 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
既然原来的函数是有效的,逆函数的修改也很简单,我不知道哪里出了问题!?
你的测试不应该是
print(np.allclose(inv, orig))
因为
orig = myidft(mydft(orig))
因为当我绘制你的 DFT 时
和invDFT(原始信号的DFT)
与numpy FFT algorithm相比,结果完全一样。您的实施似乎是正确的。你的测试是错误的。