FFT i C / C kreves

S

showtime

Guest
Jeg trenger FFT i C / C til å håndtere store data-serien, 2 ^ 24 poeng.noen har en høy effektiv fft i c eller cpp?

 
I DSPLib for TI C67xx det er C prototype kilder for ulike type FFT algoritmer.

Se ti.com

 
Jeg har nylig gjorde et program i C for N punkt FFT beregningen bruker Radix -2 DIF algoithm som en del av min lab selvfølgelig ..

Jeg vil legge programmet her ..vennligst erkjenner

/ * Forfatter: Ragavan N BE, DECE, * /
/ * Institutt: Madras Institute of Technology, Madras * /
/ * Telefon: 9840806628 * /
/ * E-mail: imperial_amazon (at) yahoo.com * /
/ * I tilfelle du ikke klarer å følge logikken jeg brukt, gjerne * /
/ * Mail til meg ..Jeg skal forklare deg i detalj * /

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

float pi = 3.141592654;

struct Complex
(float ekte, imag;);

int BITREV (int N, int bininp) / * Funksjonen for å gjøre Bit reversering * /
(
int i, num, bitrevd = 0;
num = log10 (N) / log10 (2);
for (i = 0; i <(int) num; i )
(if (((bininp <<i)
og (N / 2))! = 0) bitrevd = (int) POW (2, i);)
return (bitrevd);
)float wreal (int NPT, int i) / * beregne reell del re (exp (-J2 * pi * n / N)) * /
(
if (fabs (cos (2 * pi * (float) i / (float) NPT)) <.0001)
(return 0;)
else (return (float) (cos (2 * pi * (float) i / (float) NPT));)
)

float wimag (int NPT, int i) / * beregne reell del im (exp (-J2 * pi * n / N)) * /
(
if (fabs (-sin (2 * pi * (float) i / (float) NPT)) <.0001)
(return 0;)
ellers
(return (float) (-sin (2 * pi * (float) i / (float) NPT));)
)void brytes (int NPT, int N, int v, struct Complex (* x_time) [1024], struct Complex (* mainX) [1024])
(
struct kompleks * x_tmp; int i;
x_tmp = malloc (2 * NPT * sizeof (float));
for (i = 0; i <npt; i ) (x_tmp . ekte = 0; x_tmp . imag = 0;)
for (i = 0; i <(N / 2); i )
(
auto float a, b, c, d;
x_tmp . ekte = x_time [v] . virkelige x_time [v] [i (N / 2)]. reell;
x_tmp . imag = x_time [v] . imag x_time [v] [i (N / 2)]. imag;
a = (x_time [v] . virkelige x_time [v] [i (N / 2)]. reelle);
b = (x_time [v] . imag-x_time [v] [i (N / 2)]. imag);
c = wreal (NPT, NPT * I / N), d = wimag (NPT, NPT * I / N);
x_tmp [i (N / 2)]. reell = ((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 =
i * v;
if (x_tmp . reell == 0)
(mainX [0] . ekte = abs (x_tmp . reelle);)
ellers
(mainX [0] . ekte = x_tmp . reell;)
if (x_tmp . imag == 0)
(mainX [0] . imag = abs (x_tmp . imag);)
ellers
(mainX [0] . imag = x_tmp . imag;)
)
/ * Printf ( "\ n \ nDecomposed \ n \ n");
for (i = 0; i <npt; i )
(
printf ( "\ n% f \ t% f", mainX [0] . real, mainX [0] . imag);
) * /
gratis (x_tmp);
)

void main ()
(
struct Complex (* x) [1024];
int i, NPT, N, scene, m, j, NumX, s;
clrscr ();
printf ( "\ n \ nn ="); scanf ( "% d", & NPT);
stadium = (int) (log10 ((double) NPT) / log10 (2));
scene-= 1;
x = malloc (2 * 2 * NPT * sizeof (float));
for (i = 0; i <npt; i )
(
x [0] . ekte = 0;
x [0] . imag = 0;
)
printf ( "\ nx =");
for (i = 0; i <npt; i )
(scanf ( "% f", & x [0] . reelle);)
for (i = 0; i <npt; i )
(x [0] . imag = 0;)
brytes (NPT, NPT, 0, x, x);
for (s = scene; r> 0; s -)
(
struct Complex (* 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]). Reell = ((float) ((x [0] [J]). Reelle));
(X1 [jm]). Imag = ((float) ((x [0] [J]). Imag));
)
m = (int) POW (2, s);
)
for (i = 0; i <NumX; i )
(
brytes (NPT, (int) POW (2, s), i, X1, x);
)
gratis (X1);
)
/ * Printf ( "\ n \ nFFT output før Bit reversering \ n \ n");
for (i = 0; i <npt; i )
(
printf ( "\ n% f \ t j% f", x [0] . virkelige, x [0] . imag);
) * /
printf ( "\ n \ nResult av FFT \ n \ n");
for (i = 0; i <npt; i )
(
printf ( "\ n% f \ t j% f", x [0] [BITREV (NPT, i)]. virkelige, x [0] [BITREV (NPT, i)]. imag);
)
gratis (x);
getch ();

)

 
Hei

For slike lange FFT, Radix-2 er ikke efficeint prøve med Radix-8 eller mer.

Hilsen

 
/ / X er reell koeffisienter
/ / Y er imaginære koeffisienter

/ / Ved å kalle denne funksjonen blir reelle og imaginære
/ / Verdier vil bli lagret i RealArray og ImaginaryArray

int main ()
(

FFT (1, tall1, RealArray, ImaginaryArray); / / 1 for FFT
/ / Tall1 Skal være kraften i to
/ / Tall1 = 5; for 32 = 2 ^ 5

FFT (-1, tall2, RealArray, ImaginaryArray );//- 1 for IFFT

)

void FFT (int dir, 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;

/ / Ingen av Ptsn = 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 * 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;)

)

)
Beklager, men du må logge inn for å vise dette vedlegget

 

Welcome to EDABoard.com

Sponsor

Back
Top