2016-04-05 6 views
3

私はPythonで離散フーリエ変換の簡単なバージョンを実装しようとしています。 次のように私のコードは次のとおりです。"正しい"答えの複素共役を与える離散フーリエ変換

[(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を計算するとき、私はウォルフラムアルファに乗るの答えとは異なります

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

私は結果を受け取ります。まず、wolfram alphaはsqrt(N)で除算されます。ここで、Nはシーケンスの長さです。これは順変換と逆変換のちょうど異なる対称定義です。
私の実装は、アルファが私に与えている結果の複素共役を私に与えています。数値はそうでなければほぼ同じです。これはコード上の実装上の問題(構文エラーなど)の問題ですか、それとも離散フーリエ変換の別の定義を使用する単純にウォルフラムですか?

+0

[ウォルフラムは離散フーリエ変換の別の定義を使用します](https://reference.wolfram.com/language/tutorial/FourierTransforms.htmlhttps://reference.wolfram.com/language/tutorial/FourierTransforms.html# 19751) – SleuthEye

+0

@SleuthEyeあなたのリンクを修正しました:[WolframはDFTの別の定義を使用します](https://reference.wolfram.com/language/tutorial/FourierTransforms.html#19751) – Norman

+0

ああ、これは意味があります。以前は[wolfram math world](http://mathworld.wolfram.com/DiscreteFourierTransform.html)を参考にしていましたが、これをクリアしていただきありがとうございます。私はこの質問を解決済みとすることができるように、答えとして残すことができますか? – Decimak

答えて

2

両方の場合(スケーリングと複素共役結果の場合)、根本的な原因は、離散フーリエ変換(DFT)で使用される定義の違いです。

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

default definition of the DFT from Wolfram

は、式を使用していますあなたの実装は、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}

関連する問題