Hvordan laver jeg en FFT analyse på en wave fil ? Jeg bruger computerens lydkort til at capture en lydfil. Efterfølgende vil jeg gerne udføre en FFT på filen. Jeg bruge diretcx 9 til at capture input´et.
Intel har et bibliotek som hedder Intel Signal processing Library det hed det i gamle dage. kan se de har opdateret det lidt. jeg ved faktisk ik om det er gratis mere men det var det førhen.
Har du rå samples i en eller anden fornuftig datastruktur ?
Jeg har skrevet en FFT algoritme som fungerer udmærket i C++. Den kan portes til C# uden det store besvær, hvis du i forvejen kender teorien bag FFT og har styr på pointers. Jeg kan poste den her hvis du er interesseret.
void fft(const mxArray * in, mxArray * out) { int Z = mxGetM(in); // antal rækker = antal blokke.
// Start med at finde pointere til de forskellige værdier. double *or, *oi, *ir, *ocr, *oci, *icr; Complex buf[N];
or=mxGetPr(out); oi=mxGetPi(out); ir=mxGetPr(in);
// Opret W koefficienter Complex W[NUM_BUTTERFLY+1][N]; int ll=2; for ( int l = 1; l<=NUM_BUTTERFLY; l++ ) { for ( int i = 0 ; i < N ; i++ ) { double re = cos(2. * PI * (double)i / (double)ll); double im =-sin(2. * PI * (double)i / (double)ll); W[l][i] = Complex(re,im); } ll*=2; }
// Èn blok af gangen for ( int c = 0 ; c < Z ; c++ ) { // udregn startadresse for reelle og imaginære værdier for denne blok ocr=or+c; oci=oi+c; icr=ir+c;
// Sorter input samples i bit-reversed rækkefølge og læg dem i buffer af komplekse tal for ( short b = 0 ; b < N ; b++ ) { short b2=0; for ( int i = 0 ; i < 9 ; i++ ) { if ( (b&(1<<(9-(i+1)))) != 0 ) b2 |= (1<<i); } buf[b2]= Complex(icr[Z*b],0); }
// Egentlig FFT implementation kommer her // step: 'spredning' i bufferen mellem hvert ben på butterfly // increm: afstand mellem hver butterfly int step = 1; for ( int level = 1 ; level <= NUM_BUTTERFLY ; level++ ) { int incr = 2*step; for (int j=0; j<step;j++) { Complex U=W[level][j]; for ( int i = j ; i < N ; i+=incr ) { // Èn in-place butterfly beregning Complex T=U; T *= buf[i+step]; buf[i+step]=buf[i]; buf[i+step]-=T; buf[i]+=T; } } step*=2; }
// Flyt fra midlertidig buffer til output buffer, og husk skalering for ( int t = 0 ; t <= (N/2) ; t++ ) { *(ocr+(Z*t)) = buf[t].Re()/N; *(oci+(Z*t)) = buf[t].Im()/N; } } }
Selve input/output buffer delen er lidt speciel da koden er lavet til MatLab. Men du kan nok regne ud hvordan du laver det om til eget brug.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.