2016-04-05 77 views
3

我試圖實現離散傅立葉的簡單版本的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)] 

這不同於答案以兩種方式計算相同的序列here,的DFT當我在Wolfram Alpha的獲得。首先,wolfram alpha除以sqrt(N),其中N是序列的長度,這只是正向和反向變換的不同對稱定義。
第二,更容易混淆的,我的實現是給我的結果Wolfram Alpha的是給我的複共軛 - 該數值在其他方面大致相同。這是我的代碼實現問題(例如語法錯誤)的問題,還是僅僅使用離散傅立葉變換的不同定義的問題?

+0

[鎢使用離散傅立葉不同的定義變換](https://reference.wolfram.com/language/tutorial/FourierTransforms.htmlhttps://reference.wolfram.com/language/tutorial/FourierTransforms.html# 19751) – SleuthEye

+0

@SleuthEye修正你的鏈接:[鎢使用DFT的定義不同(https://reference.wolfram.com/language/tutorial/FourierTransforms.html#19751) – Norman

+0

嗯,好吧,這更有意義 - 我以前使用[鎢數學世界(http://mathworld.wolfram.com/DiscreteFourierTransform.html)作爲參照,謝謝你在清除了。你能否將其作爲答案留下來,以便我可以將此問題標記爲已解決? – Decimak

回答

2

在兩種情況下(用於縮放併爲複共軛的結果),則根本原因是變換(DFT)在用於離散傅里葉定義的差異。

default definition of the DFT from Wolfram使用公式:

\frac{1}{n^{1/2}}\sum_{r=1}^n u_r e^{2\pi i (r-1)(s-1)/n}

或等價使用從零開始的索引,時間指數n,頻率指數kj=sqrt(-1)來比較的實現:

\frac{1}{N^{1/2}}\sum_{n=0}^{N-1} u_n e^{2\pi j k n/N}

你的實現使用了Wolfram所稱的「信號處理」 ntion:

\sum_{r=1}^n u_r e^{-2\pi i (r-1)(s-1)/n}

這又相當於:

\sum_{n=0}^{N-1} u_n e^{-2\pi j k n/N}

對於實數值的輸入序列,使用在復指數項爲負號將產生的結果是複雜的在復指數項中使用正號的相似表達的共軛(反之亦然):

\begin{align}\sum_{n=0}^{N-1} u_n e^{-2\pi j k n/N}&= \sum_{n=0}^{N-1} u_n \mbox{conjugate}(e^{2\pi j k n/N}) \ &= \sum_{n=0}^{N-1} \mbox{conjugate}(u_n e^{2\pi j k n/N}) &,\mbox{for real $u_n$}\ &= \mbox{conjugate}\left(\sum_{n=0}^{N-1} u_n e^{2\pi j k n/N}\right) &,\mbox{for real $u_n$}\\end{align}