Avatar billede trn Nybegynder
20. marts 2005 - 11:55 Der er 8 kommentarer

FFT på wave

Hej

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.

mvh
Tommy
Avatar billede segato Nybegynder
20. marts 2005 - 13:19 #1
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.

http://developer.intel.com/software/products/ipp/

Ser ud som de tager penge for det nu men arbejder du for et firma er det alle pengene værd.
Avatar billede anri Novice
20. marts 2005 - 13:45 #2
Avatar billede driis Nybegynder
20. marts 2005 - 21:48 #3
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.
Avatar billede trn Nybegynder
21. marts 2005 - 07:50 #4
Du må gerne poste din implementering.
Avatar billede driis Nybegynder
21. marts 2005 - 11:49 #5
fft.h:
//**********************************************************************************************//
//                                                                                              //
// Filnavn        :  fft.h                                                                        //
//                                                                                              //
// Forfatter    :    Dennis Riis                                                                //
//                                                                                              //
// Beskrivelse    :  Header for fft MEX funktion                                                    //
//                                                                                                //
// Dato            :    28.03.04                                                                    //
//                                                                                                //
// Version        :    1.0.                                                                        //
//                  Første version.                                                                //
//                                                                                              //
//**********************************************************************************************//
#pragma once

// Includes
#include "mex.h"
#include <math.h>
#include "Complex.h"

// Konstanter
#define N                512
#define NUM_BUTTERFLY    9        // = log2(N)
#define PI                3.14159265358979
#define ERROR_SIZE        "Fejl i size. Se evt. 'help dofft'."
#define ERROR_PARAMS    "Forkert antal parametre. Se evt. 'help dofft'."

// Funktionsprototyper
void fft(const mxArray * in,mxArray * out);
extern "C" {
    void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]);
}
Avatar billede driis Nybegynder
21. marts 2005 - 11:49 #6
fft.cpp:
//**********************************************************************************************//
//                                                                                              //
// Filnavn        :  fft.cpp                                                                        //
//                                                                                              //
// Funktion    :  void fft(const mxArray * in, mxArray * out)                                    //
//                                                                                              //
// Forfatter    :    Dennis Riis                                                                //
//                                                                                              //
// Beskrivelse    :  C FFT implementation                                                        //
//                                                                                                //
// Dato            :    05.04.04                                                                    //
//                                                                                                //
// Version        :    1.0.                                                                        //
//                  Første version.                                                                //
//                                                                                              //
//**********************************************************************************************//

#include "fft.h"

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;
        }
    }
}
Avatar billede driis Nybegynder
21. marts 2005 - 11:50 #7
Complex:
//**********************************************************************************************//
//                                                                                              //
// Filnavn        :  Complex.h                                                                    //
//                                                                                              //
// Forfatter    :    Dennis Riis                                                                //
//                                                                                              //
// Klasse        :    Complex                                                                        //
//                                                                                              //
// Beskrivelse    :  Simpel klasse for repræsentation af komplekse tal                            //
//                                                                                                //
// Dato            :    05.04.04                                                                    //
//                                                                                                //
// Version        :    1.0.                                                                        //
//                  Første version.                                                                //
//                                                                                              //
//**********************************************************************************************//
#ifndef COMPLEX_H
#define COMPLEX_H

class Complex
{
public:
    // Constructors
    Complex () {}
    Complex (double re): m_re(re), m_im(0.0) {}
    Complex (double re, double im): m_re(re), m_im(im) {}

    // Rutiner, der returnerer hhv. den reelle og imaginære del af tallet.
    double Re () const { return m_re; }
    double Im () const { return m_im; }

    // += operator, læg et komplekst tal til.
    void operator += (const Complex& c)
    {
        m_re += c.m_re;
        m_im += c.m_im;
    }

    // -= operator, træk et komplekst tal fra
    void operator -= (const Complex& c)
    {
        m_re -= c.m_re;
        m_im -= c.m_im;
    }

    // *= operator, gang med et komplekst tal
    void operator *= (const Complex& c)
    {
        double reTmp = c.m_re * m_re - c.m_im * m_im;
        m_im = c.m_re * m_im + c.m_im * m_re;
        m_re = reTmp;
    }

    // - operator, returner -1*(det komplekse tal)
    Complex operator- ()
    {
            return Complex (-m_re, -m_im);
    }

private:
    // hhv. reel og imaginær del af det komplekse tal
    double m_re;
    double m_im;
};

#endif
Avatar billede driis Nybegynder
21. marts 2005 - 11:56 #8
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester