2016-04-05 17 views
3

Ich versuche, eine einfache Version der diskreten Fourier-Transformation in Python zu implementieren. Mein Code ist wie folgt:Diskrete Fourier-Transformation, die komplexes Konjugat von "richtiger" Antwort liefert

[(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)] 

Dies unterscheidet sich von der Antwort, die ich auf Wolfram Alpha erhalten, wenn die DFT der gleichen Sequenz here, auf zwei Arten der Berechnung:

#!/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)) 

ich ein Ergebnis erhalten. Erstens, Wolfram alpha teilt sich durch sqrt (N), wobei N die Länge der Sequenz ist, die nur eine andere symmetrische Definition der Vorwärts- und Rückwärtstransformation ist.
Zweitens, und verwirrender, gibt mir meine Implementierung das komplexe Konjugat des Ergebnisses, das Wolfram Alpha mir gibt - die numerischen Werte sind ansonsten ungefähr gleich. Ist dies ein Problem eines Implementierungsproblems in meinem Code (z. B. Syntaxfehler) oder ist es einfach Wolfram, das eine andere Definition der diskreten Fourier-Transformation verwendet?

+0

[Wolfram verwendet eine andere Definition der diskreten Fourier-Transformation] (https://reference.wolfram.com/language/tutorial/FourierTransforms.htmlhttps://reference.wolfram.com/language/tutorial/FourierTransforms.html# 19751) – SleuthEye

+0

@SleuthEye Dein Link wurde korrigiert: [Wolfram verwendet eine andere Definition von DFT] (https://reference.wolfram.com/language/tutorial/FourierTransforms.html#19751) – Norman

+0

Ah, okay, das macht mehr Sinn - ich hatte vorher [wolfram math world] (http://mathworld.wolfram.com/DiscreteFourierTransform.html) als Referenz benutzt, danke fürs Aufräumen. Könnten Sie das als Antwort lassen, damit ich diese Frage als gelöst markieren kann? – Decimak

Antwort

2

In beiden Fällen (für die Skalierung und für das komplexe konjugierte Ergebnis) liegt die zugrunde liegende Ursache in der Definition der diskreten Fourier-Transformation (DFT).

Die default definition of the DFT from Wolfram verwendet die Formel:

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

oder äquivalent Null basierte Indizierung, Zeitindex n, Frequenzindex k und j=sqrt(-1) gegen Ihre Implementierung vergleichen:

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

Ihre Implementierung verwendet, was Wolfram als "Signalverarbeitung" bezeichnet ntion:

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

die wiederum entspricht:

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

für reellwertige Eingangssequenzen, ein negatives Vorzeichen in dem komplexen exponentiellen Term verwendet würde zu einem Ergebnis führen, dass der Komplex ist, Konjugat des ähnlichen Ausdrucks, der ein positives Vorzeichen in dem komplexen Exponentialausdruck verwendet (und umgekehrt):

\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}