Red de conocimiento informático - Material del sitio web - Cómo obtener datos recopilados por AD y realizar la transformación FFT

Cómo obtener datos recopilados por AD y realizar la transformación FFT

#includelt; math.hgt;

kkfft(doble pr[], doble pi[], int n, int k, doble fr[], doble fi[], int l, int il)

{

int it, m, is, i, j, nv, l0;

double p, q, s, vr, vi, poddr, poddi;

for (it=0; itlt; =n-1; it )

{

m = it

is = 0;

para (i=0; ilt.= k-1; i )

{

j = m/2; p> es = 2*es (m-2*j);

m = j

}

fr[it] = pr[is] ;

fi[it] = pi[is];

}

pr[0] = 1.0;

pi[0 ] = 0,0;

p = 6,283185306/(1,0*n);

pr[1] = cos(p>

pi[1] = -sin(p);

si (l!=0)

pi[1]=-pi[1];

para (i=2 ilt;=n-1; i )

{

p = pr[i-1]*pr[1];

q = pi[ i-1]*pi[1];

s = (pr[i-1] pi[i-1])*(pr[1] pi[1]); p> pr[i] = p-q;

pi[i] = s-p-q;

}

para (it=0; itlt;=n-2 ;it=it 2)

{

vr = fr[it];

vi = fi[it];

fr [it] = vr fr[it 1];

fi[it] = vi fi[it 1];

fr[it 1] = vr-fr[it 1] ;

fi[it 1] = vi-fi[it 1];

}

m = n/2;

nv = 2;

for (l0=k-2; l0gt; =0; l0--)

{

m = m/2;

nv = 2*nv;

para (it=0; itlt; = (m-1)*nv; it=it nv)

para ( j=0; jlt;=( nv/2)-1; j )

{

p = pr[m*j]*fr[it j nv/2];

q = pi[m*j]*fi[it j nv/2]

s = pr[m*j] pi[m*j];

s = s*(fr[it j nv/ 2] fi[it j nv/2]);

poddr = p-q

poddi = s-p-;

q;

fr[it j nv/2] = fr[it j]-poddr

fi[it j nv/2] = fi[it j]-poddi;

fr[it j] = fr[it j] poddr;

fi[it j] = fi[it j] poddi

}

}

if (l!=0)

{

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

{

fr[i] = fr[i]/(1.0*n

fi[i] = fi[i]/(1.0); *n);

}

}

si (il!=0)

{

para (i=0; ilt;=n-1; i )

{

pr[i] = sqrt(fr[i]*fr[i] fi[i]* fi[i]);

if (fabs(fr[i])lt;0.000001*fabs(fi[i]))

{

if ((fi[i]*fr[i])gt; 0 )

pi[i] = 90.0

else

pi[i] = -90.0;

}

else

pi[i] = atan(fi[i]/fr[i])*360.0/6.283185306 p>

}

}

retorno

}

void main()

{

doble s1[128], s2[128], s3[128], s4[128], TT, TM;

int i, f, ff

f =128;

ff=4;

para(i=0; ilt; 128; i )

{

TT= i;

TM=TT/f

s1[i]=2*sin(2*3.14*ff*TM) 10; }

kkfft(s1, s2, 128, 7, s3, s4, 0, 1);

printf("s1=f\n", s1[0]/128); );

getch();

for(i=1; ilt; 12; i )

{

printf(" s1= f\n", s1[i]/64, i);

}

getch();

}

Este es un fft compilado bajo wintc, donde double pr[], double pi[], double fr[], double fi[] son ​​matrices de entrada i )

{

TT=i;

TM=TT/f

s1[i]=2* sin(2*3.14*ff*TM) 10;

}

s1 corresponde a pr

Después de ejecutar, puede ver el componente de CC (i=0 puntos) y el componente de CA (i=4 puntos)

Explicación: kkfft(s1, s2, 128, 7, s3, s4

, 0, 1);

s1 corresponde al valor solo del anuncio, s2 es el valor del anuncio. valor, s2 es la parte imaginaria del muestreo de anuncios, generalmente 0, 128 puntos de muestreo deben ser n veces de 2, 7 es n, s3, s4 las tuberías de retorno son los valores de retorno secundarios, 0, 1. es el símbolo en el programa

fft El significado del resultado: ella es una matriz como S1 [n], luego s1 [0] / número de puntos de muestreo es el valor del componente DC,

y la señal real está en la matriz La frecuencia de respuesta es f=n*frecuencia de muestreo/número de puntos de muestreo;

kkfft(double pr[], double pi[], int n, int k, double fr [], double fi[], int l, int il)

Se ejecuta en el microcontrolador 51 (020, 120, 060);

La frecuencia de respuesta de la señal real en la matriz es f=n*muestreo; frecuencia/número de puntos de muestreo.