Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C++ i audio datoteke

[es] :: C/C++ programiranje :: C++ i audio datoteke

[ Pregleda: 3728 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

itf
Zagreb

Član broj: 59794
Poruke: 993
*.fsb.hr.



+9 Profil

icon C++ i audio datoteke09.02.2006. u 11:03 - pre 221 meseci
Je li itko radio sa C++om i audio datotekama. Ne mislim sad samo na pustanje wav ili mp3 zvuka na zvucnike vec i neke slozenije stvari. Npr. Doznati frekvenciju signala za neki t i sl... Ima tko kakav tutorijal?
 
Odgovor na temu

klichko

Član broj: 84010
Poruke: 55
..mtsns-ns.customer.sbb.co.yu.



+6 Profil

icon Re: C++ i audio datoteke09.02.2006. u 12:44 - pre 221 meseci
Nisam radio sa mp3 ili wav, ali sam radio sa pcm datotekama generisanim u Adobe Audition, i tu je postupak sledeci iz C-a(C++-a) ucitas datoteku i nad odbircima signala izvrsis Fourierovu transformaciju i dobijes frekvenciiju signala(tacnije dobijes energiju signala na osnovu koje izracunas frekvenciju), ako si na to mislio.
Pretpostavljam da se mp3 i slicne datoteke ne razlikuju puno od pcm, pa bi trebalo da bude isti postupak.

Sto se tice knjiga, imam dosta knjiga na tu temu, ali mislim da ni jedna nije u obliku tutoriala, ali videcu.

Pozdrav.


 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.fsb.hr.



+9 Profil

icon Re: C++ i audio datoteke09.02.2006. u 16:51 - pre 221 meseci
Kako tocno ucitas aplitudu tj. os Y za neki t (x). Znam ja Fourierovu transformaciju, ali to vise ima koristi kod pretvorbe signala iz jednog oblika u drugi, zar ne?

Ajd lupi kakav source ako imas. Hvala
 
Odgovor na temu

klichko

Član broj: 84010
Poruke: 55
..mtsns-ns.customer.sbb.co.yu.



+6 Profil

icon Re: C++ i audio datoteke09.02.2006. u 19:08 - pre 221 meseci
Pa u C-u ti kad ucitas neku audio datoteku dobices neki niz brojnih vrednosti, a sam signal ti je obicno nekakvog sinusoidnog oblika, pa ti je trazenje amplitude nad nekim odbirkom trivijalno, prosto nadjes minimalnu i maksimalnu vrednost signala. Vrednosti ucitanog signala ti u xy ravni predstavljaju y vrednosti. Kod PCM datoteke ti je to upravo ona vrednost koju ucitas, znaci nikakva dodatna racunanja nisu potrebna sto se toga tice.

Sto se Fouriera tice, ja sam ga koristio u slucaju kad sam imao dva izmesana signala, pri cemu je jos dodat i sum. Fourier ti razlozi signal koji mu prosledis i kao rezultat dobijes pikove na odredjenim tackama na osnovu kojih dobijes frekvencije signala koji su izmesani. Ukoliko imas dva izmesana signala dobijes 2 pika (4 ustvari zbog simetrije, ali posmatras samo 2). U teoriji ukolko mu prosledis samo jedan signal dobices 1(tj. 2) pik i frekvenciju signala. Mozda postoji i jednostavniji nacin za izvlacenje frekvencije iz signala, ali ja se nisam s tim toliko bavio .

Ja sam to radio pre par meseci pa mi treba malo vremena da pronadjem kod , kad nadjem, postovacu ga.

Pozdrav.


 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C++ i audio datoteke09.02.2006. u 19:50 - pre 221 meseci
Nista pametnije ti ne mogu savetovati nego da krenes odavde (za BCB):

http://tinyurl.com/c7dep

Ovo je jedan link na koji ces stici sa onoga gore:
http://tinyurl.com/7u5dg
 
Odgovor na temu

klichko

Član broj: 84010
Poruke: 55
..mtsns-ns.customer.sbb.co.yu.



+6 Profil

icon Re: C++ i audio datoteke09.02.2006. u 20:01 - pre 221 meseci
Code:
/* Function reads file with signal sent by transmiter */
int ReadFFTInputFile(FILE *fft_input, double xr[]) {    
    double buffer;    
    int i = 0;
    int state;

        /* Reading of file lasts until buffer is not full and 
           end of file is not reached */        
        while(i < FFTN && !feof(fft_input)) {                    
            fread(buffer,sizeof(double),1,fft_input);
            xr[i++] = buffer;                        
        }

        /* If the end of the file has been reached number of
           read coeficients will be less than size of the buffer,
           the unwritten buffer is filled with zeros */
        if (i < FFTN) {
            for (int j = i; j < FFTN; j++) {
                xr[j] = 0;                
            }
            state = 1;
        }
        else state = 0;
     
 /* state indicates if the end of file has been reached */
 return state;
}


Ova funkcija ti iscitava po 256 odmeraka signala iz PCM datoteke i ubacuje ih u niz (ja sam izbacio neke stvari iz ove funkcije koje ti nisu potrebne, i izmenio neke delove da bi pojasnio princip rada sa pcm datotekama, pa ne garantujem da ce ovo proci kompajliranje iz prve ).

Code:

void Receiver(double Y[], double xr[], double xi[], double Wre[], double Wim[]) {
    double Yre[FFTN];
    double Yim[FFTN];
    
    FILE *fft_input;
    int Levels;
    int j, ind;
    int status;
    char rec_signal;
    int K,w;


    if( (fft_input  = fopen( "test.pcm", "r" )) == NULL ) {
      printf( "The file 'test.pcm' was not opened\n" );
      getch();      
      return;
    }  
    
    ReadCosFile();
    ReadSinFile();

    printf("\n Prepoznati signali: \n\n");
    while (status != 1) {
        status = ReadFFTInputFile(fft_input, xr);        

        /* number of levels for FFT */
        Levels =  log(FFTN)/log(2);

                /* reset imaginary coeficients to zero */
        for(int i = 0; i < FFTN; i++) {
            xi[i] = 0;        
            xi_dsp[i] = 0;            
        }
    
     
        /* implementation of FFT DIF algorithm */
        for (i = 0; i < Levels; i++) {
            j = -1;
            K = (int)(FFTN/(2*pow(2,i)));        
            for (int k = 0; k < FFTN/2; k++) {
                if (k%K == 0) j++;                                    
                w = (int)(k%K)*pow(2,i);
                ind = k+j*K;

                /* upper butterfly wing */                
                Yre[ind] = xr[ind] + xr[ind+K];
                Yim[ind] = xi[ind] + xi[ind+K];

                /* lower butterfly wing */                
                Yre[ind+K] = (xr[ind] - xr[ind+K])*cos_table[w] 
                                   - (xi[ind] - xi[ind+K])*sin_table[w];
                Yim[ind+K] = (xi[ind] - xi[ind+K])*cos_table[w]
                                   + (xr[ind] - xr[ind+K])*sin_table[w];
                

                
            }            
            /* input for next level of FFT is an output of 
               current level */
            for (k = 0; k < FFTN; k++) {                
                xr[k] = Yre[k];
                xi[k] = Yim[k];                
            }
        }    

        /* reversion of bits for output signals */
        BitReverse(Yre, Levels);
        BitReverse(Yim, Levels);

        for (int k = 0; k < FFTN; k++) {
                Y[k] = pow(Yre[k],2) + pow(Yim[k],2);                    
            }
                

        rec_signal = Decider(Y);                         
            if (rec_signal != ' ') printf("%c ", rec_signal);

    } 
    
    fclose(fft_input);
}


Ova funkcija uzima 256 odmeraka signala iz pcm datoteke i nad njima izvrsi Fourierovu transformaciju, zatim se izvrsi reverzija bita (standardan postupak kod FFT-a ) i pozove funkcija za prepoznavanje signala.

Code:
/* Function performes recognition of received signal */
char Decider(double Y[]) {
    char result;
    int tmp_l = 4, tmp_h = 4;
    for (int i = 0; i < FFTN-1; i++) {        
        if (Y[i] > TRASHHOLD)
            for (int j = 0; j < 4; j++) {
                /* if energy of received signal is greater than TRASHHOLD,
                   it's being compared with desired energies */
                if (i == ToneCodes[0][j]) tmp_l = j;
                if (i == ToneCodes[1][j]) tmp_h = j;
            }                
    }    

    /* signal is recognized as a silence */
    if (tmp_l == 4 || tmp_h == 4) result = ' ';
    else result = Digits[tmp_l][tmp_h];
    return result;    
}


E ovo je najbitniji deo, kad se izvrsi FFT, pozoves funkciju za prepoznavanje signala koja prolazi kroz tacke FFT-a (ukupno njih 256) i poredi energiju signala sa pragom. Kada dobijes tacku u kojoj je energija veca od praga to znaci da si dobio frekvenciju signala, koju izracunas preko jedne mat. formule koju ja trenutno ne mogu da nadjem , ali tu je negde naci cu je vec.

 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.fsb.hr.



+9 Profil

icon Re: C++ i audio datoteke10.02.2006. u 13:37 - pre 221 meseci
Uh... Zahvaljujem :)
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.fsb.hr.



+9 Profil

icon Re: C++ i audio datoteke10.02.2006. u 16:40 - pre 221 meseci
Da ja sad ne kompliciram stvari... ja zelim za mp3 datoteku da nacrtam sinusoidu signala koji se unutra nalazi. Npr.

double Frekvencija[T_milisec] = Amplituda_khz

Znaci, da imam t (vrijeme) i da saznam frekvenciju signala u tom vremenu. Na osnovu toga iscrtam sinosoidu, ali kako da dodjem do tih frekvencija z svaki t? Konkretno mi treba za mp3. Hvala

Nesto tipa ovako to ja zamisljam (pseudo kod):

Ucitaj mp3 datoteku
za trajanje = 0 do mp3file.duljina
Frekvencija[trajanje] = mp3file.frekvencija(trajanje)

Jel mi sad itko ovo moze srocit u kod?
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: C++ i audio datoteke10.02.2006. u 16:44 - pre 221 meseci
Odredjivanje frekvencije na osnovu energije signala ?

Ima tu necega, ali je receno prilicno nezgrapno i zvuci mi prilicno avangardno...

Koliko sam shvatio iz koda ovo je nesto sto treba da detektuje da li tu negde u spektru
postoji dovoljno jak signal (verovatno sa primenu na modemima ili u telefoniji). Ako je
samo to cilj, moze se ista stvar uraditi i bez FFT-ja.

Gledajuci par minuta ovaj kod, cini da dosta toga nije kako treba. Nemam vremena da
gledam detalje i ukazujem na greske, ali mi neke stvari potpuno nisu gde treba da budu,
u prvom redu bit reversal.

Umesto svega toga, mislim da je pravi put prvo razumeti teoriju iza svega, kakav je
smisao FFT-ja i sta tacno znace dobijeni rezultati, pa onda sesti i pisati kod, sto je
znatno prostije i znatno delotvornije.

Za pocetak:
http://www.amazon.com/gp/produ...-7407917?v=glance&n=283155

Ako postoji dovoljno veliki interes za ovu tematiku, mogli bi smo da zamolimo ES da
uvede diskusiju Obrada Signala ili tako nesto, pa da guslamo.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.fsb.hr.



+9 Profil

icon Re: C++ i audio datoteke10.02.2006. u 16:48 - pre 221 meseci
Hah... mozda da joj vise pojednostavim. Imas mp3 datoteku i kako nacrtati sinusoidu singnala tj. da dobijes isto kao i u CoolEditu kad otvoris taj mp3? Ne treba mi nitko pisati kod za crtanje sinusoide, vec zelim znati kako doci do vrijednosti koje se trebaju iscrtati.
 
Odgovor na temu

klichko

Član broj: 84010
Poruke: 55
..mtsns-ns.customer.sbb.co.yu.



+6 Profil

icon Re: C++ i audio datoteke10.02.2006. u 17:54 - pre 221 meseci
Citat:
milanche: Odredjivanje frekvencije na osnovu energije signala ?

Ima tu necega, ali je receno prilicno nezgrapno i zvuci mi prilicno avangardno...

Koliko sam shvatio iz koda ovo je nesto sto treba da detektuje da li tu negde u spektru
postoji dovoljno jak signal (verovatno sa primenu na modemima ili u telefoniji). Ako je
samo to cilj, moze se ista stvar uraditi i bez FFT-ja.

Gledajuci par minuta ovaj kod, cini da dosta toga nije kako treba. Nemam vremena da
gledam detalje i ukazujem na greske, ali mi neke stvari potpuno nisu gde treba da budu,
u prvom redu bit reversal.

Umesto svega toga, mislim da je pravi put prvo razumeti teoriju iza svega, kakav je
smisao FFT-ja i sta tacno znace dobijeni rezultati, pa onda sesti i pisati kod, sto je
znatno prostije i znatno delotvornije.


Ovo je prijemna strana sistema, ispravno si pretpostavio da se radi o telefoniji, naime predajna strana generise par sinusoidalnih signala, i na osnovu kombinacije sinusoida se prepoznaje poslati signal. FFT je potreban zbog toga sto se na predajnoj strani 2 sinusoide pomesaju (saberu pa podele sa 2), i nakon toga se doda sum. Mislim da se razlaganje tako pomesanog signala moze uraditi samo pomocu FFT-a, ako gresim neka me neko ispravi.

Sto se tice mesta pozivanja bit reversala, to zavisi od tipa FFT u ovom slucaju se radi o FFT sa decimacijom u frekvenciji, da je bila decimacija u vremenu pozivanje bit reversal bi bilo na drugom mestu (ulaz svakog nivoa FFT bi bio promesan bit reversal-om, ako se ne varam).

Ovim primerom sam pokusao pojasniti princip primene FFT-a pri prepoznavanju signala, a eventualne nejasnoce resavati korak, po korak.

Inace ja sam originalni kod redukovao izbacivsi stvari koje nisu vezane za problematicu ovog topica, sto je sa sobom povuklo i menjanje nekih stvari, i ako sam vec rekao ne garantujem da je sve sintaksno ispravno, ali logicki kod je korektan, naravno u okviru problema za koji je napisan.

[Ovu poruku je menjao klichko dana 10.02.2006. u 18:55 GMT+1]

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: C++ i audio datoteke10.02.2006. u 18:12 - pre 221 meseci
@itf

Da ne zaborvim. Imas na sajtu
http://www.mitov.com/
IZUZETNO KVALITETAN set komponenti za BCB/Delphi za analizu/prikaz signala svih vrsta.

Koristio sam ga i mogu ti reci da nesto tako kvalitetno nisam video u skorije vreme.


 
Odgovor na temu

klichko

Član broj: 84010
Poruke: 55
..mtsns-ns.customer.sbb.co.yu.



+6 Profil

icon Re: C++ i audio datoteke10.02.2006. u 18:19 - pre 221 meseci
Citat:
itf: Hah... mozda da joj vise pojednostavim. Imas mp3 datoteku i kako nacrtati sinusoidu singnala tj. da dobijes isto kao i u CoolEditu kad otvoris taj mp3? Ne treba mi nitko pisati kod za crtanje sinusoide, vec zelim znati kako doci do vrijednosti koje se trebaju iscrtati.


Citanje wav ili pcm datoteke mozes da uradis prema kodu koji sam prilozio, pri cemu su bitne sledece stvari: ukoliko se radi o stereo formatu (sto mozes da vidis ukoliko otvoris fajl u CoolEdit-u) onda parni odmerci signala predstavljaju jedan kanal, a neparni drugi kanal. Kada procitas datoteku vrednosti signala koje si dobio iskoristis za crtanje sinusoide.

Ispravka koda za citanje datoteke:

Code:

fread(&buffer,sizeof(double),1,fft_input);
/* Podaci u datoteci su u hex obliku pa ih je potrebno prebaciti u double */
buffer = buffer/32767;    


[Ovu poruku je menjao klichko dana 10.02.2006. u 20:09 GMT+1]

 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
65.87.24.*



+1001 Profil

icon Re: C++ i audio datoteke10.02.2006. u 18:59 - pre 221 meseci
Citat:
Mislim da se razlaganje tako pomesanog signala moze uraditi samo pomocu FFT-a, ako gresim neka me neko ispravi.


Moze i pomocu autokorelacije, u kojoj bi te sinusoide bile vrlo lako otkrivene. Ovo nije
racunski efikasnije od FFT-ja.
Medjutim, kad se tacno zna oblik signala, mogu se napraviti Wiener-ovi prediktivni filtri,
koji to rade ocas posla, sa znatno manje operacija.

Citat:
Sto se tice mesta pozivanja bit reversala, to zavisi od tipa FFT u ovom slucaju se radi o FFT sa decimacijom u frekvenciji, da je bila decimacija u vremenu pozivanje bit reversal bi bilo na drugom mestu (ulaz svakog nivoa FFT bi bio promesan bit reversal-om, ako se ne varam).


Tacno. Nisam na vreme primetio da pasujes array - mislio sam da bit-reverzujes
vrednosti pojedinih semplova, sto me je zbunilo - treba reverzovati indexe u nizu, sto
vidim da se i radi. (...izvinjenje...- vracam oduzete poene...)

Medjutim:

Citat:
Citanje mp3 datoteke mozes da uradis prema kodu koji sam prilozio, pri cemu su bitne sledece stvari: mp3 je stereo format (sto mozes da vidis ukoliko otvoris fajl u CoolEdit-u) tako da ti parni odmerci signala predstavljaju jedan kanal, a neparni drugi kanal. Kada procitas datoteku vrednosti signala koje si dobio iskoristis za crtanje sinusoide.


Ovo mislim da je bolje da kolega Dimkovic ne vidi, inace ce da posizi.
Mp3 je komprimovan bit stream, a to sto se vidi u CoolEditu je dekodovan
PCM
signal za koji bi vazilo to sto kazes. Dakle, ako bi nekako dekodovao Mp3
u PCM ili WAV file, to sto si napisao bi vazilo.
 
Odgovor na temu

klichko

Član broj: 84010
Poruke: 55
..mtsns-ns.customer.sbb.co.yu.



+6 Profil

icon Re: C++ i audio datoteke10.02.2006. u 19:08 - pre 221 meseci
Priznajem gresku zaboravio sam na to sta je u stvari mp3, zanela me slika iz CoolEdit-a . Evo menjam to i u originalnom postu. Sorry.

 
Odgovor na temu

[es] :: C/C++ programiranje :: C++ i audio datoteke

[ Pregleda: 3728 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.