Sari la conținut
ELFORUM - Forumul electronistilor

Cum sa incep cu DSP?


benishor

Postări Recomandate

Salut Cirip,

 

Sunt total de acord ca demodularea este incorecta. Nu am vreo preferinta intre metodele enumerate mai sus exceptand poate phasing curat (2) sau Weaver (1). Dintre cele doua as selecta metoda mai usoara din punct de vedere al procesarii; phasing cere un FIR pentru Hilbert + delay pe cealalta ramura pe cand la Weaver nu sunt sigur, mie imi suna a ceea ce am implementat deja insa se poate sa ma insel.

 

In concluzie as zice sa vedem cum iese cu metoda phasing (https://www.dsprelated.com/showarticle/176.php).

 

Toate bune,

benishor

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

Top autori în acest subiect

  • benishor

    30

  • cirip

    24

  • nico_2010

    1

  • gsabac

    1

Top autori în acest subiect

Salut benishor,

 

Hai ca m-am ouat o chestie care se pare ca merge. Pana la urma am facut ceva derivat din Weaver, diferenta fiind aceea ca intrarea e complexa, nu reala ca la Weaverul traditional. Presupun ca ai la dispozitie o biblioteca de operatii cu numere complexe. Daca nu, pentru fiecare multiplicare complexa sunt necesare 4 multiplicari si 4 adunari reale pentru ca (a+jb)*(c+jd) = (ac-bd)+j(ad+bc).

 

post-174676-0-30669300-1506545066_thumb.png

Etapele, asa cum se vede si in schema bloc, ar fi cam asa:

-Iei canalele stanga si dreapta si le combini astfel incat fiecare esantion sa devina complex. Ceva de genul x_cplx=x_stg+j*x_dreapta

-Generezi un oscilator local complex de forma LO_cplx=exp(j*omega_LO*t)=cos(omega_LO*t) + j*sin(omega_LO*t). Gama de frecvente va fi de la -24 la +24KHz. Asta va fi butonul de acord

-Multiplici complex x_cplx cu LO_cplx.

-Separi partile reala si cea imaginara ale rezultatului multiplicarii si le treci individual prin cate un filtru trece jos. Filtrele sunt identice. O sa-ti dau coeficientii mai incolo.

-Generezi un al doilea oscilator local complex. Asta e un fel de BFO, dar nu e chiar BFO. De aia l-am pus in ghilimele. Asta oscileaza pe 1500Hz si sta batut in cuie. De fapt poate sa fie +1500Hz sau -1500Hz in functie de banda laterala pe care vrei sa o demodulezi

-Inmultesti iesirea filtrului de pe ramura reala cu partea reala a BFO-ului

-Inmultesti iesirea filtrului de pe ramura imaginara cu partea imaginara a BFO-ului

-Insumezi rezultatele celor doua multiplicari si alea sunt esantioanele audio ale semnalului demodulat.

 

Nu ar trebui sa mai apara imagine. Am testat pe fisierul ala care contine -5KHz si +11KHz si miorlaiala se duce intr-o singura directie. Nu mai apare imaginea.

Zi-mi intai daca e clar si dupa aia iti dau si filtrul.

 

Uite cum suna demodularea tonului de la 11KHz cu baleierea oscilatorului local (acordul) de la 9 la 14KHz.

weaver3.zip

 

Cirip

Editat de cirip
Link spre comentariu

Salut Cirip,

 

Multumesc pentru efortul depus! Am inteles si imi sunt clari pasii aplicati. Suna destul de bine, desi cred ca mai e loc de improvement pe undeva, relativ la cat anume se suprima imaginea nedorita. Iata cum arata spectrograma fisierului, generata cu spek (http://spek.cc): https://hq.scene.ro/weaver-spectrogram.png (a se vedea dupa trecerea prin 0 beat).

 

M-as fi asteptat in mod normal ca supresia imaginii sa fie cat mai aproape de ideal dat fiind faptul ca fisierul sursa contine semnale cu SNR deosebit. Poate trebuie umblat pe la filtre sau amplitudinile oscilatoarelor.

 

Crezi ca imi poti da te rog coeficientii pentru filtrul folosit?

 

Multumesc,

benishor

Link spre comentariu

Salut benishor,

 

"M-as fi asteptat in mod normal ca supresia imaginii sa fie cat mai aproape de ideal"

 

Un filtru ideal are nr. infinit de coeficienti si precizie de reprezentare a coeficientilor infinita (numere reale). Filtrul folosit are 101 si are caracteristica amplitudine frecventa de mai jos.

post-174676-0-47553600-1506693780_thumb.jpg

Dupa cum se observa, atenuarea in banda de oprire e de cel putin 53dB. Chestia asta se vede si din analiza spectrala facuta de tine. Mai mult, se vede si riplul din banda de oprire. La maxim semnalul are -20dB, iar pe varful riplului in banda de oprire are cam -80dB, asa pe ochiometreala la culoare. Asta face o atenuare de fo 60dB in banda de oprire.

 

Se poate mari nr de coeficienti pana cand ajungem la o atenuare de x dB, dar perfecta nu are cum sa fie din cel putin doua motive:

-functia pondere a filtrului ideal este trunchiata, adica folosim un nr. finit de coeficienti

-reprezentarea numerica a valorilor coeficientilor are si ea precizie finita.

Chestiile de mai sus nu iau in considerare imperfectiunile de implementare.

 

Propunerea mea e sa incerci sa implementezi cu filtrul asta, apoi marim numarul de prize si vedem care e limita tolerabila. De asemenea, marind nr. de prize va creste intarzierea prin sistem. La o anumita valoare poate deveni deranjant.

 

Coeficientii:

beni_ftj_101taps.txt

 

Spor!

Editat de cirip
Link spre comentariu

Salut Cirip,

 

Ei da, asa mai merge! Rezultatele se pot vedea aici: https://youtu.be/AjILLMvH-H0

Acum intrebare intrebatoare: cand ai facut design la filtru ce parametri ai folosit? Se leaga cumva de frecventa "BFO"-ului sau nu? De asemenea, ma intreb ce impact ar avea asupra procesarii transformarea lui intr-un BPF in loc de LPF, ca sa excludem si o portiune din semnalele de "jos".

 

Apropos, am facut o mica modificare. Ca sa schimb laterala demodulata nu mai inversez semnul frecventei "BFO"-ului ci inlocuiesc ultimul pas al sumatorului din I + Q in I - Q. Nu am facut calculele riguros insa auditiv da bine, adica "la fel" si e mai convenabil la procesare.

 

Multumesc,

benishor

Link spre comentariu

Salut benishor,

 

Poti sa postezi niscai demodulare de voce? Nu de alta, dar filtrul postat e ptr voce, 300-2700Hz si e normal sa se auda mai multe semnale telegrafice. Dupa aia comentez celelalte intrebari si observatii.

 

Cirip

Link spre comentariu

Salut Cirip,

 

Desigur, uite un sample: https://youtu.be/PG-lQ1Nz_wk

Am mai uitat un detaliu care nu apare in diagrama bloc de procesare dar care se poate vedea in filmuletul de mai sus: semnalul final il trec prin niste filtre LPF/BPF in functie de filtrul ales (SSB, CW-1, CW-2). Problema la care ma refeream nu era ca se aud mai multe semnale telegrafice folosind filtrul SSB, e normal; problema era ca baleind frecventa oscilatorului principal in jurul unui semnal telegrafic, se aude cum ajunge la 0 beat apoi, trecand in cealalta laterala, se aude totusi o frantura din imagine. Lucrul ala e vizibil si mai sus in spectograma. Ma gandeam ca s-ar putea remedia acest aspect umbland nitel la filtrul folosit dupa multiplicarea complexa cu primul oscilator.

 

Toate bune,

benishor

Link spre comentariu

Salut benishor,

 

Da domnule, suna bine. Pai sa mergem mai departe ...

 

"cand ai facut design la filtru ce parametri ai folosit? Se leaga cumva de frecventa "BFO"-ului sau nu?"

Se leaga si nu prea. Conform metodei Weaver, frecventa "BFOului" trebuie sa fie in mijlocul spectrului receptionat. Ptr un spectru vocal de 3K, mijlocul e la 1.5K.

 

"De asemenea, ma intreb ce impact ar avea asupra procesarii transformarea lui intr-un BPF in loc de LPF, ca sa excludem si o portiune din semnalele de "jos"."

Cred ca impactul ar fi ca nu va mai functiona. Metoda Weaver necesita un FTJ, nu FTB.

 

"nu mai inversez semnul frecventei "BFO"-ului ci inlocuiesc ultimul pas al sumatorului din I + Q in I - Q"

:) Haha! Pai e exact acelasi lucru, ptr ca cos(x)=cos(-x) (functie cu simetrie para), iar sin(x) = -sin(-x) (functie cu simetrie impara). Calculand sin(2*pi*1500*t) si schimband semnul, de fapt ai calculat sin(-2*pi*1500*t).

 

"se aude cum ajunge la 0 beat apoi, trecand in cealalta laterala, se aude totusi o frantura"

Ti-am postat un nou filtru. L-am lasat sa aiba 1dB de riplu in banda de trecere si de banii astia i-am cerut 80dB atenuare in banda de oprire. Dar a vrut 387 de coeficienti. Asta e. Branza e gratis numai in cursa de soareci.

post-174676-0-43703600-1507232728_thumb.jpg

beni_ftj387_taps.txt

Nu ar trebui sa mai auzi frantura ...

 

"il trec prin niste filtre LPF/BPF in functie de filtrul ales (SSB, CW-1, CW-2)"

E okei daca ai resurse nelimitate de procesare, dar in esenta consumi cicli de procesor cam inutil. Filtrarea ar trebui sa fie suficienta la nivelul FTJului.

 

Mai astept niste mostre auditive si chiar o spectrograma cu noul filtru.

Cirip

Editat de cirip
Link spre comentariu

Salut Cirip,

 

Felicitari, al naibii filtru :) Face treaba buna!

 

Mostre:

 

a) Am folosit fisierul tau generat anterior (beni_1.wav) care contine un ton la -11KHz si altul la 5KHz si am facut un sweep al purtatoarei de la ~3KHz la ~7KHz. Rezultatul audio poate fi accesat aici: https://hq.scene.ro/audio-sweep-new-filter-cirip.wav iar spectrograma la https://hq.scene.ro/audio-sweep-new-filter-cirip.png. Se poate vedea cu ochiul liber ca nu mai apare "buba" cu imaginea. Well done!

 

b) Un sweep mai lent al purtatoarei de la ~2KHz la ~6.3KHz folosind ca input fisierul cw-iq.wav. Rezultatul audio se poate gasi la: https://hq.scene.ro/audio-sweep-new-filter-cirip-cw.wav iar spectrograma aferenta la https://hq.scene.ro/audio-sweep-new-filter-cirip-cw.png

 

Mentionez ca nu am mai folosit vreun filtru suplimentar de data aceasta. Rezultatele sunt "curate", folosind iesirea algoritmului descris mai sus.

 

O alta intrebare intrebatoare: la transceiverul la care lucrez as dori sa las utilizatorul posibilitatea sa selecteze frecventa preferata a tonului morse precum si cea a selectarii unui filtru FTB centrat in jurul ei cu largimea de banda selectabila dintr-un set predefinit. Ai vreo idee cum s-ar putea realiza asta la un mod cat mai simplist?

 

Multumesc,

benishor

Editat de benishor
Link spre comentariu

Salut benishor,

 

Mmm, miam, slurp! Ce frumos suna. Dar pune te rog si ceva voce si zaboveste un pic pe demodularea respectiva, sa auza urechea si sa se umple de desfatare :dans: :101

 

"sa las utilizatorul posibilitatea sa selecteze frecventa preferata a tonului morse precum si cea a selectarii unui filtru FTB centrat in jurul ei"

Mda. Pai o sa-ti trimit si un filtru de telegrafie. Schimbarea tonului o s-o faci din frecventa ultimului oscilator, adica din acel BFO. E posibil sa creasca nr. de coeficienti necesar la filtrul de telegrafie ca sa obtin tot 80dB atenuare, dar asta e.

Editat de cirip
Link spre comentariu

Salut benishor,

 

Uite si un filtru de telegrafie. A trebuit sa mai relaxez un pic atenuarea, ca altfel iesea cu peste 1000 de coeficienti. Mai sunt optiuni sa iasa cu mai putini coefciienti, dar se complica. In esenta trebuie facuta decimare, ptr ca e raportul prea mare intre frecventa de esantionare si frecventa de taiere a FTJ.

Tonul va fi dat de valoarea BFOului. Daca pui BFO de 1KHz, o sa se auda semnal telegrafic cu tonalitatea de 1K.

post-174676-0-39129100-1507665540_thumb.jpg

beni_FTJ_685_taps_CW.txt

 

Astept wavuri atat cu telegrafie cat si cu voce.

 

Spor!

 

Link spre comentariu

Salut Cirip,

 

Decat sa dau wav-uri pentru auditie SSB mai bine dau binarul compilat pentru windows sa te joci in voie pe care il poti gasi la https://hq.scene.ro/yo6ssw-demodulator-2.zip . Asta e versiunea fara filtrul de telegrafie.

In README.md poti gasi o descriere a tastelor folosite pentru tuning/volum/etc.

 

Am sa ma joc si cu filtrul de telegrafie si revin cu alt binar. Oricum, asta este doar un loc de joaca si de test pe PC al algoritmilor ca pregatire pentru dsPIC. M-am hotarat ca la dsPic sa merg cu samplerate de 8KHz intrucat e suficient pentru AM/SSB/CW si cel mai probabil primul oscilator din diagrama de mai sus va fi cu o frecventa fixa deoarece tuning-ul il voi face din VFO. Asa ca in punctul respectiv voi avea din nou nevoie de expertiza ta pentru a regenera filtrele cu samplerate-ul dorit. In prima instanta m-am gandit sa ofer cate doua filtre pentru fiecare tip de emisiune: SSB wide/narrow si CW wide/narrow.

 

Multumesc pentru toate si revin cu updates,

benishor

Link spre comentariu
  • 7 luni mai târziu...

Salut Cirip,

 

Long time no see. Iaca am reusit sa prind niste timp printre crescut copil si muncit si am continuat lucrul la jucaria mai sus amintita (DSP + Codec pentru demodulare SSB). Intre timp am refacut nitel PCB-ul si l-am trimis in China la facut. Am fost multumit de prima experienta de genul. Am lipit apoi dsPIC-ul impreuna cu suportul necesar programarii si am scris un mic programel care sa faca blink la un led sa testez toolchain-ul.

 

Am lipit apoi codecul impreuna cu restul componentelor si m-am apucat de programare. Merge destul de greu dat fiind faptul ca sunt majoritatea chestii noi pentru mine si am multe de citit/inteles. Targetul actual este sa reusesc sa configurez toata sandramaua sa-mi citeasca de pe LINE IN, sa duca la dsp care mai apoi sa le trimita inapoi pentru codec output, adica un soi de echo.

 

O poza cu ce-a iesit pana acum: https://imgur.com/a/wYweWfT

 

Buba e ca desi am citit documentatia de x ori, nu reusesc sa configurez DSP-ul sa-mi genereze DCI interrupt. M-ai putea ajuta cumva cu un hint? Codec-ul e WM8731 si il configurez ca I2S master care serveste toate clockurile aferente I2S dsp-ului.

 

Toate bune!

Link spre comentariu

Salut benishor,

 

Din pacate nu am niciun hint. Ca sa am, ar trebui sa incerc eu sa configurez si sa testez desepicul, altfel ar fi doar presupuneri. In plus, nu am lucrat cu codecul WM8731.

Pot sa-ti sugerez, in caz ca nu ai facut-o deja, sa citesti nu numai foaia de catalog, dar si documentul dedicat interfetei DCI si poate chiar note de aplicatie cu exemple de configurare.

De asemenea, eu m-as ajuta si de un osciloscop, ca sa verific daca se genereaza intr-adevar semnalele necesare.

 

Bafta!

Link spre comentariu

Salut Cirip,

 

Am citit atat documentul dedicat interfetei DCI cat si cel al codecului. Ideea de baza este ca nu reusesc sa configurez desepicul ca I2S slave folosind DCI (simplu, fara DMA la inceput) astfel incat sa-mi faca trigger la DCI interrupt si ma intrebam daca e vreo problema bine stiuta de mod de configurare. Am osciloscop si l-am folosit pentru a verifica existenta CSCK si COFS validand ca sunt generate corespunzator. 

 

DSP-ul il configurez ca sclav ceva de genul:


 

DCICON1bits.CSCKD = 1;
DCICON1bits.CSCKE = 1;
DCICON1bits.COFSD = 1; 
DCICON1bits.UNFM = 0; 
DCICON1bits.CSDOM = 0;
DCICON1bits.DJST = 0; 
DCICON1bits.COFSM = 1;


DCICON2bits.BLEN = 1; 
DCICON2bits.COFSG = 0;
DCICON2bits.WS = 15;

DCICON3 = 0;

TSCONbits.TSE0 = 1;
RSCONbits.RSE0 = 1;

TXBUF0 = 0;
TXBUF1 = 0;

DCICON1bits.DCIEN = 1;

_DCIIF = 0;
_DCIIE = 1;

Ce urmaresc e sa il fac sa comunice OK cu codecul stereo astfel incat sa primesc si sa trimit sample-uri de 16bit, stereo. Aparent sunt chestii destul de confuze prin manual, mai ales pe la detalii gen configurare DCICON2 pentru cazul mai sus amintit (la I2S aparent COFSG trebuie pus jumatate fata de normal). Intr-un final ma intereseaza doar sa stiu ca cineva a reusit sa configureze un dsPIC drept I2S slave prin DCI si a functionat, in rest depinde de mine.


Insa imi dau seama ca e greu ceea ce cer asa ca voi reveni cu alte intrebari mai high level dupa ce reusesc sa trec de hopul asta.

 

Toate bune!

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