Sari la conținut
ELFORUM - Forumul electronistilor

Stie cineva un soft free de filtrare FTB la un fisier mp3 ?


mircang9

Postări Recomandate

Iata si fisierele care le mai genereaza dsPIC FD Lite pe langa ftb.s. Aici ftb.flt l-am facut ftb.txt.Nu stiu cum a convertit 0.3906250000000000E-02 in hexa 3F70000000000000:0.3906250000000000E-02 3F70000000000000/* coefficient of tap 0 */In ftb.s a importat doar cei 64 de coeficienti din partea de sus. Nu stiu cum a calculat valorilecorespunzatoare in zecimal.In grupa de jos, cei 64 coeficienti sunt de forma -0.xxxxxxxxxx si +0.xxxxxxxxxxxx si nu stiu cum i-a calculat. O sa incerc cu formulele pe care le-am discutat. Oricum coeficientii din partea de jos dinftb.flt nu-i importa in flt.s ci doar cei de sus, asa ca doar cei de sus ma intereseaza in prima fazacum i-a calculat.

ftb.txt

Link spre comentariu
  • Răspunsuri 34
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • mircang9

    23

  • cirip

    10

  • hpavictor

    1

  • scormonel

    1

Top autori în acest subiect

Imagini postate

Trebuie sa intelegi formatul in virgula mobila (floating point). S-a mai discutat aici:viewtopic.php?p=467483#p467483Fisierul care lipseste de acolo este atasat aici.post-879-139829327281_thumb.gifToate celelalte intrebari sunt legitime, dar mi-ar trebui ore ca sa le iau pe toate la purecat. Cred ca e bine sa citesti o carte serioasa de desepeala.O sa mai trec pe aici in limita timpului. Subiectul este foarte interesant. :)

Link spre comentariu

Am gasit ceva de floating-point si la: http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html

Acum o sa ma uit si la linkul dat de tine mai sus. Dar in prima faza o sa vad cum a calculat

coeficientii de sus ( cei 64 in zecimal ), nu cei in floating point de jos din fisierul ftb.s.

Poate n-o sa mai trebuiasca sa caut dsPIC FD full edition ca sa calculez 256 de coeficienti cat am eu numarul de esantioane ( adica tot 256 ).

Link spre comentariu

Am gasit corespondenta dintre cei 64 coeficienti de jos si cei 64 coeficienti de sus din fisierul ftb.flt.Este vorba de convertirea formatelor zecimale ale coeficientilor din partea de jos ( -0.xxxxxxxxx sau 0.xxxxxxxxxxx ) in format Q15 cu care lucreaza procesorul dsPIC33F ( de forma 0xXXXX in hexazecimal pe 16 biti ). Am atasat si fisierele dec2q15.m si q152dec.m ( dec2q15.txt si q152dec.txt ) pentru conversia in MATLAB.Atasez fisierul Filtru.cpp care calculeaza coeficientii filtrului FIR. Coeficientul h[0] il omit din motive de corespondenta cat mai apropiata cu ordinea coeficientilor din fisierul ftb.s. Mai exact coeficientii din mijloc ( pentru N=64 ) adica 31, 32 sunt egali si din acest motiv am eliminat pe h[0] din schema.Formulele de calcul pentru coeficienti la filtrul FIR FTB ( Fmin = 980 Hz; Fmax = 1060 Hz; Fs = 8000 Hz; N = 256 in loc de 64 ) implementate in Filtru.cpp sunt cele postate anterior cu precizarea ca de data aceasta -N/2 =< n <= N/2:omega_c1 = Fmin/Fsomega_c2 = Fmax/Fsh[0] = (omega_c2-omega_c1)/pih[n] = (sin(omega_c2*n)-sin(omega_c1*n))/(pi*n)*componenta_hamming[n]componenta_hamming[n] = 0.5 + 0.5 * cos ((2*pi*n)/N)N = 256 esantioane, Fs = frecventa de esantionare.Fmin = frecventa de taiere minima la filtrul trece banda ( luata la mijloc intre Fpass1 si Fstop1 ).Fmax = frecventa de taiere maxima la filtrul trece banda ( luata la mijloc intre Fpass2 si Fstop2 ).Fstop1 = 970 Hz; Fpass1 = 990 Hz; Fpass2 = 1050 Hz; Fstop2 = 1070 Hz; Fc = 1020 Hz.Frecventa pentru zero ( space ) este Fpass1 = Fc-30Hz, iar pentru unu logic ( mark ) este Fpass2 = Fc+30Hz din semnalul FSK de pe linia telefonica.Dupa ce voi converti fiecare coeficient ( din cei 256 coeficienti ) din zecimal ( -0.xxxxxxxx sau 0.xxxxxxxxx ) in Q15 cu MATLABu ii voi insera intr-un fisier ftb.s cu N = 256 coeficienti corespunzatori la 256 esantioane si voi programa dsPIC33FJ256GP506. Apoi voi aplica la intrare fisierul L400_4.wav si apoi voi face o analiza spectrala cu MATLABu ( asa cum mi-ai aratat ), ca sa vad daca coeficientii calculati sunt buni sau daca filtrul FIR trece banda lucreaza bine.Pentru a rula cu succes executabilul Filtru.exe trebuie copilat proiectul Filtru.dsw si rulat in Visual C++ 6.0. Altfel la rulare, iese repede din program fara a putea fi vazuti coeficientii calculati.Se observa ca coeficientii -N/2, -(N/2+1), ..., -1 sunt oglinditi fata de coeficientii +1, ..., N/2-1, N/2in coeficientii calculati cu Filtru.exe. La fel se observa si la coeficientii format Q15 din fisierulftb.s postat anterior ( coeficientii de la 0 la N/2-1 fata de coeficientii de la N/2 la N-1 ). Acest lucrupare bine intrucat caracteristica filtrului trece banda este o caracteristica simetrica fata de frecventa centrala Fc. :dans:

Link spre comentariu

Am trimis atasamentele.........Sper sa va fie de folos ! Pacat ca dimensiunea documentelor pe care putem sa le atasam pe forum este foarte mica , si din cand in cand se sterge tot..........Daca reusiti sa-i dati de cap va rog sa dezvoltati un mini DSP pentru radioamatori !

Link spre comentariu

Salut,Am calculat bine coeficientii atat in forma normata cat si nenormata. In forma normataapare in plus acel 2*pi adica h[n] = [sin(2*pi*(Fc2/Fs)*n)-sin(2*pi*(Fc1/Fs)*n)]/(pi*n) - forma normata. h[n] = [sin((Fc2/Fs)*n)-sin((Fc1/Fs)*n)]/(pi*n) - forma nenormata.In DSP bag coeficientii calculati cu forma normata sau nenormata ? sau nu conteaza care ?Imi dai si formula pentru h[n] in functie de Fstop1, Fpass1, Fpass2, Fstop2 ?In formulele de mai sus se pare ca sunt doar Fc1 = Fpass1, Fc2 = Fpass2. In dsPIC FD Lite am modificat si amplitudinea in dB a riplului trece banda saubanda rejectata, am dat diferite valori dar cei 64 coeficienti raman la fel. Deci se pare ca nu intra in formule valorile riplurilor. Daca modific Fstop1 si Fstop2 se modificacoeficientii rezultati. Deci cine a facut programul dsPIC FD Lite a folosit in formulesi Fstop1 si Fstop2. Din cate stiu Fpass1 = 0.707 din amplitudinea maxima. La fel Fpass2.Fstop1 ar fi = (1-0.707) din amplitudinea maxima filtrata. La fel Fstop2. Cred ca pentru un filtru real trebuie tinut cont si de Fstop1 si Fstop2. Formulele de mai sussunt pentru filtru trece banda ideal ( "caramida" ). Pentru FTB. In carte este forma nenormata. Am facut grafic in Excel pentruforma nenormata si arata simetric. Forma normata arata mai bine.Pentru ca am omis h[0] partea din mijloc a graficului este mai mica si nu arataprea bine. Asa ca pentru a avea ceva simetric si frumos am bagat si h[0].Mai exact iata cum am aranjat coeficientii: h(-((N/2)-1)), ..... h(-1), h(0), h(0), H(1), .... h((N/2)-1).La mijloc pe h(0) l-am pus de doua ori pentru ca sa fie numar putere a lui 2 adica numar par de coeficienti, NU impar. In fisierul ftb.s generat de dsPIC FD Lite este numar par de coeficienti, adica maxim 64 genereaza ! Apar erori la filtrare daca bag numar impar de coeficienti in DSP adica in ftb.s, adica N-1 ? N = 2^m. Imi zici te rog cum convertesc in Excel din zecimal ( -0.xxxxxx ) in Q15 ( 0xXXXX - hexa ) ? In MATLAB am reusit.Care este valoarea maxima de coeficienti pe care o pot aplica ( baga ) inDSP ? Am auzit de undeva ca pot baga maxim 2*N. Adica daca amN = 256 esantioane pot baga 2*256 = 512 coeficienti. Evidentca DSP face mai multe calcule si trebe o viteza de rulare poate mai mareca sa faca filtrare in timp real.Deocamdata, cred ca pentru ce vreau sa fac imi ajung 128 coeficientisi 256 esantioane. Viteza 40 MHz. Frecventa esantionare Fs = 8 Kz. Pentru a face filtrare trece banda in timp real. :dans:

Link spre comentariu

Numarul coeficientilor FIR calculati trebuie neaparat sa fie in numar de putere a lui 2 ?Trebuie neaparat sa fie numar par, impar ? sau nu conteaza ? Iata filtrul FIR pe care-l aplic ciclic la fiecare 256 esantioane. Este corect ? Pentru timp real: #define FRAME_SIZE 256#define SPEECH_SEGMENT_SIZE 98049L #define WRITE_START_ADDRESS 0x20000 /* Allocate memory for buffers and drivers */fractional adcBuffer [ADC_CHANNEL_DMA_BUFSIZE] __attribute__((space(dma)));fractional ocPWMBuffer [OCPWM_DMA_BUFSIZE] __attribute__((space(dma)));fractional samples [FRAME_SIZE];int i;..................................../*Initialize the filter state variables (delay line) prior to calling *//*the FIR() routine the very first time */FIRDelayInit(&ftbFilter); while(1) { /* Obtaing the ADC samples */ while(ADCChannelIsBusy(pADCChannelHandle)); ADCChannelRead (pADCChannelHandle,samples,FRAME_SIZE); /* Perform FIR Low Pass filtering on samples from ADC */ FIR(FRAME_SIZE,&FilterOut[0],&samples[0],&ftbFilter); /* Wait till the OC is available for a new frame */ while(OCPWMIsBusy(pOCPWMHandle)); /* Write the frame to the output */ OCPWMWrite (pOCPWMHandle,FilterOut,FRAME_SIZE); }Este corect programul ? Din teste arata ca filtreaza bine. Ce imbunatatiri sa-i mai fac ?

Link spre comentariu
Numarul coeficientilor FIR calculati trebuie neaparat sa fie in numar de putere a lui 2 ?
Nu. Numarul de coeficienti este determinat de necesitatea unei anumite atenuari la o anumita frecventa din afara benzii de trecere. Este ceva similar cu determinarea ordinului minim al unui filtru analogic.

 

Trebuie neaparat sa fie numar par, impar ? sau nu conteaza ?
Nu cred ca conteaza, desi am citit demult undeva niste comentarii referitoare la nr par sau impar de coeficienti, dar nu imi amintesc.

 

Iata filtrul FIR pe care-l aplic ciclic la fiecare 256 esantioane. Este corect ?

[...]

Este corect programul ? Din teste arata ca filtreaza bine. Ce imbunatatiri sa-i mai fac ?

Nu poate nimeni sa-ti spuna daca e corect doar uitandu-se la cod. Testarea se face prin simulare si testare practica in toate situatiile care iti vin in minte. Softul ptr DSP rebuie sa fie corect nu numai ca logica, dar orice eroare de calcul iti strica filtrul.
Link spre comentariu

Referitor la numarul maxim de coeficienti care poate fi introdus in calcul, am intelesde undeva ca nu trebuie sa depaseasca 2*N ( N = numarul de esantioane ).Este adevarat ??????????????????????????Filtrul meu FIR trece banda FTB asa cum am descris si softul, LUCREAZA bine !!! DAR nu suficient de bine deoarece nu atenueaza destul de mult frecventele vecine benzii de trecere, darcare sunt in afara benzii de trecere. Asa ca este necesar sa-i imbunatatesc performantele prin marirea parametrilor de lucru ( frecventa dsPICului,frecventa de esantionare, numarul de esantioane, numarul de coeficienti ).In softul filtrului meu nu folosesc deloc transformata Fourier si nici FFT si nici IFFT,ci doar functia de initiere a filtrului din structura specificata de fisierul ftb.s undesunt bagati coeficientii filtrului si adresele registrilor de intarziere, si functia din librarie FIR. Deci lucrez doar cu urmatoarele functii: FIRStruct ( pentru definirea structurii filtrului cu fisierul generat ftb.s ), FIRDelayInit, si FIR cu prototipul:extern fractional* FIR ( int numSamps, fractional* dstSamps, fractional* srcSamps, FIRStruct* filter ); din libraria dsPIC.Am N = 256 esantioane si am ajuns la un numar de 284 coeficienti.Vreau sa ajung la 512 coeficienti. Am observat ca cu cat maresc numarul de coeficienti la filtrul meu trece banda cu atat se atenueaza mai mult frecventele apropiate dar in afara benzii de trecere fata de cele din banda de trecere ceeace este bine si de dorit pentru a mari calitatea filtrului. Pentru aprelua mai bine semnalul de filtrat am vazut ca este nevoie sa maresc si frecventade esantionare. Nu-mi da voie sa maresc la 512 esantioane pentru ca imi apare limitare la DMA si imi da eroarea urmatoare. DMA este de 2K. N=256 esantioane. ADC are doua bufere ping - pong care ocupa 2 * 256, iar comparatorul PWM la fel doua bufere care ocupa2 * 256. In total ocupa 1024 biti adica 1K. Ori RAM DMA are 2K. Ar trebui sa pot marisi numarul de esantioane, dar imi da urmatoarea eroare: "main.o: Link Error: Could not allocate section _00e822a04eabf647, size = 2048 bytes, attributes = bss dma Link Error: Could not allocate data memory"iar alocarea o fac asa:#define ADC_BUFFER_SIZE 512 /* This is the size of each buffer */#define ADC_CHANNEL_DMA_BUFSIZE (ADC_BUFFER_SIZE*2) #define OCPWM_FRAME_SIZE 512 /* This is the size of each buffer */#define OCPWM_DMA_BUFSIZE (2*OCPWM_FRAME_SIZE) fractional adcBuffer [ADC_CHANNEL_DMA_BUFSIZE] __attribute__((space(dma)));fractional ocPWMBuffer [OCPWM_DMA_BUFSIZE] __attribute__((space(dma)));Am incercat sa stochez esantioanele preluate de la ADC in RAM X si pentru PWM in RAM Y si nu in DMA, dar se pare ca viteza de preluare, redare este mult micsorata si la iesirefiltrul meu nu mai scoate decat niste zgomot si nici macar o sinusoida amarata. Lucrez cu dsPIC33FJ256GP506. Viteza de preluare a datelor din memoria de program este mai mare decat din RAM ( X sau Y ) ?incercand sa stochez unele variabile in memoria de program psv.Viteza de preluare a datelor din RAM X este mai mare decat RAM Y ?Momentan avand in vedere aceasta eroare la DMA RAM, ca sa imbunatatesc performantele filtruluias putea sa maresc numarul de coeficienti si frecventa de esantionare prin cresterea vitezeide lucru de la 40 MHz la 80 MHz. Am vazut undeva ca viteza DSP o pot maripana la 200 MHz. Este adevarat ? Dar undeva spune ca recomandat este sa nu depasesc 80 MHz. :jytuiyu

Link spre comentariu

Se pare ca ma indrept in directia corecta. Fata de 256 coeficienti, 284 coeficienti aduce banda filtrata ( canal 4 ) la nivel de amplitudine egala fata de canalul vecin ( canal 6 ). Acum vreau sa filtrez canalul 4. Canalul vecin este canalul 6. Acum au amplitudini egale ( canalul 4 l-a ajuns "din urma" pe canalul 6 ca amplitudine ). Acum calculez 512 coeficienti sa vad ce se intampla. In semnalul care trebuie filtrat amplitudinea canalului 6 este de 15 ori mai mare fata de amplitudinea canalului 4. Si din aceasta cauza este mai greu de "filtrat"atenuat canalul 6 ca sa ramana doar canalul 4 la iesirea din filtru. Restul canalelor le elimina cam pana la amplitudinea zero. Asa se vede pe analiza spectrala facuta in Matlab. Canalul 4 este in banda de trecere si trebuie sa ramana adica sa iasa singur din filtru trece banda FIR al meu. :dans: :101

Link spre comentariu

Filtrul FIR digital functioneaza perfect !!! O sa postez rezultatele cat de curand. :da :101 :101 :101 :101 Fereastra Harris-Nutall cu 4 termeni aduce unul dintre cele mai bune raspunsuri in frecventafata de celelalte ferestre la filtru trece banda.

Link spre comentariu

Salut,Asta cu uniformizarea amplitudinilor nu o prea inteleg. Pai daca filtrezi, cred ca ideea e sa mentii amplitudinea in banda de trecere si sa reduci semnalele din banda de oprire. In fine, sunt interesat sa vad cum arata spectrul filtrat. Probabil ca ai niste poze scoase din analiza cu Matlab.De asemenea te rog sa postezi si un fisier wav rezultat in urma filtrarii, asa cum ai facut la inceput. Chiar daca nu postez prea mult, din lipsa de timp, urmaresc evolutia topicului.Cirip

Link spre comentariu

Introduc canalele 6, 7, 9, 11. Apoi le filtrez. "C9_narrow5" inseamna canalul 9 filtratcu banda mult ingustata ( frecventa centrala Fc +/- 5 Hz ) adica bandade trecere este ingustata la [Fpass1=Fc-5Hz;Fpass2=Fc+5Hz]. "C9_narrow5+" inseamna canal 9 narrow 5 cu zoom +. "C11_narrow1+" are aceeasi semnaificatie ca mai sus cu deosebirea ca banda de trecere este ingustat la maxim [Fpass1=Fc-1Hz;Fpass2=Fc+1Hz].Pare extrem dar asa functioneaza. Oricum se observa ca Fstop1 si Fstop2 suntvizibile si ele cu aproximatie. Canalele sunt modulate FSK. Se observa ca suntmodulate. La filtrarea canalelor 6 si 7 nu a fost nevoie sa ingustez bandaci am lasat-o la [Fpass1=Fc-30Hz;Fpass2=Fc+30Hz]. "C11_9_7_6" arata spectrul semnalului filtrat. Am observat ca atunci cand generez sinusoidecu frecvente diferite cu placa de sunet se observa ca frecventele peste 1000 Hzsunt mai reduse ca amplitudine decat frecventele sub 1000 Hz desi in imaginearata ca au amplitudini aproximativ egale. "C11_9_7_6" este obtinut prin filtrarea cu Matlab a frecventelor inregistrate de pe linia telefonica "L400_4.wav"sheruit apoi mixarea lor pentru ca ceea ce am inregistrat sa fie mai curatpentru filtrare. Filtrarile direct pe ceea ce am inregistrat de pe linia telefonicale voi posta zilele urmatoare. Oricum acele filtrari sunt de mai proasta calitate. %canal 2: 510 - 540 - 570 Hz%canal 4: 750 - Fc=780 - 810 Hz%canal 6: 990 - Fc=1020 - 1050 Hz%canal 7: 1110 - Fc=1140 - 1170 Hz%canal 9: 1350 - 1380 - 1410 Hz.%canal 11: 1590 - 1620 - 1650 Hz%canal 12: 1710 - 1740 - 1770 Hz%canal 15: 2070 - 2100 - 2130 HzCu toate acestea filtrarile la canalele 9 si 11 sunt in banda corecta de trecereca in imagini, DAR sinusoidele sunt cam urate ceea ce arata o lipsade informatie. Asta cred ca se poate corecta prin marirea frecventei de esantionare sau/si marirea numarului de esantioane. Aceste rezultatele-am obtinut cu N = 256 esantioane, Fs = 8 KHz, M < N. M este numarul de coeficienti. Fs frecventa de esantionare. Pentru redarea a cat mai multa informatie in semnalul filtrat este necesaramarirea frecventei de esantionare si/sau marirea numarului de esantioane.Fisierele wav le voi sherui maine.

post-23035-13982933206_thumb.jpg

post-23035-139829332063_thumb.jpg

post-23035-139829332065_thumb.jpg

post-23035-139829332068_thumb.jpg

post-23035-13982933207_thumb.jpg

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări