FFTアルゴリズムとDFTアルゴリズムC言語実装(詳細を与える)
宣言:
構想を書く:
コードセクション
逆順コード:
##逆順コード解釈:
##FFTコード:
##FFTコード解釈:
##複素関数定義と演算コード部分:
完全なコードを確認するにはこちらをクリックしてください←
##フルコード実装の機能:
《 》
(DFT) (FFT)
C FFT , FFT 。
構想を書く:
FFT ,
,
コードセクション
逆順コード:
for (int I = 1; I < N1; I++) //
{
if (I < J)
{
T = x[I];
x[I] = x[J];
x[J] = T;
}
K = LH;
if (J >= K)
{
do
{
J = J - K;
K = K / 2;
} while (J >= K);
}
J = J + K;
}
##逆順コード解釈:
J 。
N=2^M,M N/2, N/4,N/8,……,2,1。
, J+N/2。 0(J=N/2), 0(J=J-N/2), 1(J+N/4)。
1 , 0、1 , 0(J
##FFTコード:
for (L = 1; L <= M; L++) //FFT
{
B = (int)(pow(2, L - 1));
for (J = 0; J < B; J++)
{
P = (int)(J*pow(2, M - L));
for (k = J; k < N; k = (int)(k + pow(2, L)))
{
K1 = k + B;
complex wn, t;
Wn_i(N, P, &wn);
c_mul(f[K1], wn, &t); //。。。。。。。。。。。。
c_sub(f[k], t, &(f[K1])); //
c_plus(f[k], t, &(f[k])); //。。。。。。。。。。。。
}
}
}
##FFTコード解釈:
L , B=2^(L-1)
B ; 2^L 2^(M-1)
( 1 ) , , M
L , B , , 2^(M-L)
##複素関数定義と演算コード部分:
void c_plus(complex a, complex b, complex *c) //
{
c->real = a.real + b.real;
c->imag = a.imag + b.imag;
}
void c_sub(complex a, complex b, complex *c) //
{
c->real = a.real - b.real;
c->imag = a.imag - b.imag;
}
void c_mul(complex a, complex b, complex *c) //
{
c->real = a.real*b.real - a.imag*b.imag;
c->imag = a.real*b.imag + a.imag*b.real;
}
void Wn_i(int n1, int i, complex *Wn) // FFT
{
Wn->real = cos(2 * PI*i / n1);
Wn->imag = -sin(2 * PI*i / n1);
}
完全なコードを確認するにはこちらをクリックしてください←
##フルコード実装の機能:
1. :
-
- FFT DFT
2. :
- DFT FFT