Sari la conținut
ELFORUM - Forumul electronistilor

Cum sa incep cu DSP?


Postări Recomandate

Salutare,


Lucrez la un proiect personal, un transceiver de unde scurte si m-ar bate gandul sa incerc sa fac demodulatorul (AM, SSB, CW) cu niste hardware embedded ca sa am un footprint fizic cat mai mic. Semnalele de intrare ar fi in faza si cuadratura, aduse in baseband (cu un IF de ~160Hz ca sa nu am purtatoarea la DC).


Problema e ca nu am mai pus mana pe niciun hw DSP si nu stiu ce device sa aleg sau la ce criterii de selectie ar trebui sa fiu atent. M-ar putea ajuta cineva cu niste informatii? De asemenea, nu inteleg cum imi pot configura un anumit sample rate: imi pun un timer si execut toata procesarea in interrupt handler?


Multumesc mult!

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

Top autori în acest subiect

Top autori în acest subiect

Salut,

Dar ce se intampla daca purtatoarea e la DC?

 

Salut Cirip,

 

Teoretic nu se intampla nimic, insa nu stiu daca e chiar ok sa folosesti un mixer RF la output DC. Chiar daca din punct de vedere matematic e ok sa ai purtatoarea la DC, practic e posibil sa ai offset-uri de DC care sa aiba un impact. Alt motiv impotriva 0 IF ar fi faptul ca LO-ul poate emite radiatii care sunt re-captate de antena ceea ce va conduce la 'surzirea' receptorului.

 

Insa nu vorbesc din experienta. As aprecia orice input concret pe marginea problemei. Intre timp incerc sa scriu codul necesar demodularii pe PC, urmand sa-l portez la o data ulterioara pe un device dedicat dsp. Momentan ma lupt cu demodularea SSB, neavand o idee clara de cum sa introduc digital un phase shift de 90 de grade intre canalele I si Q.

 

Toate bune!

Link spre comentariu

"nu stiu daca e chiar ok sa folosesti un mixer RF la output DC"
Depinde de mixer si de cum este conectat. Ce fel de mixer ai? Inel cu diode, Gilbert, Tayloe, altceva ...?

 

"e posibil sa ai offset-uri de DC care sa aiba un impact"
Depinde. Daca chiar te deranjeaza, un filtru trece sus sau chiar si un trece banda in calea de semnal, aliniaza bine mersi semnalul pe DC=0. Oricum ar trebui sa ai ceva trece banda, ca sa limitezi spectrul vocal si sa ai selectivitate.

 

"LO-ul poate emite radiatii care sunt re-captate de antena "
Iarasi depinde. Daca ar fi asa de grav, nicio sincrodina nu ar mai functiona.

 

"cum sa introduc digital un phase shift de 90 de grade intre canalele I si Q"
Daca sunt I si Q, deja e acolo defazajul. In primul post zici: "Semnalele de intrare ar fi in faza si cuadratura", deci inteleg ca le ai deja. Daca nu, adica daca semnalul e real si vrei sa-l faci analitic, doua idei imi vin in minte: 1)Transformare Hilbert de banda ingusta (cam scump dpdv al procesarii) sau 2)Treci semnalul prin doua filtre FIR dintre care al doilea e o copie a primului, dar care are functia pondere inmultita cu un e^(j*omega*phi) sau asa ceva. In cazul al doilea, defazajul absolut poate sa varieze, dar diferenta de faza este mentinuta la 90 de grade.

 

Mai da ceva detalii si vedem ce se mai poate face. O schema bloc a jucariei ar face un pic de lumina, chiar daca e ceva incipient.

 

Cirip

Editat de cirip
Link spre comentariu
Salut,


Scuze de intarzierea cu care dau reply insa am un copil mic si sunt destul de fragmentat :) La primele trei puncte nu cred ca mai are sens sa insist. O lamurire in ceea ce priveste ultimul punct (cel legat de defazajul de 90 de grade intre I si Q): il vroiam nu pentru demodulare ci pentru modulare.


Calea pentru receptie:


- LNA cu control al castigului

- filtru BPF

- primul mixer cu LO in pasi de 10Hz (DBDM cu ceva IP mai mare care sa converteasca la un IF la care inca trebuie sa ma hotarasc)

- filtru IF

- mixer IQ

- LPF cu opamp cu cutoff de aproximativ 6KHz

- demodulare cu DSP


Intentia mea originala era sa fac un transceiver CW only insa apoi m-am intrebat ce-ar fi sa experimentez si cu DSP si m-am gandit ca daca tot o ard cu DSP as putea sa-l folosesc si pentru modulare.


Pe scurt, ce-am incercat pana acum sa fac a fost sa vad daca pot scrie un program pe PC care sa demoduleze un fisier cu o inregistrare IQ gasit pe net. Asa as capata mai multe cunostinte despre domeniul asta DSP in sine si-as avea o idee cat de cat mai buna despre ce chip caut.


- am descarcat un fisier wav ce contine ~1min de intregistrare IQ a unei bucati din banda de 20m (sectiunea SSB)

- am descarcat WinRad (http://www.winrad.org/) si-am folosit fisierul descarcat anterior ca si sursa IQ. Am validat faptul ca fisierul este in regula si contine transmisii SSB ok intr-un interval de vreo 24KHz.

- am scris un program care sa citeasca fisierul anterior, sa demoduleze o transmisiune de la un anumit offset (carrier) si sa scrie rezultatul in alt fisier wav.


Problema consta in faptul ca desi procesarea se intampla, ea nu da chiar rezultatele scontate, ceea ce implica faptul ca imi scapa detalii sau nu inteleg pe deplin procesul de demodulare SSBSC.



As aprecia daca te-ai putea putin peste cod si sa-mi spui daca remarci ceva suspect. Am cate nelamuriri pe-acolo, gen:

- ce amplitudine sa folosesc la carrier?

- cum sa convertesc rezultatul de la IFFT la audio? (am impresia ca real + imag nu e abordarea corecta)

- etc


Toate bune,

benishor


P.S: e amuzant, scos din context: "cirip si benishor discuta rf si dsp"
Link spre comentariu

Nicio problema cu intarzierea. Sa-ti traiasca copilutul, sa fie sanatos!

 

"ce amplitudine sa folosesc la carrier?"

Nu prea conteaza. Variatiile de amplitudine ale purtatorului conduc la variatii de castig ale lantului de procesare.

In principiu trebuie sa te incadrezi intre 2 limite. Cea de sus e data de limita de saturatie a variabilelor. De exemplu, daca reprezinti ca intreg pe 16 biti cu semn si rezultatul depaseste 2^15-1, apar distorsiuni. Limita de jos e data de scaderea raportului semnal zgomot ptr ca nu folosesti toata gama dinamica a variabilelor.

 

"cum sa convertesc rezultatul de la IFFT la audio?"

Ai doua metode: "Overlap and add" sau "Overlap and save". Ambele sunt metode relativ complicate de a calcula convolutia circulara in domeniul frecventa ptr ca apoi sa revii in timp. Din pacate, ptr blocuri scurte de date, apare aliasul in timp, care nu e usor de eliminat. Convolutia circulara este echivalenta cu cea liniara numai in interiorul blocului de date. La capete apar probleme, care trebuiesc rezolvate separat. Wikipedia explica ambele metode.

 

"etc."

samd ... :)

 

Intrebarea mea e de ce faci filtrarea in domeniul frecventa, prin "stergerea" (le faci egale cu 0) binurilor FFTului si revenire in timp cu iFFT? De ce nu faci convolutie cinstita in domeniul timp?

 

Si mai e ceva. Imi este greu sa urmaresc codul fara sa stiu exact ce algoritm incearca sa execute acel cod. In general, cand scriu ceva desepeala, imi fac un model mathematic curat, fara restrictii de limbaj si alte cele. Dupa ce merge, il implementez in cod. Ptr modelare folosesc Matlab, dar se poate si cu Octave (Matlabul open source) sau Excel (Matlabul saracului).

 

Poti sa postezi aici sau un link la fisierul ala IQ de test? As vrea sa ma uit si eu la el.

 

A, inca ceva. Este extrem de scump dpdv al procesarii sa folosesti functiile sin si cos la runtime. Daca ai nevoie de un oscillator local digital, sunt alte metode, care se rezuma la executia recursiva a unei ecuatii care contine doar adunari si inmultiri.

Editat de cirip
Link spre comentariu

Multumesc de urari! Sanatate si liniste la toata lumea!

 

Intrebarea mea e de ce faci filtrarea in domeniul frecventa, prin "stergerea" (le faci egale cu 0) binurilor FFTului si revenire in timp cu iFFT? De ce nu faci convolutie cinstita in domeniul timp?

La mine e vorba de convenienta si lipsa de know-how. De formare sunt programator; nu am training formal in inginerie electrica sau dsp, sunt doar un simplu amator entuziast si mi se pare mai usor sa fac filtrarea in frequency domain. In time domain banuiesc ca ar fi nevoie de ales o anumita topologie de filtru si calculat coeficienti, chestiuni pe care nu vreau sa-mi irosesc resursele in acest moment, cand vreau doar sa validez algoritmii de demodulare in mare. De cand am vorbit am mai modificat programul sa execute inclusiv downmix-ul in frequency domain shiftand binurile in baseband si facand zero restul de bin-uri; fft-ul devine si mai convenabil in situatia asta.

 

Scopul e sa validez inainte intregul proces pe PC si abia apoi sa recurg la portare pe DSP si eventualele optimizari (make it run, make it right, make it fast).

 

 

Poti sa postezi aici sau un link la fisierul ala IQ de test? As vrea sa ma uit si eu la el

 

Desigur, fisierul este disponibil impreuna cu rezultatul procesarii in acelasi repository pe github.

Fisierul IQ: https://github.com/benishor/yo6ssw-trx/blob/master/code/data/ssb-iq.wav?raw=true

Outputul demodularii defectuoase: https://github.com/benishor/yo6ssw-trx/blob/master/code/data/demodulation-output.wav?raw=true

 

Pentru a intelege mai bine ce ar trebui sa obtin, poti incerca sa folosesti fisierul IQ ca input la WinRad (http://www.winrad.org/)

 

Si mai e ceva. Imi este greu sa urmaresc codul fara sa stiu exact ce algoritm incearca sa execute acel cod. In general, cand scriu ceva desepeala, imi fac un model mathematic curat, fara restrictii de limbaj si alte cele. Dupa ce merge, il implementez in cod. Ptr modelare folosesc Matlab, dar se poate si cu Octave (Matlabul open source) sau Excel (Matlabul saracului).

 

Multumesc de sugestie, am instalat Octave insa sunt putin mai lent in modele matematice dat fiind faptul ca nu am trainingul formal de care vorbeam mai sus si tot ce inteleg vine din ce am studiat din varii surse.

 

Algoritmul pe care incearca sa-l implementeze programul e pur si simplu sa mapeze input-ul IQ din domeniul de signed short [-32767, 32767] in cel de [-1, 1] doubles pe care apoi le interpreteaza ca numere complexe.

 

Umplu FFT bin-urile cu acele numere complexe rezultate din interpretarea sample-urilor fisierului wav luat ca input (I este canalul stang iar Q cel drept), fac un FFT, apoi incerc sa elimin din FFT bins tot ce nu imi foloseste si sa las doar componentele transmisiunii care ma intereseaza.

 

Dupa ce fac procesarea de mai sus fac un IFFT pentru a ma intoarce in time domain si o scalare (deoarece codul de FFT pe care il folosesc nu o face). Aici intervine o alta problema: nu stiu cum anume sa interpretez output-ul IFFT-ul ca si audio samples: componenta reala? suma dintre reala si imaginara? magnitudinea point-ului complex?

 

A, inca ceva. Este extrem de scump dpdv al procesarii sa folosesti functiile sin si cos la runtime. Daca ai nevoie de un oscillator local digital, sunt alte metode, care se rezuma la executia recursiva a unei ecuatii care contine doar adunari si inmultiri.

 

Multumesc de sugestie, am vazut cate ceva prin arhive la harmony central prin tinerete cand incercam sa scriu un softsynth VST. Dupa cum spuneam, la versiunea incipienta de demodulare pe PC nu ma intereseaza performanta ci validarea intelegerii domeniului in sine. Mai intai sa mearga si sa inteleg ce fac, apoi il facem rapid :)

 

 

Multumesc mult,

benishor

Link spre comentariu

Salut benishor,

 

Uite un link la care am pus doua canale la intamplare, pe care le-am demodulat cu Matlabul, folosind cod scris la repezeala si aplicat pe fisierul ssb-iq.wav. Sunt mai multe conversatii acolo, dar am luat ceva care mi s-a parut ca suna mai bine la ureche.

 

https://www.dropbox.com/s/kzzied7upiqsoln/benishor_elforum.zip?dl=0

 

Uite si cum arata spectrul semnalului.

post-174676-0-28680200-1504331123_thumb.jpg

 

Revenind la modalitatea aparent intuitiva pe care vrei sa o aplici la demodulare, nu prea cred ca merge. Desepeala e cu multa matematica si, in cele mai multe cazuri, nu e deloc intuitiva. Te-ai uitat pe vreo carte de desepeala? Sunt cateva clasice. Cea mai digerabila este a lui Rick Lyons, apoi urmeaza "bibliile" lui Oppenhaim si Schaffer si a lui Proakis. Mai e una a lui Steven Smith, dar e la nivel de popularizare. Nu prea se poate face ceva practic. Dar cand incepi e foarte buna, ca e mai pe inteles si mai e si moka pe net.

 

Ptr ceeea ce vrei sa faci as zice ca e important sa intelegi Transformata Fourier complexa, ptr ca lucrezi cu I si Q si proprietatile acesteia. Practic eu am lucrat numai in timp si am folosit cateva dintre proprietatile transformatei.

 

Astept impresii, apoi mai dezbatem.

Cirip

Link spre comentariu

Salut Cirip,

 

Felicitari, demodularea suna a ceea ce vreau sa realizez! Presupun ca WinRad mai face diferite imbunatatiri pe ici colo legate de signal clean up, agc si posibil alte cele de suna asa bine. Spectrul arata bine. Ce FFT size ai folosit? Deasemenea, ai facut cumva un fftshift pe acolo? Nu de alta insa vad DC-ul la mijloc.

 

Relativ la cartile de DSP, multumesc pentru enumerarea resurselor impamantenite; stiu la ce pot recurge in caz de nevoie. Am dat recent de una mai solida a lui R. Lyons pe Amazon. De R. Lyons am dat pe dsprelated.com cautand detalii despre SSB phasing method https://www.dsprelated.com/showarticle/176.php. Cartea (understanding dsp) e nitel cam scumpa pentru buzunarul meu de hobbist asa ca am sa caut alte surse.

 

Ptr ceeea ce vrei sa faci as zice ca e important sa intelegi Transformata Fourier complexa, ptr ca lucrezi cu I si Q si proprietatile acesteia. Practic eu am lucrat numai in timp si am folosit cateva dintre proprietatile transformatei.

 

Transformata Fourier complexa am aplicat-o si eu in programul pe care l-am scris. Nu am scris o implementare proprie pentru ca nu ma intereseaza momentan acest nivel de detaliu ci am tratat-o ca un black box. Poti sa-mi spui cumva ce procedeu de demodulare ai folosit si de ce nu ar merge ce-am incercat sa fac intuitiv? M-am uitat la cuprinsul cartii si chiar daca sunt familiar cu o parte din conceptele de acolo nu stiu ce ar trebui sa stiu pentru a-mi da seama ce gresesc. Sper ca ma poti lumina.

 

Multumesc mult,

benishor

Link spre comentariu

Salut benishor,

 

"Presupun ca WinRad..."

Habar n-am. Nu l-am descarcat. Codul meu e foarte simplu. Nici pomeneala de AGC sau alte briz-brizuri.

 

"Ce FFT size ai folosit? Deasemenea, ai facut cumva un fftshift pe acolo?"

Dimensiunea blocului FFT a fost variabila. Scopul e numai vizual. Nu am demodulat cu FFT.

Da, am facut fftshift, ptr ca semnalul este complex, ceea ce duce la o transformata nesimetrica. Prin urmare, zona frecventelor negative nu este redundanta. Acolo e alta informatie, care trebuie afisata.

 

"Poti sa-mi spui cumva ce procedeu de demodulare ai folosit si de ce nu ar merge ce-am incercat sa fac intuitiv?"

Desigur. Am aplicat exact schema bloc din articolul citat de tine, cu deosebirea ca procesarea am inceput-o dupa primul defazor de 90 de grade, ptr ca am deja I si Q. Am facut asa: am inmultit I cu cos(omega*t), am inmultit Q cu sin(omega*t), am insumat si apoi am filtrat cu un filtru 300-2700Hz. Apoi am scris rezultatul pe disc ca wav si l-am ascultat cu un player de wav. Spilul e sa alegi omega, ptr ca valoarea lui omega iti translateaza spectrul in asa fel incat sa aduci semnalul pe care vrei sa il demodulezi in banda de trecere a filtrului. Odata ce ai pus la punct programul, da valori lui omega si ruleaza din nou. daca dai pasi mici de, sa zicem 1KHz, o sa auzi ca atunci cand dai de butonul de acord al transceiverului. De exemplu, ca sa aduci spectrul de la 15KHz la 300Hz, omega devine 14.7KHz. Mai ajustezi fin la ureche.

Atentie la banda laterala. S-ar putea ca suma produselor I*cos()+Q*sin() sa trebuiasca sa fie diferenta, pentru a inversa spectrul. dar asta o faci iarasi la ureche.

Daca doresti, pot sa iti dau valorile coeficientilor filtrului. Trebuie facuta o convolutie, dar nu e complicat. Iti dau detalii daca doresti, desi cred ca se gaseste pe net cod de convolutie. E o simpla suma de produse.

 

De ce nu merge intuitiv? Hm, ar trebui sa ma uit cu atentie la cod, dar asta ia timp. In esenta raspunsul este in metodele alea overlap-add sau overlap-save. Daca nu aplici exact ce rezulta din analiza celor doua metode, apar aliasuri, care in fond inseamna distorsiuni. De asemenea, nu stiu daca ai folosit toata transformata sau numai jumatate. Daca transformata e nesimetrica, la revenirea in timp rezulta un semnal complex, pe care nu stiu cum il putem asculta. In fine. Eu iti propun sa incerci procesare numai in timp si sa vezi ce iese.

 

Spor!

Cirip

 

Link spre comentariu

Buna Cirip,

 

Mulțumesc mult pentru detalii. Am sa incerc si eu procesare in timp sa vad ce imi iese. Crezi ca imi poti sa mai multe detalii despre filtru te rog? Žncă nu am ajuns la capitolele de filter design. FFT era incitant prin prisma faptului că puteam sa aplic orice tip de filtru cu cost constant.

 

Sunt curios ce o să imi iasa.

 

Toate bune,

benishor

Link spre comentariu

Pai, e greu de spus pe scurt despre filtre intr-un post pe forum. Sunt capitole intregi. Pot totusi sa spun ca e un FIR trece banda, 300-2700Hz, cu 101 coeficienti calculati ptr rata de esantionare de 48KHz. Metode de proiectare sunt mai multe. Una dintre ele este metoda invariantei impulsului. Dar nu as intra in detalii de proiectare. Daca doresti, iti trimit coeficientii si iti propun sa te concentrezi pe calculul convolutiei, adica filtrarea pr. zisa.

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