离散傅立叶变换给出 "right" 的复共轭答案
Discrete fourier transform giving complex conjugate of "right" answer
我正在尝试在 python 中实现一个简单版本的离散傅里叶变换。
我的代码如下:
#!/usr/bin/env python
import cmath
def dft_simple(sequence):
# dft of seq defined as
# sigma from n=0 to N-1 of x(n) *exp(-2*pi*j*k*n/N)
seqLenth = len(sequence)
complexSequence = []
for k in range(seqLenth):
sigma = 0 - 0j
print("k = {}".format(k))
for n in range(seqLenth):
print("n = {}".format(n))
print("value = {}".format(sequence[n] * cmath.exp(-2*1j * cmath.pi * float(k) \
* float(n) / float(seqLenth))))
sigma = sigma + (sequence[n] * cmath.exp(-2*1j * cmath.pi * float(k) \
* float(n) / float(seqLenth)))
print("exp = {0}".format(-2*1j * cmath.pi * float(k) \
* float(n) / float(seqLenth)))
complexSequence.append(sigma)
print("sum = {}".format(sigma))
print("")
return(complexSequence)
seq4 = [1,1,1,1,0,0,0,0]
print(dft_simple(seq4))
我收到的结果是:
[(4+0j), (1-2.414213562373095j), (-1.8369701987210297e-16-2.220446049250313e-16j), (1-0.4142135623730949j), -2.449293598294706e-16j, (0.9999999999999992+0.4142135623730959j), (3.2904645469127765e-16-3.3306690738754696e-16j), (0.9999999999999997+2.4142135623730954j)]
这与我在 wolfram alpha 上以两种方式计算相同序列 here, 的 DFT 时得到的答案不同。首先,wolfram alpha 除以 sqrt(N),其中 N 是序列的长度,这只是正向和反向变换的不同对称定义。
其次,更令人困惑的是,我的实现给了我 wolfram alpha 给我的结果的复共轭——数值在其他方面大致相同。这是我的代码的实现问题(例如语法错误),还是只是 wolfram 使用不同的离散傅立叶变换定义?
在这两种情况下(对于缩放和复数共轭结果),根本原因是用于离散傅立叶变换 (DFT) 的定义不同。
default definition of the DFT from Wolfram使用公式:
或者等效地使用基于零的索引、时间索引 n
、频率索引 k
和 j=sqrt(-1)
来与您的实现进行比较:
您的实现使用 Wolfram 所称的 "signal processing" 约定:
这又等同于:
对于实值输入序列,在复指数项中使用负号会产生一个结果,该结果是在复指数项中使用正号的相似表达式的复共轭(反之亦然):
我正在尝试在 python 中实现一个简单版本的离散傅里叶变换。 我的代码如下:
#!/usr/bin/env python
import cmath
def dft_simple(sequence):
# dft of seq defined as
# sigma from n=0 to N-1 of x(n) *exp(-2*pi*j*k*n/N)
seqLenth = len(sequence)
complexSequence = []
for k in range(seqLenth):
sigma = 0 - 0j
print("k = {}".format(k))
for n in range(seqLenth):
print("n = {}".format(n))
print("value = {}".format(sequence[n] * cmath.exp(-2*1j * cmath.pi * float(k) \
* float(n) / float(seqLenth))))
sigma = sigma + (sequence[n] * cmath.exp(-2*1j * cmath.pi * float(k) \
* float(n) / float(seqLenth)))
print("exp = {0}".format(-2*1j * cmath.pi * float(k) \
* float(n) / float(seqLenth)))
complexSequence.append(sigma)
print("sum = {}".format(sigma))
print("")
return(complexSequence)
seq4 = [1,1,1,1,0,0,0,0]
print(dft_simple(seq4))
我收到的结果是:
[(4+0j), (1-2.414213562373095j), (-1.8369701987210297e-16-2.220446049250313e-16j), (1-0.4142135623730949j), -2.449293598294706e-16j, (0.9999999999999992+0.4142135623730959j), (3.2904645469127765e-16-3.3306690738754696e-16j), (0.9999999999999997+2.4142135623730954j)]
这与我在 wolfram alpha 上以两种方式计算相同序列 here, 的 DFT 时得到的答案不同。首先,wolfram alpha 除以 sqrt(N),其中 N 是序列的长度,这只是正向和反向变换的不同对称定义。
其次,更令人困惑的是,我的实现给了我 wolfram alpha 给我的结果的复共轭——数值在其他方面大致相同。这是我的代码的实现问题(例如语法错误),还是只是 wolfram 使用不同的离散傅立叶变换定义?
在这两种情况下(对于缩放和复数共轭结果),根本原因是用于离散傅立叶变换 (DFT) 的定义不同。
default definition of the DFT from Wolfram使用公式:
或者等效地使用基于零的索引、时间索引 n
、频率索引 k
和 j=sqrt(-1)
来与您的实现进行比较:
您的实现使用 Wolfram 所称的 "signal processing" 约定:
这又等同于:
对于实值输入序列,在复指数项中使用负号会产生一个结果,该结果是在复指数项中使用正号的相似表达式的复共轭(反之亦然):