FFT in C / C nodig

S

showtime

Guest
Ik moet FFT in C / C te maken met enorme data-serie, 2 ^ 24 punten.iedereen heeft een hoge efficiënte fft in c of cpp?

 
In DSPLib voor TI C67xx er is C prototype bronnen voor verschillende type FFT algoritmen.

Zie ti.com

 
Ik heb onlangs een programma in C voor N punt FFT berekening met behulp van radix -2 DIF algoithm als een deel van mijn lab natuurlijk ..

Ik kom na het programma hier ..gelieve te erkennen

/ * Auteur: Ragavan N BE, DECE, * /
/ * Instituut: Madras Institute of Technology, Madras * /
/ * Telefoon: 9840806628 * /
/ * E-mail: imperial_amazon (at) yahoo.com * /
/ * In het geval u niet kunnen volgen de logica gebruikte ik, voel je vrij * /
/ * To mail me ..Ik zal u uitleggen in detail * /

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

float pi = 3.141592654;

struct Complex
(float echte, IMAG;);

int BITREV (int n, int bininp) / * functie te doen Bit omkering * /
(
int i, num, bitrevd = 0;
num = log10 (N) / log10 (2);
for (i = 0; i <(int) num; i )
(if (((bininp <<i) & (N / 2))! = 0) bitrevd = (int) pow (2, i);)
return (bitrevd);
)float wreal (int NPV, int i) / * berekenen van de reële deel opnieuw (exp (-j2 * pi * n / N)) * /
(
if (fabs (cos (2 * pi * (float) i / (float) NPV)) <.0001)
(return 0;)
else (return (float) (cos (2 * pi * (float) i / (float) NPV));)
)

float wimag (int NPV, int i) / * berekenen van de reële deel im (exp (-j2 * pi * n / N)) * /
(
if (fabs (-sin (2 * pi * (float) i / (float) NPV)) <.0001)
(return 0;)
anders
(return (float) (-sin (2 * pi * (float) i / (float) NPV));)
)void ontleden (int NPV, int n, int v, struct Complex (* x_time) [1024], struct Complex (* mainX) [1024])
(
struct Complex * x_tmp; int i;
x_tmp = malloc (2 * NPT * sizeof (float));
for (i = 0; i <NPV; i ) (x_tmp . real = 0; x_tmp . IMAG = 0;)
for (i = 0; i <(N / 2); i )
(
Auto float a, b, c, d;
x_tmp . real = x_time [v] . real x_time [v] [i (N / 2)]. reëel;
x_tmp . IMAG = x_time [v] . IMAG x_time [v] [i (N / 2)]. IMAG;
a = (x_time [v] . real-x_time [v] [i (N / 2)]. werkelijke);
b = (x_time [v] . IMAG-x_time [v] [i (N / 2)]. IMAG);
c = wreal (NPV, NPT * i / N); d = wimag (NPV, NPT * i / N);
x_tmp [i (N / 2)]. real = ((a * c) - (b * d));
x_tmp [i (N / 2)]. IMAG = ((a * d) (b * c));
)
for (i = N * v; i <(N (N * v)); i )
(
Auto int s;
s = in * v;
if (x_tmp . reële == 0)
(mainX [0] . real = abs (x_tmp . reële);)
anders
(mainX [0] . real = x_tmp . reële;)
if (x_tmp . IMAG == 0)
(mainX [0] . IMAG = abs (x_tmp . IMAG);)
anders
(mainX [0] . IMAG = x_tmp . IMAG;)
)
/ * Printf ( "\ n \ nDecomposed \ n \ n");
for (i = 0; i <NPV; i )
(
printf ( "\ n% f \ t% f", mainX [0] . reëel, mainX [0] . IMAG);
) * /
gratis (x_tmp);
)

void main ()
(
struct Complex (* x) [1024];
int i, NPV, N, fase, m, j, NumX, s;
clrscr ();
printf ( "\ n \ nn ="); scanf ( "% d", & NPV);
fase = (int) (log10 ((double) NPV) / log10 (2));
fase-= 1;
x = malloc (2 * 2 * NPT * sizeof (float));
for (i = 0; i <NPV; i )
(
x [0] . real = 0;
x [0] . IMAG = 0;
)
printf ( "\ nx =");
for (i = 0; i <NPV; i )
(scanf ( "% f", & x [0] . reële);)
for (i = 0; i <NPV; i )
(x [0] . IMAG = 0;)
ontleden (NPV, NPV, 0, x, x);
voor (n = fase; s> 0; s -)
(
struct Complex (* X1) [1024];
j = m = 0;
X1 = malloc (2 * npt * 2 * sizeof (float));
NumX = (int) (NPV / (int) pow (2, s));
for (i = 0; i <NumX; i )
(
for (; j <(m ((int) pow (2, s))); j )
(
(X1 [JM]). Real = ((float) ((x [0] [j]). Reële));
(X1 [JM]). IMAG = ((float) ((x [0] [j]). IMAG));
)
m = (int) pow (2, s);
)
for (i = 0; i <NumX; i )
(
ontleden (NPV, (int) pow (2, s), i, X1, x);
)
gratis (X1);
)
/ * Printf ( "\ n \ nFFT output voordat Bit omkering \ n \ n");
for (i = 0; i <NPV; i )
(
printf ( "\ n% f \ t j% f", x [0] . reëel, x [0] . IMAG);
) * /
printf ( "\ n \ nResult van FFT \ n \ n");
for (i = 0; i <NPV; i )
(
printf ( "\ n% f \ t j% f", x [0] [BITREV (NPV, i)]. reëel, x [0] [BITREV (NPV, i)]. IMAG);
)
gratis (x);
getch ();

)

 
Hoi

Voor
zo'n lange FFT, radix-2 is niet efficeint, probeert u radix-8 of meer.

Groeten

 
/ / X is de reële coëfficiënten
/ / Y imaginaire coëfficiënten

/ / Door deze functie zijn het gevolg van reële en imaginaire
/ / Waarden worden opgeslagen in RealArray en ImaginaryArray

int main ()
(

FFT (1, getal1, RealArray, ImaginaryArray); / / 1 voor FFT
/ / Getal1 Moet macht van twee
/ / Getal1 = 5; voor 32 = 2 ^ 5

FFT (-1, getal2, RealArray, ImaginaryArray );//- 1 voor IFFT

)

void FFT (int richt, int m, float * x, float * y)

(

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

float C1, C2, tx, ty, t1, t2, U1, U2, z;

/ / Geen van Puntenn = 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 ;

ty = y ;

x = x [j];

y = y [j];

x [J] = tx;

y [j] = ty;

)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 U2 * c2 * 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;)

)

)
Sorry, maar je moet inloggen om dit onderdeel te bekijken koppelingseisen

 

Welcome to EDABoard.com

Sponsor

Back
Top