Sari la conținut
ELFORUM - Forumul electronistilor

Cum sa incep cu DSP?


benishor

Postări Recomandate

Cand am zis "Mai multe despre fitru" ma refeream la mai multe detalii despre filtrul folosit: FIR vs IIR, ordin, coeficienti. Te-as ruga sa-mi trimiti coeficientii daca poti si am sa ma ocup eu de restul, urmand sa revin cu detalii despre rezultat.

 

Multumesc mult,

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,

 

Am mai prins niste ore sa lucrez la program si am facut un simulacru de radio. Am facut si cross-compile din linux in windows ca sa verific daca imi merge in wine. Demodulatorul poate fi gasit la http://hq.scene.ro/yo6ssw-demodulator.zip

 

Am mai bagat si doua filtre de CW ca sa testez un tool pe care l-am gasit pentru FIR design: http://t-filter.engineerjs.com/

 

Toate bune,

benishor

Link spre comentariu

Salut benishor,

 

Suna foarte bine. Felicitari!

Pai, de-acum inainte poti sa dai frau liber imaginatiei. Misiunea mea a cam luat sfarsit. :)

 

Eu am facut proiectarea filtrului folosind o functie din Matlab. Se poate proiecta si "manual", de la zero, dar e destul de laborios si nu merita efortul. Apa calda nu se inventeaza, ci se foloseste. Ca exercitiu didactic poate ca merita, dar subiectul e prea vast. Da pe gogu "fir design methods" si vezi ce iese. As mentiona doar ca pentru FIR am folosit cel mai des metoda ferestrelor si ocazional algoritmul Parks-McClellan. Ptr IIR am folosit numai transformarea biliniara. Toate merg.

 

Acum cativa ani am facut si eu un filtru audio cu caracteristici comutabile, care poate fi adaugat la un transceiver home made ptr imbunatatirea selectivitatii. Coeficientii sunt memorati in FLASH si ii schimbi ciclic printr-o apasare de buton. Scopul a fost sa fie foarte simplu de utilizat. Intre timp mi-am pierdut interesul si zace pe undeva. Uite-l postat aici: https://www.elforum.info/topic/61414-filtru-digital-dspic33f/?do=findComment&comment=630677 Intentia e sa-l adaptez candva la receptorul cu lampi si DDS postat la Proiecte Complexe, pe post de demodulator SSB. Dar si asta ... cand i-o veni randul.

 

Spor in continuare!

Cirip

 

Link spre comentariu

Salut tare din nou, Cirip,

 

Din pacate misiunea nu a luat sfarsit cu adevarat :) Jucandu-ma cu simulacrul de SDR radio, am constatat o problema comuna ambelor fisiere de input insa este mai usor de identificat in momentul in care se foloseste fisierul cw-iq.wav ca input. Cand fac tune prin banda intr-un singur sens (sa zicem ca cresc frecventa oscilatorului local digital), majoritatea semnalelor decodate apar in pass band cu o tonalitate inalta care scade odata cu cresterea frecventei oscilatorului local. Buba este ca alte semnale se comporta intr-un mod total opus, aparand in pass band cu o frecventa joasa care creste odata cu cresterea frecventei oscilatorului local. Nu inteleg fenomenul sau ce anume lipseste. Am verificat aceleasi fisiere cu WinRad si nu observ efectul mai sus mentionat, ceea ce inseamna ca e o buba de procedeu. Dar ce sa fie?

 

Fain proiectul acela cu filtru audio! Poti sa-mi dai mai multe detalii cumva? M-ar interesa detalii gen: cat de mare e pcb-ul dpdv fizic, ce rata de esantionare ai folosit, daca ai recomanda alt device in loc care sa simplifice treburile, etc. Am remarcat ca postul e din 2012 si ma gandeam ca poate de atunci au aparut alte dspic-uri mai compacte cu oscilator integrat si ADC-uri cu mai multi biti care sa reduca footprint-ul fizic. Eventual as aprecia si daca ai putea face share la surse; ma intereseaza in sine structura programului deoarece n-am mai pus mana pe vreun dspic pana acum.

 

Toate bune,

benishor

Link spre comentariu

Salut benishor,

 

"Dar ce sa fie?"

Eiii, aici incepe desepeala adevarata. Suspiciunea mea este in zona defazajelor. Iti propun sa adaugi un mic defazaj ajustabil fie la cosinus fie la sinus (nu la amandoua), apoi sa rulezi demodularea urmarind atenuarea semnalelor nedorite.

 

Conform teoriei, rejectia benzii laterale nedorite scade la 40dB (fata de suprimarea completa in cazul ideal) daca eroarea de faza este de 1.6 grade sau daca eroarea de amplitudine e de aprox. 1dB. 40dB este foarte putin si se aude. Sa presupunem ca fisierul wav are defazajul si amplitudinea corecte si ca eroarea provine din sin si cos din program. Dupa parerea mea este cea mai probabila cauza a acelor semnale care cresc in frecventa. Ajusteaza fin faza unuia dintre semnalele oscilatorului local si e posibil sa treci printr-un minim.

 

"proiectul acela cu filtru audio"

Dimensiunea placii este de 5x7.5cm. Povestea este mai lunga. Initial am folosit ADCul si DACul interne, dar ... nu merge sau mai exact merge nasol. Problema, cred eu, este cuplaj intern prin rezistenta finita a planului de masa de pe cipan.

 

Arhitectura programului este destul de complexa. Foloseste buffere ping-pong ptr procesare in timp real. In timp ce un buffer se goleste, celalalt se umple cu esantioane care trebuiesc procesate mai tarziu. In felul asta reduc latenta procesarii. Cand bufferul de receptie este plin, pun cainii (filtrul) pe el si il filtrez pe tot cat pot de repede. Problema e ca in momentul in care filtrez un bloc de 512 esantioane, nucleul DSP trage curent mare si apare zgomot la iesire chiar daca fortez toate esantioanele date DACului sa fie 0. Este un zgomot de 17Hz care se vede si in pozele din zip-ul atasat la postul ala. Dupa multa sapatura am ajuns la concluzia ca acei 17Hz sunt de fapt frecventa cu care schimba si procesez buferele alea. Am vazut si pulsurile de curent de pe alimentare sincrone cu inrush-ul asociat cu procesare completa a unui buffer intreg. Din pacate era deranjant la ureche.

 

Solutia? Codec extern. I-am pus un Si3000 si s-a linistit ca un mielusel. Mai mult, ca joaca am facut un receptor care asculta semnale din alea de ceas gen DCF77 sau WWVB. Ca sa nu folosesc un cristal de cuart ca filtru, am facut un filtru desepit cu banda ajustabila intre 4 si 20Hz. Cel mai bine a mers cu 6-8Hz.

 

Surse ... Hehehe... In general surse nu (mai) dau. Dau hexuri ocazional, dar nu surse. Sursele alea contin mii de linii de cod si sute de ore de munca si nu-mi convine sa le dau si sa ma mai trezesc si injurat. Ajut cu sectiuni de cod, explic intentia, teoria, dar cam atat.

 

As vrea sa te intreb si eu ce mediu de programare folosesti ptr PC? Pare ca e C++, dar sub ce IDE? Eu mai cochetez cu Python ptr. PC, dar cam atata. De fapt eu sunt sirmar, nu softist. Scriu soft doar ca hobi.

 

Cirip

Editat de cirip
Link spre comentariu
Salut Cirip,


"Suspiciunea mea este in zona defazajelor. Iti propun sa adaugi un mic defazaj ajustabil fie la cosinus fie la sinus (nu la amandoua), apoi sa rulezi demodularea urmarind atenuarea semnalelor nedorite."


Multumesc de idee. Am adaugat functionalitate de genul asta care sa-mi permita sa variez in pasi de 0.005 radiani (~0.2 grade) la runtime defazajul dintre sin(omega) si cos(omega) insa rezultatele nu au fost multumitoare. Nu am constatat nicio imbunatatire a supresiei benzii nedorite. Apoi am avut o revelatie: sansele sunt foarte mici sanse ca eroarea sa fie cauzata de sin/cos sau eroare de ampltitudine/faza in input intrucat in cazul acesta ar fi nevoie ca si WinRad sa fie calibrat "uman" pentru o detectie sanatoasa, fapt care nu se intampla. Cel mai probabil e vorba de algoritm in sine. Aparent ce am implementat este a treia metoda de demodulare SSB (Weaver) insa am niste indoieli cu privire la corectitudinea procedeului. Ramane sa mai studiez si voi reveni cu rezultate concrete.


"Surse ... Hehehe... In general surse nu (mai) dau. Dau hexuri ocazional, dar nu surse. Sursele alea contin mii de linii de cod si sute de ore de munca si nu-mi convine sa le dau si sa ma mai trezesc si injurat."


Ok, inteleg aspectul asta, cu toate ca ma intreb ce tipologie de oameni ar beneficia de surse si ar mai si injura. Este in regula, nu caut in mod deosebit cod ci mai mult informatii despre setup in sine. Codul mi-l scriu singur odata ce inteleg ce trebuie facut. M-ar fi interesat doar setup-ul de sistem: e sampling-ul condus de codec in sine sau on-demand de catre dsPic, DAC-ul la fel, etc?


"Foloseste buffere ping-pong ptr procesare in timp real. In timp ce un buffer se goleste, celalalt se umple cu esantioane care trebuiesc procesate mai tarziu."


In literatura de specialitate, tehnica asta se numeste double buffering. Este foarte faina doar ca poate introduce probleme de sincronizare in functie de context (pot aparea evenimente de write in timp ce te pregatesti sa schimbi bufferele intre ele). O alta abordare posibila (nu stiu daca are sens in contextul tau) ar fi cea a unui buffer circular (http://wiki.c2.com/?CircularBuffer) care ofera posibilitatea vitezei maxime de procesare cu lock-free-hassle: practic ai un buffer mare la care ai atasati doi pointeri care se dau "peste cap" cand ajung la margine. Unul este pointerul de write, iar celalalt este pointerul de read. Totul merge ok atat timp cat procesarea outputului tine pas cu rata de citire de la input, in caz contrar poti intra in the "spirala mortii" si sa pierzi date.



"Ajut cu sectiuni de cod, explic intentia, teoria, dar cam atat."


Mie-mi ajunge! De cand am trecut pe linux mi-am facut toata munca publica pe github. Am ajuns la concluzia ca sursele nu sunt atat de importante cat conceptele din spatele lor. Degeaba vad altii niste surse daca nu inteleg domeniul de lucru si sirul de ganduri care a dus la acea forma specifica a codului. Revenind, daca ma poti ajuta cu intentia/teoria imi este mai mult decat suficient.


Ca sa dau un exemplu palpabil, as vrea sa creez o platforma hardware care sa imi permita sa lucrez la problema de mai sus (demodulare/filtrare) pentru un transceiver fara sa retusez multe prin hardware. Am inteles din relatarile tale ca e nitel cam nasol cu folosirea ADC-ului/DAC-ului intern ale dsPic-ului, astfel ca un codec extern ajuta. Ce ma intereseaza pe mine e sa obtin un modul hardware cu 2 input-uri cu ADC de 16 bits si un output cu DAC de 12-16 biti care sa fie programabil. Data fiind experienta ta in domeniu, consider ca platforma pe care ai abordat-o pentru filtrul in cauza poate fi cam ce am nevoie, exceptand faptul ca nu stiu daca Si3000 ofera posibilitatea de stereo line input sampling. Sunt interesat in proiectarea/obtinerea unei astfel de platforme cu minimul necesar pe care sa o pot folosi ulterior pentru modulare/demodulare+filtrare. Aici as avea nevoie de ajutor intrucat stiu destule incat sa stiu ca nu stiu detaliile necesare pentru a proiecta o astfel de platforma din punct de vedere hardware. Crezi ca ma poti ajuta?


"As vrea sa te intreb si eu ce mediu de programare folosesti ptr PC? Pare ca e C++, dar sub ce IDE? Eu mai cochetez cu Python ptr. PC, dar cam atata. De fapt eu sunt sirmar, nu softist. Scriu soft doar ca hobi."


Raspunsul standard este "depinde" si anume de mai multi factori printre care: limbajul de programare folosit, platforma tinta, tipul de proiect (proof-of-concept sau ceva mai serios), environmentul in care dezvolt (local/remote), etc.


De cativa ani am facut drop la windows si am migrat pe linux. Tranzitia a fost usor dureroasa la inceput insa apoi nu m-am mai uitat in urma deloc. Pentru un programator, linux e minunat in ceea ce ofera. Asta m-a determinat sa incep sa folosesc doar tool-uri cross-platform si free pe cat posibil dat fiind faptul ca migram intre platforme (windows,linux,osx) odata cu mediul (acasa, munca, remote, etc).


De regula pentru limbajele C/C++, Java, Go, web (php, js, html) si Python folosesc editoare din suita JetBrains care sunt incredibil de puternice la detectia semantica si ofera functionalitati super faine de refactoring. In cazul C++ (limbaj pe care l-ai identificat corect din surse) mai iau in calcul si platforma tinta de dezvoltare: daca vreau sa scriu cod cat mai portabil pe Windows/Linux/Osx, folosesc CLion (IDE-ul de la JetBrains pentru C++ https://www.jetbrains.com/clion/specials/clion/clion.html); daca folosesc librarii Qt atunci folosesc IDE-ul dedicat de la Qt si anume QtCreator (https://www.qt.io/ide/). Daca lucrez la ceva specific Windows, atunci trebuie sa recurg la Visual Studio. In cazul in care scriu teste mici sau chestii rapide, folosesc un editor simplu de text gen Sublime Text (https://www.sublimetext.com/) sau vim si scriu Makefile-uri de mana sau apelez compilatorul/linkerul din linie de comanda. Pentru CLion exista disponibil si un plugin care il transforma intr-un Arduino IDE (https://plugins.jetbrains.com/plugin/7889-arduino)


C/C++ e destul de portabil ca limbaj in sine, pana ajungi la diferente de OS in privinta integrarii cu perifericele, unde intervine durerea (sunet, video, filesystem, networking).


Spuneai ca scrii mai mult python: pentru python, editorul dedicat de la JetBrains este PyCharm (https://www.jetbrains.com/pycharm/specials/pycharm/pycharm.html). Recomand cu caldura IDE-urile de la JetBrains pentru orice limbaj suportat.


Toate bune,

benishor

Editat de benishor
Link spre comentariu

Salut benishor,

Multumesc ptr comentariile detaliate. Domnule, ce sa zic? Sunt impresionat de zonele SW pe care le acoperi. Probabil ca din asta iti castigi si cozonacul, altfel e greu sa acoperi atatea.

"Weaver"
Interesant. Nu am folosit Weaver ptr ca necesita doua oscilatoare complexe (cos +j*sin). Pot sa fac o chestie ca sa te ajut cu depanarea algoritmului. Pot sa generez un fisier wav cu un singur ton la o frecventa oarecare, pe care sa incerci sa il demodulezi. Apoi se poate analiza rezultatul demodularii si in special rejectia imaginii. Analiza o poti face cu un fft pe wavul rezultat sau postezi wavul, analizez si eu si comparam rezultatele.

"setup-ul de sistem"
Da. Samplingul e condus de periferic, oricare ar fi el, codec sau DAC. Am incercat sa lucrez si cu DMA si cu timer. Cel mai rezonabil a fost cand perifericul este master. Nu imi mai amintesc exact ce dificultati am intampinat in celelalte configuratii. Probabil ca a fost si o combinatie de comoditate, posibilitatile modulului DCI din dsPIC si "las' ca merge si-asa". Odata ce a pornit, l-am lasat asa.

"double buffering"
OK, chestie de nomenclatura. Eu am vazut tehnica denumita si ping-pong, m-a amuzat si mi-am insusit-o, mai ales ca in hardware double buffering inseamna altceva. E o tehnica de evitare a metastabilitatii cand se traverseaza domenii conduse de clockuri diferite.
Sunt familiar si cu buferele circulare. dsPICul poate sa faca asa ceva prin adresare de tip modulo.
Nu am avut probleme de sincronizare. dsPICul executa numai aplicatia scrisa, nu are sistem de operare, deci nu prea apar evenimente surpriza. Am avut o problema cu un glitch, care aparea la tranzitia dintre buffere, dar s-a dovedit a fi o eroare de program. Calculam incorect un pointer si depasea bufferul.

"intentia, teoria"
In masura in care stiu, discutam, desi am impresia ca esti mult mai avansat decat mine. Ai prins o gramada de chestii din zbor si foarte rapid, asa ca ...

Si3000 nu este stereo si e si limitat dpdv al ratei de esantionare. E declarat ca voice codec si merge la maxim 12Ksps. In schimb are cateva amplificatoare cu castig variabil si ceva optiuni configurabile. Placa demo de la Microchip il foloseste, asa ca m-am orientat si eu catre el.

"IDEuri"
Eu am apucat sa instalez acum multi ani pluginul de Python in Eclipse si ptr ca a servit scopul, nu l-am mai schimbat. Nu fac upgrade de dragul upgrade-ului. Am auzit de PyCharm, dar nu l-am instalat. De exemplu, am incercat sa invat Android. Mi se pare extrem de complicat si cel mai descurajant este ca au schimbat mediul de dezvoltare de n ori, proiectele vechi nu se mai compileaza, tutorialele nu se mai potrivesc. Nici macar exemplele lor nu functioneaza. Pe scurt: o varza! Poate ca o sa spui ca e simplu: trebuie doar sa schimbi aia. Dar, dar ptr un incepator trebuie sa mearga reteta la cheie. Iar Java cu toate miile de pagini de biblioteci este un cosmar. Asa ca, atata timp cat merge si serveste scopul, voi ramane pe Eclipse ptr Python.
Cat despre linux, a spune ca nu suntem chiar buni prieteni e o modalitate dietetica de exprimare. Desi il folosesc ocazional, mi se pare extrem de neprietenos, mai ales ptr novici. Trebuie sa petreci ore in sir ca sa afli cum se face chestia x. Ptr mine calculatorul este o unealta, nu un scop in sine. Cunosc zicala ca linux isi alege prietenii, dar nu ma impresioneaza. In fine ...

Spor la treaba si ramanem in legatura,
Cirip

Editat de cirip
Link spre comentariu
  • 2 săptămâni mai târziu...
Salut Cirip,


Scuze de delay-ul asta mare. Am fost off o perioada.


"Probabil ca din asta iti castigi si cozonacul, altfel e greu sa acoperi atatea."

Cozonac si pasiune. De fapt pasiune care a dus ulterior la cozonac, dar ma rog.


"Pot sa fac o chestie ca sa te ajut cu depanarea algoritmului. Pot sa generez un fisier wav cu un singur ton la o frecventa oarecare, pe care sa incerci sa il demodulezi. Apoi se poate analiza rezultatul demodularii si in special rejectia imaginii. Analiza o poti face cu un fft pe wavul rezultat sau postezi wavul, analizez si eu si comparam rezultatele."


Asta ar fi o chestie faina. Ce-am mai incercat intre timp a fost o reiterare a metodei cu FFT: practic am pus sample-urile IQ intr-un buffer, am facut un FFT, am selectat bin-urile corespunzatoare frecventei si latimii de banda de care sunt interesat (doar din frecventele pozitive) si le-am shiftat centrandu-le in jurul bin-ului cu tonul pe care doresc sa-l obtin cand demodulez CW (600Hz sa zicem) dupa care am facut 0 restul de bin-uri (inclusiv cele ale frecventelor negative). Apoi am facut un IFFT, scalare si am luat componenta reala ca fiind sample-ul de audio.


Chestia asta a dat rezultatul asteptat, in sensul ca facand "tune" prin banda nu am mai intalnit imaginea semnalelor CW. Buba e ca e destul de anevoios de lucrat asa si e nevoie de un FFT cu un size considerabil ca sa poti avea bin-urile cat mai granulare. M-ar interesa sa obtin acelasi efect printr-un procedeu in domeniul timp.


Intre timp am reusit sa obtin transformata Hilbert tot prin FFT -> 0 frecventele negative -> IFFT insa banuiesc ca trebuie sa existe si o versiune pentru domeniul timp.


Dupa inca o perioada de sapat, am ajuns la concluzia ca fisierele respective sunt nitel busite si nu contin chiar semnale in cuadratura cum ma asteptam.


"In masura in care stiu, discutam"


Perfect! M-am mai uitat prin jur si am devenit convins de faptul ca vreau sa folosesc WM8731 drept codec, configurat ca master pentru dsPic. Pasul urmator ar fi sa proiectez un circuit cu minimul necesar pentru a interfata codecul mai sus amintit cu un dsPic, folosing DCI pe cat posibil. Ai vreo idee daca pot gasi inspiratie pe undeva sau ce anume ar trebui sa citesc pentru a ajunge la ce am descris mai sus?


Multumesc mult,

benishor
Link spre comentariu

Salut benishor,

 

Nema problema. E hobi, asa ca nu avem termene.

 

Iaca un fisier care contine 2 tonuri. Unul e la -5KHz si altul e la 11KHz. Puritatea spectrala e bezmetica. Fefeteul arata un palier de zgomot mai bun de -200dB. Pe masa obtii asa ceva doar in vise. Daca demodularea cu ifft merge, nu ar trebui sa apara alte componente in afara celor doua.

I si Q sunt in cele doua canale stereo.

post-174676-0-81013500-1505423428_thumb.jpg

beni_1.zip

 

"am facut un IFFT, scalare si am luat componenta reala"

Nu cred ca este corect. Daca Transformata Fourier (TF) este nesimetrica, atunci semnalul in timp este musai complex. Selectand numai partea reala, ai alterat spectrul, iar TF a noului semnal devine simetrica (simetrie para pe amplitudine si impara pe faza) si diferita de TF pe care ai aplicat ifft. Daca nu ar fi asa, ar fi violata teorema de unicitate a perechilor f(t) <-> F(omega). Aplica inapoi fft numai pe partea reala si o sa vezi ca nu mai obtii spectrul de la care ai plecat. :)

 

Spor!

Cirip

 

Editat de cirip
Link spre comentariu

Salut Cirip,

Multumesc pentru fisierul generat. Demodularea se comporta in modul urmator: in functie de banda laterala aleasa, un ton se "aude" si celalalt nu. Mai concret, in momentul in care aleg LSB demodulatorul ignora frecventele pozitive, iar cand aleg USB, le ignora pe cele negative. Singura problema pe care o mai am consta in faptul ca aud si imaginile semnalelor.

Ce vreau sa spun este ca luand ca referinta semnalul de la -5KHz, daca setez banda demodulata LSB si frecventa oscilatorului de purtatoare la 4500Hz, obtin un ton de 500Hz. Continuand sa cresc frecventa purtatoarei, frecventa semnalului demodulat scade pana ajunge la 0 beat (LO=5KHz), dupa care incepe sa creasca. Setand LO=5.5KHz, obtin acelasi ton de 500Hz, aidoma unui receptor sincrodina, exceptand faptul ca semnalele cu frecvente de semn opus sunt ignorate.

Asteptarea mea era ca dupa demodulare sa raman doar cu o laterala a semnalului. Ceva idei in privinta asta?

In al doilea rand, am mai citit printre picaturi cate ceva despre dsPIC33F si codecul ales (WM8731) si m-am pus sa incropesc o platforma hardware care sa-mi permita sa experimentez cu demodularea. Dat fiind faptul ca nu am mai folosit nici de unele nici de altele pana acum, te-as ruga sa arunci un ochi cand/daca poti peste schema din atasament si sa faci un review; mai mult ca sigur am scapat chestii din cauza lipsei de experienta. Pe scurt m-am gandit sa folosesc codec-ul ca master la DCI, line in ca IQ input si headphones ca audio output.

Device-urile pe care le-am selectat la prima strigare sunt dsPIC33FJ128GP202 si WM8731. Samplerate-ul pe care sunt chitit ar fi de 32KHz. Planul initial ar fi sa obtin o placa rudimentara cu dsp-ul si codec-ul pe ea, sa verific ca pot programa dsp-ul apoi sa vad ca pot interfata device-urile corect intre ele, facand un dummy echo-ing de la line-in la output, trecand prin dsp.

Printre motivele pentru care am selectat modelul respectiv de dsPic se enumera:

  • resursele (128K flash, 16K ram) care imi permit sa ma "intind" ulterior, extinzand functionalitatea
  • este recunoscut de pickit2 (am incercat sa instalez suita MPLAB pe linux insa lasa de dorit suportul de linux asa ca intentionez sa compilez cumva intr-un vm sau ceva de genul si sa uploadez din terminal cu o clona pickit2 pe care o am)


Am ramas un pic in dubii daca sa folosesc si DMA sau nu; nu m-am documentat asupra subiectului insa am vazut referinte la subiect in documentatia microchip (adica DCI simplu si DCI + DMA). Tu ce parere ai?

Alt aspect pe care nu il inteleg este urmatorul: care ar fi structura programului dsp? Initializarea hardware-ului, scrierea handlerelor de intreruperi care dau/iau date si apoi ...? unde sa fac procesarea efectiva? in main() sau in codul din ISR?

 

Link catre schema (pentru ca spre rusinea mea ma bate la fundul gol interfata editorului WYSIWYG din forum si nu stiu cum sa atasez fisiere): https://hq.scene.ro/dsp-and-codec.pdf


Multumesc,

benishor

 

L.E: nu am folosit demodularea cu FFT/IFFT ci cea initiala din time domain. Evident ca daca arunc la gunoi o portiune din spectru in Z, la intoarcere in S nu mai am cum sa am aceleasi date, exceptand poate cazul in care spectrul era simetric (ceea ce nu e, din moment ce vorbim de IQ). Multumesc de completari :)

Editat de benishor
Link spre comentariu

Salut benishor,

"in momentul in care aleg LSB demodulatorul ignora frecventele pozitive,[...]"
Nu inteleg definitia operatorului "ignora" :) Ai doua fluxuri de date, I si Q. Cum "ignora"? Le da cu flit? :92 Poti sa postezi o schema bloc a procesului de demodulare?

"Ceva idei in privinta asta?"
Oscilatorul de purtatoare este real sau complex? O schema bloc ar clarifica situatia.

"Schema"
Uite cateva comentarii pe schema. In plus, eu as adauga un stabilizator local de 3.3V, pe placa. Or mai fi si alte gaini, dar astea mi-au sarit in ochi asa pe viteza.
post-174676-0-60164600-1506041829_thumb.png

"unde sa fac procesarea efectiva?"
Aici e chestie de preferinta personala sau ce permite sistemul. Personal prefer sa ies cat mai repede din intrerupere, asa ca procesez in main() pe baza unor semafoare care indica buffer plin/gol, procesat/neprocesat. De fapt, daca procesezi buffere, garantat primesti cateva intreruperi pana termini de procesat. De exemplu, daca esti in intrerupere si nu lucrezi cu prioritati, e posibil sa ratezi daca la intrare in intrerupere au fost dezactivate global. In general stau cu un singur nivel, ca sa nu mototolesc stiva.

Cam asta ...
Cirip


Editat de cirip
Link spre comentariu

Salut Cirip,

 

Pentru a edifica mai simplu problema pe care o intampin am facut un filmulet: https://www.youtube.com/watch?v=Wz-Sy3udlEk

Ce nu e ok acolo e ca mi-as fi dorit ca fiecare semnal sa aiba o singura "imagine" de o anumita parte a purtatoarei.

 

"Oscilatorul de purtatoare este real sau complex? O schema bloc ar clarifica situatia."

 

Am facut o poza cu ce anume implementeaza demodulatorul. demodulare.png

 

 

"In plus, eu as adauga un stabilizator local de 3.3V, pe placa"

 

E o idee buna; vroiam sa adaug insa nu cunosc "standardele" in categoria asta. Ai cumva vreun hint despre stabilizatoare decente cu un zgomot redus?

 

Dioda de la MCLR/Vpp nu am pus-o deoarece nu m-am gandit ca o sa programez placa cu circuitul alimentat. Mai degraba ma vedeam testand placa cu alimentare data din programator (pickit2 clone). Insa sugestia este binevenita si o dioda nu costa cine stie ce.

 

In cea ce priveste separarile CC la line-in recunosc ca le-am lasat in aer pentru ca nu stiam cum sa calculez valorile dorite si ma gandeam ca acolo o sa vina un semnal shiftat cu un DC offset. La output nu prea am scuze.

 

"De exemplu, daca esti in intrerupere si nu lucrezi cu prioritati, e posibil sa ratezi daca la intrare in intrerupere au fost dezactivate global. In general stau cu un singur nivel, ca sa nu mototolesc stiva."

 

Stiu ca am mai discutat despre faptul ca nu (mai) dai surse, insa ma poti ghida cumva catre un exemplu existent de setup de genul asta pe internet?

 

Toate bune,

benishor

Editat de benishor
Link spre comentariu

Salut benishor,

 

Am vazut filmul, am chibzuit un pic si cred ca demodularea este incorecta. Asta o include pe cea facuta de mine si care este reflectata de algoritmul pe care l-ai postat. Ca sa vezi ce importanta e poza cu schema bloc a procesarii. Deocamdata, pana cand nu e lamurit algoritmul, nici nu mi-as bate capul cu chestii de genul arhitectura codului. Pana una-alta algoritmul e in plopi.

 

Cred ca ceea ce am facut amandoi nu e nici Weaver, nici phasing. E de fapt o strutocamila care nu merge. Uite de unde rezulta ca nu are cum sa mearga:

post-174676-0-94311500-1506228999_thumb.png

 

Inainte de a propune ceva functional, trebuie sa mai sap si eu un pic. Cred ca avem urmatoarele cai de rezolvare:

(Ordinea este la intamplare)

1)Weaver cinstit. Ptr asta sunt fundamentale filtrul cu banda pe jumatate si oscilatorul pe frecventa=banda/2

2)Phasing, dar asta cere implementarea unui transformator Hilbert. Ti-l pot proiecta eu ca FIR, dar va trebui adaugata pe ramura cealalta o linie de intarziere egala cu timpul de intarziere de grup (GD) al transformatorului Hilbert. GD in esantioane este egal cu jumatate din nr de prize ale Hilbertului.

3)Filtrare. In cazul asta se va lucra cu o frecventa intermediara joasa, dar probabil ca va trebui marita rata de esantionare prin interpolare, altfel va fi greu de realizat oscilatorul BFO.

 

Ai vreo preferinta intre cele 3 de mai sus? Ca sa stiu in ce directie sa sap.

 

Cirip

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