4

この質問は、Numerical Recipes のファン、または FFT をよく理解している人を対象としています。

実数成分が -2*(sin(theta/2))^2 で計算される理由を誰か説明できますか? 私はそれに頭を包むことができないようです。私はhttp://www.dspdimension.com/admin/dft-a-pied/チュートリアルなどの他の例を見てきました。これは単純に cos(シータ) を実数、-sin(シータ) を虚数として取ります。また、基本的なhttp://www.dspguide.com/ch12/3.htmで、cos(シータ) を実数、-sin(シータ) を虚数としてリストしているのも見ました。cos と -sin を単純に実数と虚数として扱うリソースが他にもいくつか考えられます。

cos(theta) = 1-2*(sin(theta/2))^2

上記のトリガー ID が true の場合、なぜこれが続かないのですか?

theta=isign*(6.28318530717959/mmax);
wtemp=sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi=sin(theta);

Numerical Recipe は何らかのトリガー ID を使用しているに違いないと思いますか? 私はそれを理解できないようで、本はまったく説明していません。

ここにあるコード: http://ronispc.chem.mcgill.ca/ronis/chem593/sinfft.c.html

#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr

void four1(double *data,unsigned long nn,int isign)
{
        unsigned long n,mmax,m,j,istep,i;
        double wtemp,wr,wpr,wpi,wi,theta;
        double tempr,tempi;

        n=nn << 1;
        j=1;
        for (i=1;i<n;i+=2) {
                if (j > i) {
                        SWAP(data[j],data[i]);
                        SWAP(data[j+1],data[i+1]);
                }
                m=n >> 1;
                while (m >= 2 && j > m) {
                        j -= m;
                        m >>= 1;
                }
                j += m;
        }
        mmax=2;
        while (n > mmax) {
                istep=mmax << 1;
                theta=isign*(6.28318530717959/mmax);
                wtemp=sin(0.5*theta);
                wpr = -2.0*wtemp*wtemp;
                wpi=sin(theta);
                wr=1.0;
                wi=0.0;
                for (m=1;m<mmax;m+=2) {
                        for (i=m;i<=n;i+=istep) {
                                j=i+mmax;
                                tempr=wr*data[j]-wi*data[j+1];
                                tempi=wr*data[j+1]+wi*data[j];
                                data[j]=data[i]-tempr;
                                data[j+1]=data[i+1]-tempi;
                                data[i] += tempr;
                                data[i+1] += tempi;
                        }
                        wr=(wtemp=wr)*wpr-wi*wpi+wr;
                        wi=wi*wpr+wtemp*wpi+wi;
                }
                mmax=istep;
        }
}
#undef SWAP
4

7 に答える 7

3

から始まる:

  • cos(A+B) = cos(A) cos(B) - sin(A) sin(B)
  • sin(A+B) = sin(A) cos(B) + cos(A) sin(B)
  • cos(2A) = 1 - 2 sin 2 (A)
  • e i θ = cos(θ) + i sin(θ)

そう:

e i (φ+δ)

= cos(φ + δ) + i sin(φ + δ)

= cos(φ) cos(δ) - sin(φ) sin(δ) + i [sin(φ) cos(δ) + cos(φ) sin(δ)]

= cos(φ) [ 1 - 2 sin 2 (δ/2) ] + i sin(φ) [ 1 - 2 sin 2 (δ/2) ] + i sin(δ) [ i * sin(φ) + cos (φ) ]

= [ cos(φ) + i sin(φ) ] [ 1 - 2 sin 2 (δ/2) ] + [ cos(φ) + i sin(φ) ] i sin(δ)

= e i φ + e i φ [ - 2 sin 2 (δ/2) + i sin(δ)]

編集:それは私の側では多くの役に立たないフォーマットでした。実際にはもっと簡単です:

y (a+b) = y a × y b for any y. そう:

e i (φ+δ)

= e i φ e i δ

= e i φ [ cos(δ) + i sin(δ) ]

= e i φ [ 1 - 2 sin 2 (δ/2) + i sin(δ) ]

于 2010-02-11T01:24:41.927 に答える
1

コサインの半角恒等式の 1 つの形式は次のとおりです。

cos(theta) = 1 - 2*(sin(theta/2)^2)

それがあなたの質問に答えているかどうかはわかりません。

于 2010-02-08T10:30:47.643 に答える
0

わかりましたので、これがトリガーのアイデンティティです。半分の cos(theta) 三角関数ではない理由は、オイラーと虚数に依存しているためです。数学はまだ私を超えています...

リンクテキスト
(出典: librow.com )

于 2010-02-11T00:55:57.647 に答える
0

FFTはよくわかりませんが、やったことがありますが、長い時間がかかりました。

そこで、 http://www.sosmath.com/trig/Trig5/trig5/trig5.htmlでトリガーの ID を調べました。

そして、sin(u)*sin(v) の最初の「Product-To-Sum」恒等式から、

sin^2(シータ/2) = (1/2) [cos(ゼロ) - cos(シータ)] = 0.5 - 0.5 cos(シータ)

これは役に立ちますか?

于 2010-02-08T10:35:45.510 に答える
0

彼らは、計算する必要がある循環関数の数を最小限に抑えるために、trig identities を使用しています。多くの高速な実装では、これらの関数を検索するだけです。本当に知りたい場合は、上記のループを展開し、適切な変数置換を行って詳細を確認する必要があります....うんざりです。

ところで、NR の実装は非常に遅いことが知られています。

ポール

于 2010-02-10T03:44:42.990 に答える