FFT c / c reikia

S

showtime

Guest
Man reikia FFT c / c susidoroti su dideliais duomenų serijų, 2 ^ 24 taškų.kiekvienas turi didelio efektyvumo FFT c ar cpp?

 
Į DSPLib TI C67xx yra C prototipas šaltinių įvairių tipų FFT algoritmus.

Žr ti.com

 
i neseniai padarė programą C N punkte FFT apskaičiuoti naudojant radix -2 DIF algoithm kaip dalį savo laboratorijoje kursas ..

I'll post programą čia ..prašome patvirtinti, kad

/ * Autorius: Ragavan N, BE, Dèce, * /
/ * Institutas: Madras Institute of Technology, Madras * /
/ * Telefonas: 9840806628 * /
/ * E-mail: imperial_amazon (at) yahoo.com * /
/ * Jei negalite laikytis logikos aš,
nedvejodami * /
/ * Rašykite ..aš paaiškinti jums išsamiai * /

#
Include <alloc.h>
#
Include <stdio.h>
#
Include <conio.h>
#
Include <math.h>

float pi = 3,141592654;

Struct kompleksas
(float realus, IMAG;);

int BITREV (int N, int bininp) / * funkcija padaryti Bit panaikinimas * /
(
int i, num, bitrevd = 0;
num = log10 (N) / log10 (2);
for (i = 0; i <(int) num; i )
(if (((bininp <<i)
ir (n / 2))! = 0) bitrevd = (int) pow (2, i);)
return (bitrevd);
)flotacinio wreal (int BGNS, int i) / * apskaičiuoti tikrą dalį pakartotinai (exp (-J2 * pi * n / N)) * /
(
jei (FOEB (cos (2 * pi * (float) i / (float) BGNS)) <.0001)
(return 0;)
else (return (float) (cos (2 * pi * (float) i / (float) BGNS));)
)

flotacinio wimag (int BGNS, int i) / * apskaičiuoti tikrą dalį im (exp (-J2 * pi * n / N)) * /
(
jei (FOEB (-sin (2 * pi * (float) i / (float) BGNS)) <.0001)
(return 0;)
kitas
(return (float) (-sin (2 * pi * (float) i / (float) BGNS));)
)tuščia Skaidosi (int BGNS, int N, int v, Struct kompleksas (* x_time) [1024], Struct kompleksas (* mainX) [1024])
(
Struct kompleksas * x_tmp; int i;
x_tmp = malloc (2 * npt * sizeof (float));
for (i = 0; i <BGNS; i ) (x_tmp . realus = 0; x_tmp . IMAG = 0;)
for (i = 0; i <(n / 2); i )
(
auto float a, b, c, d;
x_tmp . nekilnojamojo = x_time [v] . realiu x_time [v] [i (N / 2)]. reali;
x_tmp . IMAG = x_time [v] . IMAG x_time [v] [i (N / 2)]. IMAG;
a = (x_time [v] . realiu x_time [v] [i (N / 2)]. realus);
b = (x_time [v] . IMAG-x_time [v] [i (N / 2)]. IMAG);
c = wreal (BGNS, BGNS * i / N) d = wimag (BGNS, BGNS * i / N);
x_tmp [i (N / 2)]. nekilnojamojo = ((a * c) - (b * d));
x_tmp [i (N / 2)]. IMAG = ((a * d) (b * c));
)
for (i = N * v; i <(n (N * t)); i )
(
auto int s;
s = iN * v;
jei (x_tmp . nekilnojamojo == 0)
(mainX [0] . nekilnojamojo = abs (x_tmp . realus);)
kitas
(mainX [0] . nekilnojamojo = x_tmp . reali;)
jei (x_tmp . IMAG == 0)
(mainX [0] . IMAG = abs (x_tmp . IMAG);)
kitas
(mainX [0] . IMAG = x_tmp . IMAG;)
)
/ * Printf ( "\ n \ nDecomposed \ n \ n");
for (i = 0; i <BGNS; i )
(
printf ( "\ n% f \ t% f", mainX [0] . realus, mainX [0] . IMAG);
) * /
nemokamai (x_tmp);
)

void main ()
(
Struct kompleksas (* x) [1024];
int i, NPT, N etapas, m j, NumX, s;
clrscr ();
printf ( "\ n \ nN ="); scanf ( "% d", & BGNS);
etapas = (int) (log10 ((double) BGNS) / log10 (2));
etapas-= 1;
x = malloc (2 * 2 * BGNS * sizeof (float));
for (i = 0; i <BGNS; i )
(
x [0] . realus = 0;
x [0] . IMAG = 0;
)
printf ( "\ nx =");
for (i = 0; i <BGNS; i )
(scanf ( "% f", & x [0] . realus);)
for (i = 0; i <BGNS; i )
(x [0] . IMAG = 0;)
Skaidosi (dienos, dienos, 0, x, x);
for (s = etape; s> 0; s -)
(
Struct kompleksas (* X1) [1024];
j = m = 0;
X1 = malloc (2 * npt * 2 * sizeof (float));
NumX = (int) (NPT / (int) pow (2, s));
for (i = 0; i <NumX; i )
(
for (j <(m ((int) pow (2, s))) j )
(
(X1 [jm]). Nekilnojamojo = ((float) ((x [0] [j]). Realią));
(X1 [jm]). IMAG = ((float) ((x [0] [j]). IMAG));
)
m = (int) pow (2, s);
)
for (i = 0; i <NumX; i )
(
Skaidosi (BGNS, (int) pow (2,-ų), i, X1, x);
)
nemokamai (X1);
)
/ * Printf ( "\ n \ nFFT produkcijos iki Bit atšaukiamas \ n \ n");
for (i = 0; i <BGNS; i )
(
printf ( "\ n% f \ t j% f", x [0] . nekilnojamojo x [0] . IMAG);
) * /
printf ( "\ n \ nResult apie FFT \ n \ n");
for (i = 0; i <BGNS; i )
(
printf ( "\ n% f \ t j% f", x [0] [BITREV (BGNS i)]. nekilnojamojo x [0] [BITREV (BGNS i)]. IMAG);
)
nemokamai (x);
getch ();

)

 
Labas

Dėl tokio ilgo FFT, radix-2 nėra efficeint, pabandykite naudoti radix-8 ar daugiau.

Linkėjimai

 
/ / X yra reali koeficientus
/ / Y yra įsivaizduojama koeficientus

/ / Paskambinę šią funkciją, todėl realus ir įsivaizduojamas
/ / Vertes bus saugomi RealArray ir ImaginaryArray

int main ()
(

FFT (1 numeris1, RealArray, ImaginaryArray) / / 1 FFT
/ / Numeris1 turėtų būti, kad dvi
/ / Numeris1 = 5; 32 = 2 ^ 5

FFT (-1, liczba2, RealArray, ImaginaryArray );//- 1 IFFT

)

tuščia FFT (int dir, int m, float * x, float * y)

(

int n, i, i1, j, k, i2, l, L1, L2;

flotacinio C1, C2, tx, ty, t1, t2, u1, u2, z;

/ / Nr Taškain = 1;

for (i = 0; i <m; i )

n *= 2;
/ *

0000 -----> 0000 0

0001 -----> 1000 8

0010 -----> 0100 4

0011 -----> 1100 12

0100 -----> 0010 2

0101 -----> 1010

0110 -----> 0110

0111 -----> 1110

1000 -----> 0001

1001 -----> 1001

1010 -----> 0101

1011 -----> 1101

1100 -----> 0011

1101 -----> 1011

1110 -----> 0111

1111 -----> 1111

* /
i2 = n> 1 / 2 ^ n

j = 0;

for (i = 0; i <n-1; i )

(

if (i <j)

(

tx = x ;

tu = y ;

x = x [j];

y = Y [j];

x [j] = tx;

y [j] = tu;

)k = i2;

while (k <= j)

(

j -= k;

k> = 1;

)

j = k;
)c1 = -1;

c2 = 0;

l2 = 1;for (l = 0, l <m; l )

(

L1 = L2;

l2 <= 1;

u1 = 1;

u2 = 0;for (j = 0; j <L1 j )

(

for (i = j, i <n; i = l2)

(

i1 = i L1;

t1 = (u1 * x [i1] - u2 * y [i1]);

t2 = (u1 * y [i1] u2 * x [i1]);

x [i1] = x - t1;

y [i1] = y - t2;

x = t1;

y = t2;

)

z = (u1 * c1 - u2 * c2);

u2 = (u1 * c2 u2 * c1);

u1 = z;

)

c2 = sqrt ((1,0 - c1) / 2,0);

if (dir == 1)

c2 = c2;

c1 = sqrt ((1,0 c1) / 2,0);

)

if (dir == -1)

(

for (i = 0; i <n; i )

(

x = x / n;y = y / n;)

)

)
Atsiprašome, bet jums reikia prisijungti, kad galėtumėte peržiūrėti šį priedą

 

Welcome to EDABoard.com

Sponsor

Back
Top