Sari la conținut
ELFORUM - Forumul electronistilor

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


mircang9

Postări Recomandate

Adica sa incarc in el fisierul mp3, wav si sa aplic o filtrare FTB ( sa-i dau Fmin, si Fmax ) si sa scoatala iesire doar banda de frecvente selectata si sa salvez iesirea intr-un fisier mp3, wav sau alt format. :jytuiyu

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

Merge cu Matlabul, dar trebuie scris filtrul. E destul de usor. Chestia misto e ca se poate face filtru de ordin foarte mare, pentru ca nu e in timp real.Pune wav-ul (nu mp3) zipat pe un sait de sharing, zi ce frecvente vrei sa fie filtrul si iti trimit eu inapoi filtrat ... in masura timpului de care dispun si eu.

Link spre comentariu

Salutare,

 

Fisierul L400 l-am pus pe: http://www.4shared.com/get/QSWgFIDB/L400_4.html.

 

Am incercat cu cateva editoare free inclusiv cu Audacity sa fac "bandpass filter" pentru frecventa 540 ( canalul 2 ), dar ceea ce rezulta se aude cam la fel, ceea ce ma duce cu gandul ca nu face ceea ce pretinde ca face fiind versiuni gratuite. Si daca face, face superficial. Am facut succesiv filtrare trece jos cu 510 Hz si trece sus cu 570 Hz ( pentru canal 2 ) dar tot degeaba. Am lucrat si cu egalizoarele din Winamp si cel de la placa de sunet dar nu elimina complet frecventele nedorite ( se aud si acelea ca si cum nu face nici o filtrare ).

 

Frecventele care vreau sa fie filtrate sunt pentru urmatoarele filtre trece banda ( aici trec banda de trecere ):

canal 6: Fmin=990 - Fc=1020 - Fmax=1050 Hz

canal 4: 750 - Fc=780 - 810 Hz

canal 7: 1110 - Fc=1140 - 1170 Hz

canal 2: 510 - 540 - 570 Hz

canal 12: 1710 - 1740 - 1770 Hz

canal 15: 2070 - 2100 - 2130 Hz

canal 11: 1590 - 1620 - 1650 Hz

canal 9: 1350 - 1380 - 1410 Hz.

 

Sunt 8 filtre. Fiecare vreau sa le aplic separat si sa vad ca-mi iese banda modulata FSK ( 0 logic = Fmin, si Fmax pentru 1 logic ). Fc este frecventa centrala. Frecventele de mai sus ar trebui sa fie regasite in fisierul wav sheruit pentru ca sunt transmise pe o linie telefonica unde la receptie sunt filtre trece banda analogice ( cu condensatoare de mare precizie 1% si bobine cu ferita ) care lasa sa treaca doar benzile de mai sus ( filtre separate pentru diferite canale ). Vreau astfel sa-mi testez dsPICul daca ( aplicand la intrarea de la convertorul ADC cu filtrul antialiere fisierul wav de mai sus ) face corect filtrarea trece banda pentru diferitele canale indicate mai sus. Lucrez cu placa cu dsPIC ce are un CODEC si scoate fisierul prelucrat ( filtrat ) si care il introduc pe intrare in placa de sunet de la laptop si apoi acel fisier il testez in Matlab 7 sau Sound Forge. Am mare nevoie de acest lucru pentru teste. Placa demo cu dsPIC este dsPIC starter kit cu codul DM330011 de la Microcip pe care sa implementez analiza spectrala in timp real apoi filtrare trece banda apoi generare semnal filtrat.

 

As avea rugamintea sa postezi si secventele de cod ( comenzile ) pe care sa le dau in Matlab:

preluare fisier wav, comanda filtrului, afisarea si eventual salvarea in fisierul wav de iesire pentru

iesirea filtrului.

 

Va multumesc foarte mult ****

 

:smt103:

Link spre comentariu

Haha, ce misto suna.La inceput l-ai cam limitat si o sa sar peste partea aia.Pai imi propun sa fac cam asa: -Intai o sa-i fac un FFT, ca sa vedem cam ce e p-acolo si la ce distanta sunt componentele-Cu ocazia asta o sa vad si daca benzile date de tine se pupa cu realitatea din teren ;-)-Apoi o sa determin ochiometric ordinul filtrelor, ca sa atenueze macar 40dB frecv vecine.-Apoi o sa filtrez si mai vedem ce iese.-Daca e MA, poate extrag si datele ... dar asta e mai incolo. Intai sa vedem despre ce e vb in propozitie.Cred ca o sa fie distractiv.Cirip

Link spre comentariu

Pai da, domnule. Acum arata a modulatie si cred ca e FSK, asa cum spui.De asemenea, se vad spectrulete si in jurul purtatoarelor de care vorbeai.Tot spectrul pana la 22KHz, un prim zoom in de la 0 la 4.5KHz si un zoom pe axa y. Se pare ca spectrul de la 1K e cel mai tare, iar celelalte sunt cam lesinata, asa ca am schimbat scala, ca sa se vada si alea pricajite.post-879-139829323882_thumb.gifSpectre centrate pe cateva purtatoare de canalpost-879-139829323885_thumb.gifSi codul matlab. Nu l-am comentat, dar te descurci tu.wavul sa fie in directorul in care e si fisierul mirc2.mmirc2.zip

Link spre comentariu

Salut,Pentru putin.Uite inca o jucarie, dar ma cam opresc aici, ca mai am si eu treaba.Ti-am atasat un script matlab care face filtrare pe 3 benzi si iti scrie wavurile filtrate pe HDD. Nu am atasat si fisierele rezultate in urma filtrarii, ca sunt mari, dar le generezi tu. Inteleg ca ai matlab. O sa pun totusi caracteristicile filtrelor. Uite ...post-879-139829323912_thumb.gifIn scriptul matlab:fc este frecv centraladelta e largimea de banda intr-o singura parte. delta = 50 inseamna de fapt banda de 2*50=100Hz n_taps e nr de coeficienti ai filtrului. Eu am pus 1000, ca daca nu e in timp real, e de la Banu' Ghicat_start, t_stop e intervalul decupat din fisierul initial. Am ales intre secundele 20 - 30.mirc_filt.zipDemodularea o facem data viitoare :)Bafta la studiu!Cirip

Link spre comentariu

Frecventele pentru canal 6 ( frecventa centrala Fc=1020 Hz ) sunt cele mai mari pentru ca postul telecomandat pe aceste frecvente este cel mai apropiat. Urmand apoi Fc=780 si 540. Celelalte sunt si mai indepartate ( la zeci de Km ). :smt103:

Link spre comentariu

Am reusit sa fac filtrare FTB cu dsPIC33F in doua moduri: cu FFT si cu FIR.La filtrarea cu FFT am preluat la Fs = 8000 Hz ciclic N=256 esantioane de la ADC in mod DMA, apoi am aplicat FFT, apoi filtrarea cu fereastra unitara tinand cont ca rezolutia spectrului X(m) este (m*Fs)/N, apoi IFFT si redare prin PWM+FTJ. Urmeaza aici sa vad daca apare saturare la motorul DSP prin testarea bitilor SA si SB din registrul STATUS dupa calculul FFT.La a 2-a metoda am folosit softul dsPIC FD Lite cu care am introdus cerintele filtrului meu si care genereaza cei maxim 64 coeficienti. Am creat o structura de tip FIR, apoi am initializat ciclic vectorii de intarziere, apoi am a aplicat filtrarea FIR in mod ciclic a celor 256 esantioane de la ADC preluate prin DMA la Fs=8000 Hz. Apoi vectorul iesire din FIR l-am aplicat la modulul PWM+FTJ. Acum sunt in cautarea versiunii full pentru dsPIC FD care calculeaza mai mult decat 64 coeficienti pentru ca filtrarea sa fie mai fina. Cu FIR filtrarea se face in domeniul timp fara sa se faca conversia din timp in frecventa si invers ceea ce necesita o viteza de procesare mai mare. Procesorul lucreaza la 40 MHz. :dans: Fata de filtrarea cu FFT, filtrarea cu FIR produce un semnal filtrat mai curat cu amplitudine mai mare.Probabil, cum am mai spus, pentru ca filtrarea se face doar in domeniul timp fara trecere in domeniul frecventa si ia mai putine calcule. Daca inmultesc vectorul de iesire din IFFT cu o valoare scalara, oare nu reusesc prin asta sa amplific in soft semnalul filtrat care vine apoi aplicat la modulul PWM+FTJ ? Testarea filtrarilor am facut-o in MATLAB.Urmeaza sa lucrez si cu filtre IIR. :jytuiyu Pentru evitarea saturarii motorului DSP se aplica acea fractionare pentru intervalul [-0.5;+0.5] numita: "fractional fixed-point range [-0.5, +0.5]" ceruta de FFT, cred ca pentru evitarea saturarii registrilor acumulator A si B din motorul de calcul DSP. Aici fac o mica paranteza. Aici am o oarecare nelamurire. Ce inseamna practic saturarea unui registru acumulator de 40 biti ? Valorile esantioanelor de la ADC prin debugging le vad ca variaza intre -xx457 si +xx654 cu aproximatie. Acea fractionare a esantioanelor se face prin doua metode: prima metoda, prin scalarea ( inmultirea ) vectorului Hamming cu 0x4000 ( "0.5" !? ) si apoi inmultirea vectorului de intrare ( cu partile reale fiind valorile esantioanelor iar partile imaginare fiind toate zero ) cu vectorul Hamming rezultat si apoi FFT. A 2-a metoda pentru garantarea "fractional fixed-point range [-0.5, +0.5]" se realizeaza prin shiftarea cu o pozitie spre dreapta a adreselor esantioanelor ( partile reale ) din vectorul ce contine esantioanele SAU aplicarea bitreverse la aceste adrese. Aici, la a 2-a metoda nu se mai aplica fereastra Hamming. De ce ? Atasez in continuare codul sursa pentru metoda a 2-a. Eu am folosit-o pe prima. Poate cineva imi descifreaza mai exact ce se intampla acolo, etapa cu etapa, cu sigCmpx si p_real si p_cmpx. :jytuiyu

Link spre comentariu
Acum sunt in cautarea versiunii full pentru dsPIC FD care calculeaza mai mult decat 64 coeficienti pentru ca filtrarea sa fie mai fina.
Poti folosi Matlab sau excel ca sa-ti generezi cati coeficienti vrei. Si ce e aia "filtrare mai fina" ?

 

 

Daca inmultesc vectorul de iesire din IFFT cu o valoare scalara, oare nu reusesc prin asta sa amplific in soft semnalul filtrat care vine apoi aplicat la modulul PWM+FTJ ?
In general e bine sa eviti "amplificarea soft" pentru ca nu aduce informatie suplimentara. Raportul semnal zgomot ramane acelasi. Dintr-o sinusoida de 1V trebuie sa obtii tot 1V in FFT. Daca nu, ai borsit ceva coeficienti pe acolo.

 

Pentru evitarea saturarii motorului DSP se aplica acea fractionare pentru intervalul [-0.5;+0.5] numita: "fractional fixed-point range [-0.5, +0.5]" ceruta de FFT, cred ca pentru evitarea saturarii registrilor acumulator A si B din motorul de calcul DSP.
Nu. Fractional fixed point este pur si simplu o varianta de reprezentare a numerelor, care permite folosirea eficienta a hardwareului. Evitarea saturarii o faci tu ca programator.

 

Ce inseamna practic saturarea unui registru acumulator de 40 biti ?
Este posibil ca rezultatul unei operatii sa nu poata fi continut in 40 de biti. Hai sa zicem ca acumulatorul e de 4 biti. Domeniul maxim de valori care poate fi continut in 4 biti in reprezentarea complement al lui 2 este -4 ... +3. Daca ai deja +3 si aduni 2, ar trebui sa dea +5, numai ca +5 nu "intra" in 4 biti (3 plus semn). Daca ne tinem de conventia reprezentarii, +5, care arata 1001, e de fapt -3, pentru ca bitul de semn, care ar fi fost 0, a fost taiat si acum i-a luat locul 1-ul de la MSb. Daca pui pe DAC un salt de la +3 la -3, o sa sune ca un pocnet de amplitudine mare foarte deranjant. Asa ca, prin saturatie, se face desepelul sa se comporte ca un amplificator in limitare (saturatie) si care zice ca (+3)+2=(+3). Adica nu mai am unde sa ma duc, ca m-ai blocat in Vcc. Este mult mai natural si mai putin deranjant decat saltul de la +3 la -3.

 

Acea fractionare a esantioanelor se face prin doua metode: prima metoda, prin scalarea ( inmultirea ) vectorului Hamming cu 0x4000 ( "0.5" !? ) si apoi inmultirea vectorului de intrare ( cu partile reale fiind valorile esantioanelor iar partile imaginare fiind toate zero ) cu vectorul Hamming rezultat si apoi FFT.
Inmultirea cu fereastra Hamming are alt scop, nu evitarea saturatiei. Cauta pe wikipedia "windowing functions" si incearca mai multe. Uita-te cum se schimba caracteristica filtrului in fct de functia fereastra folosita, chiar daca nu schimbi coeficientii FIRului initial.

 

 

A 2-a metoda pentru garantarea "fractional fixed-point range [-0.5, +0.5]" se realizeaza prin shiftarea cu o pozitie spre dreapta a adreselor esantioanelor ( partile reale ) din vectorul ce contine esantioanele SAU aplicarea bitreverse la aceste adrese.
Usurel! Bit reversal este o tehnica legata de calculul FFT. Nu are legatura cu saturatia sau functia fereastra. FFT nu este altceva decat o metoda desteapta de calcul al DFT. Parte din desteptaciune este bit reversalul, care poate fi implementat eficient in hardware.
Link spre comentariu

De exemplu cei 64 coeficienti calculati cu dsPIC FD Lite inclusi in fisierul cu extensia *.s sunt in fisierul atasat. Sunt in format hexa pe 16 biti. Cum i-as putea calcula cu MATLAB ( mai mult de 64 adica pana la 256 ) ? Versiunea Lite imi calculeaza maxim 64. Am gasit si un manual de calcul la coeficienti FIR care ii calculeaza astfel: omega_c1 = Fmin/Fs omega_c2 = Fmax/Fs h[0] = (omega_c2-omega_c1)/pi h[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) 0 <= n < 256, pentru n = 256 esantioane, Fs = frecventa de esantionare. Fmin = frecventa de taiere minima la filtrul trece banda. Fmax = frecventa de taiere maxima la filtrul trece banda. Conform cu formulele din cartea: "Analog and Digital filter design" Second edition 2002 de Steve Winder. DAR valorile obtinute sunt 0,xxxx si - 0,xxxx care nu pot fi convertite in hexazecimal pe 16 biti. In fisierul ftb.s acesti 64 coeficienti dsPIC FD Lite mi i-a calculat pentru Fs=8000 Hz, riplu trece banda = 1, riplu banda rejectata = 3, Fcut-off1 = 970 Hz, Fpass1 = 990 Hz, Fpass2 = 1050 Hz, Fcut-off2 = 1070 Hz pentru filtru FIR trece banda cu fereastra Hamming. Ce formula sa aplic ca sa aflu acesti coeficienti fara sa apelez la dsPIC FD Lite, in MATLAB, cum ai zis ? Adica sa creez eu manual un fisier ftb.s adica sa-i calculez manual acei coeficienti convertiti in format hexazecimal pe 16 biti ?Daca nu apelez BitreverseComplex la vectorul iesire din FFTComplexIP, nu se mai reproduce nimic, adica iese un zgomot la iesire din PWM+FTJ. Functia BitreverseComplex trebuie s-o apelez intre FFTComplexIP si IFFTCompexIP, altfel daca n-o apelez nu mai scoate nimic la iesire din PWM+FTJ.Cum as putea evita in soft saturarea registrilor A si B din motorul de calcul DSP ? Eu am lucrat cu functiile FFT si IFFT gata implementate pentru dsPIC33F din libraria dsPIC30 adica FFTComplexIP si IFFTComplexIP si cele pentru vectori, initializarea Twiddlefactors, Hamming, si BitreverseComplex.Asta ar insemna sa adaug si eu imbunatatiri sau sa scriu cod asamblare, ... sau nu stiu ce. :jytuiyu

Link spre comentariu
De exemplu cei 64 coeficienti calculati cu dsPIC FD Lite inclusi in fisierul cu extensia *.s sunt in fisierul atasat.
Nu e nimic atasat. :)

 

Sunt in format hexa pe 16 biti. Cum i-as putea calcula cu MATLAB ( mai mult de 64 adica pana la 256 ) ?
Exact cu formulele din cartea mentionata si pe care le ai si in excelul pe care l-am postat in celalalt thread. Deci coeficientii pot fi calculati si cu excelul si cu matlabul. A, si excelul stie sa converteasca in hex.

 

DAR valorile obtinute sunt 0,xxxx si - 0,xxxx care nu pot fi convertite in hexazecimal pe 16 biti.
Serios? Ia incearca sa scrii in linia de comanda Matlab: help dec2hex :)
Link spre comentariu

Salut Cirip,

 

Scuze, il atasez acum exact asa cum este generat de dsPIC FD Lite: ( acolo liniile de asm de la

sfarsit sunt ca si comentariu - deci compilatorul le omite ). L-am facut txt, pt ca nu da voie sa atasez cu extensia s. ftb.s = ftb.txt.

 

In main1 este filtrarea cu FFT si IFFT.

 

In main2 este filtrarea cu FIR si structura FIR-ului este luata din ftb.txt. In ftb.txt apare aceeasi denumire _ftbFilter cu deosebirea ca in ftb.s apare si undersore "_" adica ftbFilter. Iar in main2.c apare doar ftbFilter.

 

main1.c si main2.c sunt versiuni din exemple modificate si adaptate la ceea ce vreau eu sa fac.

Partea de ADC si PWM am lasat-o acolo asa cum am gasit in exemplul demo venit cu placa dsPIC starter Kit. Eu am sters liniile cu inregistrarea, codarea, decodarea si am inserat liniile de cod din

alte exemple si le-am rulat cu succes pe placa demo cu dsPIC33FJ256GP506. Doar 2% din memoria de program si 15% din memoria RAM este ocupata dupa compilarea cu succes a lui main1.c si main2.c. Celelalte fisiere nu le-am inclus. Eu doar in main-uri am sters/modificat/inserat.

 

In main1.c urmatoarele linii de cod reprezinta eliminarea ( facand-ule zero ) valorilor din X(m) ( vectorul complex generat de FFTComplexIP ). Restul ( cele care vin in banda filtrata de mine nu sunt modificate/trecute in zero ) adica cele intre [60;69] nu sunt modificate:

 

for(i=0;i<60;i++)

{

inputSignal.real = 0x0000;

inputSignal.imag = 0x0000;

}

for(i=70;i

{

inputSignal.real = 0x0000;

inputSignal.imag = 0x0000;

}

 

Asa am facut filtrarea trece banda in main1. Valorile 60 si 70 le-am gasit calculand toate frecventele corespunzatoare termenilor complecsi din vectorul de iesire din FFT cu formula (m*Fs)/N. Aici am pus pus 60 si 70 pentru a vedea cu analiza spectrala in MATLAB ca "fereastra unitara" de selectie ( filtrare ) pe care am aplicat-o se deplaseaza spre dreapta si chiar se observa aceasta deplasare in MATLAB. Defapt frecventele pentru filtrarea FTB sunt [Fmin=990 Hz; Fmax=1050 Hz] ce le corespunde valorile [30;35] pe scala frecventelor din FFT.

 

Am incercat sa fac N=512 dar compilatorul nu ma lasa ( zice ca nu poate aloca memoria ) si-mi da urmatoarea eroare:

"main.o: Link Error: Could not allocate section _00e812a04ea3e6fb, size = 2048 bytes, attributes = bss dma

Link Error: Could not allocate data memory"

Ceea ce cred ca inseamna ca eroarea aceasta apare din cauza memoriei DMA limitate la 2K in RAM

pentru lucrul cu ADC si PWM. N-as renunta la DMA cand fac conversia ADC.

 

Am incercat sa maresc de la 256 la 512 pentru ca rezolutia (m*Fs)/N la FFT sa fie mai mare.

Frecventa de esantionare este Fs = 8000 Hz. Daca maresc Fs scade si rezolutia. Daca micsorez

Fs, nu mai respect criteriul lui Nyquist pentru ca frecventele filtrate sunt in intervalul [ 0.350 - 3.3 KHz ] adica in banda vocala.

 

Astept corectari, imbunatatiri la cod ***

 

:jytuiyu

ftb.txt

Link spre comentariu

De exemplu coeficientii filtrului FTB, h[n]FTB din fisierul excel de la tine "Dig_Noise_Filt_Elforum" din thread-ul celalalt au valori fractionale -0.xxxxxx si +0.xxxxxx. Iar in MATLAB dec2hex nu accepta decat valori intregi ( nu fractionale ) si pozitive pana la 2^52. Vreau sa calculez manual acei coeficienti din ftb.s generat de dsPIC FD Lite care sunt in hexazecimal 0xXXXX. Nu stiu cum ii calculeaza dsPIC FD Lite, cu ce formula. Cam asta este intrebarea. Eu aplic formulele de care am vorbit noi si care le-ai afisat si tu Cirip in thread-ul celalalt in fisierul excel de mai sus dar coeficientii calculati sunt de forma -0.xxxxxx si +0.xxxxxx pe cand dsPIC FD lite ii calculeaza in hexazecimal si ii include in fisierul ftb.s generat.

 

Cand am zis "filtrare mai fina" m-am referit la rezolutia FFT care este (m*Fs)/N.

 

Daca registrul A din motorul DSP are 40 biti asta inseamna ca prelucreaza intregi

de maxim 2^40 = 1099511627776 ( decimal ) = 10000000000 ( hex ). Dar operanzii din memoria Y si X din RAM au 16 biti si pot reprezenta valori intregi in zecimal pana la 2^16 = 65536 ( dec ) = 10000 ( hex ) adica mai exact de la 0x0000 - 0xFFFF.

 

Daca micsorez amplitudinea semnalului la intrarea in ADC, nu evit saturarea motorului DSP ? Cum as putea evita prin soft saturarea DSP ? Am inteles ca saturarea este un fenomen nedorit care poate conduce la calcule eronate. Ce linii de cod sa scriu ?

 

In dsPIC mai exact ce numere fractionale sunt incluse in tipul de data "fractional" cu care lucreaza ? Mai exact ce forma au si cum sunt reprezentate in registrii. M-am uitat putin pe datasheet dar deocamdata nu am inteles. Acum ma uit la: http://www.microchip.com/forums/m171019-print.aspx

pentru a intelege cum lucreaza dsPIC cu numere fractionale sau cu tipuri de data "fractional".

 

Formulele de mai sus pentru coeficientii filtrului FIR le-am luat din cartea "Analog and digital filter design" de Steve Winder la sectiunea 16.3 "FIR filter coefficient calculation".

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