Sari la conținut
ELFORUM - Forumul electronistilor

Cum sa incep cu DSP?


benishor

Postări Recomandate

Salut Cirip,

 

Am reusit sa identific si sa rezolv problema dupa ce mi-am dat seama ca pinii de DCI nu erau mapati conform arhitecturii mele hardware. De fapt nici nu stiu unde erau mapati by default si nu inteleg cum/daca merg exemplele de pe la microchip fara mapare explicita. In fine, bine ca am scos-o la capat.

 

Urmatorul pas este sa aplic o transformare (un filtru) pe semnalul de pe input, eventual adaugat DMA dupa. Sa vedem ce-o iesi. Ceva tips and tricks la capitolul asta izvorate din experienta? Ajunge sa folosesc sample-uri de 16 biti sau ar trebui ceva mai mult? Are sens batching?  

 

Multumesc!

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,

 

Pff, uitasem ca asignarea pinilor e configurabila. Nu am mai lucrat de ceva vreme cu dsPIC din cauza altor centre de interes si mi-ar fi luat ceva timp ca sa ma reintroduc in zeama de dsPIC. Bine ca i-ai dat de capat.

 

16 biti cred ca e suficient. In teorie, RSZ datorat zgomotului de cuantizare pe 16 biti e de peste 96dB la cap de scala. In realitate zgomotul benzii e mai mare de atat. Cand am facut filtrul ala am folosit 16 biti si mi s-a parut suficient. Testeaza si vezi cum ti se pare.

Atat DMA si "batching" (eu le ziceam buffere ping-pong) se pot folosi ptr. a degreva procesorul de treburi de genul muta piulitele din lada asta in lada cealalta. Procul tre' sa sape MACuri, nu sa mute esantioane. In plus, pinpongeala buferelor reduce latenta de intrare/iesire in/din intreruperi. Dar toate astea dupa ce merg filtrele, oscilatoarele si ce mai ai pe-acolo. Initial, poti sa procesezi si cate un esantion, pana capeti incredere ca algoritmul merge asa cum doresti.

 

Spor!

Link spre comentariu

Salut Cirip,

 

Hai c-am reusit si cu DMA-ul si bufferele ping-pong. Ramane sa incep cu filtrarea insa caut peste tot si nu gasesc softul de la Microchip, Filter Designer sau ceva de genul. Ai idee unde il pot obtine? Vad ca toate exemplele de filtre care folosesc DSP lib-ul de la Microchip sunt artefacte in assembler, generate de softul mai sus amintit. As vrea sa le generez de mana insa nu imi e clar ce tip de encoding este folosit la coeficienti. Ai idee cumva?

 

Multumesc!

Editat de benishor
Link spre comentariu

Am rezolvat problema si cu filtrele. Am plasat de mana coeficientii in C (dupa ce am scris un tool de generat fisiere .s ca Filter Designer din coeficienti generati de http://t-filter.engineerjs.com/). Mai ramane o problema; spuneai la un moment dat ca imi poti explica in ce mod pot genera un oscilator in dspic (pentru BFO). Help? :)

 

Multumesc!

Link spre comentariu

Salut @benishor,

 

Acum cativa ani am folosit compilatorul MPLAB C30, care vine cu o biblioteca de functii ptr dsPIC. Sunt scrise in asamblare si optimizate. Ca sa folosesti un filtru, trebuie sa ii dai coeficientii si sa ii creezi niste structuri. E totul explicat in manualul bibliotecii.

Recent au scos compilatorul XC16, care foloseste aceeasi biblioteca de functii. Biblioteca se instaleaza odata cu compilatorul.

Coeficientii ii calculez in Matlab si ii export in format Q15, formatul nativ al dsPICului. "Exportul" e de fapt o simpla formatare cu printf.

 

Sursa de inspiratie ptr oscilator este aici:  www.claysturner.com/dsp/1st_OSC_paper.pdf

De exemplu, relatia (3) arata ca esantioanele sinusului se pot calcula cu expresia: y(n+1) = k*y(n) - y(n-1), unde k = 2*cos(2*pi*f/fs), o constanta precalculata. Dupa cum se observa, o iteratie necesita o inmultire si o suma (in sens algebric), ambele reale.

Relatia asta recursiva, desi foarte simpla, are probleme de stabilitate a amplitudinii. In articol se arata si cum se poate implementa o bucla simpla de control automat al nivelului.

 

 

Link spre comentariu
  • 1 lună mai târziu...

Salut @cirip,

 

Multumesc pentru hintul cu sursa de inspiratie pentru oscilator. Am ajuns intr-un final sa ma folosesc de functiile librariei dsp scrise pentru xc16 si am ajuns la urmatorul rezultat: 

 

Treaba interesanta e ca functioneaza cum imi doresc insa codul pe care l-am scris efectiv nu se pupa cu teoria pe care am implementat-o inainte in softul pentru PC. Am scos si un matlab pentru "trial" si m-am apucat sa invat sa-l folosesc suficient cat sa incerc sa vad efectiv ce se intampla la fiecare pas al algoritmului. Mi-ar placea sa discutam putin pe marginea subiectului daca ai avea disponibilitatea, bineinteles.

 

Toate bune,

benishor

Editat de benishor
Link spre comentariu

Salut @benishor,

 

Ce pot sa spun decat: Super tare! Meserie de meserie! Ceea ce se aude e din antena?

Desigur, putem sa discutam, dar deja vad ca esti avansat bine de tot, asa ca nu prea imi dau seama cu ce te-as mai putea ajuta. Cred ca de-acum o sa fiu eu cel care intreaba ... :-)

 

Cirip

Editat de cirip
Link spre comentariu
  • 2 ani mai târziu...

Salut @cirip,

 

Un mic update dupa o gramada de timp: am renuntat rapid la microchip pentru ca devenea insuficient pentru chestiile pe care le aveam in cap si am migrat naiv catre un STM32F746 discovery board care are integrat un display mare cu touchscreen si un codec performant (WM8994). Asta a insemnat ca a trebuit sa o iau de la zero cu totul din nou, alta platforma, alt tool chain, alte marii cu alte palarii.

 

Am construit doua variatii de frontenduri IQ.

- primul experiment a folosit un AD8331 + AD8333 si mergea impresionant, exceptand faptul ca seara in 40 de metri aveam un overload destul de mare de la statiile de radiodifuziune din banda de 41 de metri

- am trecut apoi la o varianta destul de standard de Tayloe detector, varianta care pare mult mai rezistenta la disturbatori si la care m-am oprit momentan

 

Dau mai jos niste filmulete aratand diverse stadii din timpul experimentelor:

 

 

 

 

Am scris tot codul de la zero insa am mentinut versiunea de Weaver pe care am discutat-o noi in topicul asta. Multumesc inca o data! :)

Link spre comentariu
On 5/14/2021 at 6:32 PM, benishor said:

am renuntat rapid la microchip pentru ca devenea insuficient

Chiar si un PIC32 la 200 Mhz este insuficient ?
Am facut si eu ceva teste cu DSP. Fara aplicatie practica.
Si ceva incercari cu un Rasbperry Pi Pico (frumos si documentat microcontroller).




 

Editat de Vizitator
Link spre comentariu
La 14.05.2021 la 18:32, benishor a spus:

Un mic update [...]

 

Dau mai jos niste filmulete aratand diverse stadii din timpul experimentelor:

 

Am scris tot codul de la zero[...]

 

:aplauze

 

Felicitari, e chiar ceva deosebit... nu pot sa spun decat "jos palaria!".

 

 

 

La 14.07.2018 la 8:23, cirip a spus:

[...] nu prea imi dau seama cu ce te-as mai putea ajuta. Cred ca de-acum o sa fiu eu cel care intreaba ... :-)

 

Deja subiectul acum nu mai este "cum sa incep cu DSP", iar din cele de mai sus eu am asa o vaga impresie ca intrevazandu-se deja o finalitate foarte interesanta, majoritatea noastra a celorlalti o sa cam fim spectatori...

 

Link spre comentariu

@benishor

 

Super meserie de meserie!

Ai putut masura ceva sensibilitate, atenuarea canalului adiacent, chiar si un IP3?

FFTul si waterfall-ul le-ai scris de la zero sau exista functii disponibile intr-o biblioteca?

Ce mediu de programare (IDE) ai folosit?

 

Inca o data, felicitari!

Editat de cirip
Link spre comentariu

Salutare din nou si multumesc pentru aprecieri/comentarii, atat lui @Traian B cat si tie @cirip!

 

FFT-ul nu l-am scris eu de la zero, exista o librarie de dsp pentru arm-uri analoaga celei de la dspic, si anume CMSIS DSP library.

 

Waterfall-ul l-am scris de la zero folosind FFT-ul din librarie. Am facut niste optimizari de flow-uri in functie de tipul de demodulare aleasa, decimand pe cat posibil pentru a mari si SNR-ul si interpolez si spectrul corespunzator la afisare. La paleta de culori m-am inspirat de la altii.

 

Ca mediu de programare am ales sa merg pe mbed dat fiind faptul ca sunt incepator si nu eram pregatit sa iau taurul de coarne cu barebone metal programming. La capitolul IDE m-am luptat destul de mult sa ajung la un setup care sa imi placa; momentan lucrez cu CLion, un IDE de la Jetbrains.

 

Acum 11 ore, cirip a spus:

Ai putut masura ceva sensibilitate, atenuarea canalului adiacent, chiar si un IP3?

 

Sensibilitatea pe care am masurat-o in cazul primului prototip in care frontend-ul contine AD8331 + AD8333 este de -134dBm, MDS pentru un SNR de 3dB. Desigur ca "vinovat" de performanta asta este si AD8331-le care e fenomenal. Din pacate, cu tot ca l-am folosit si ca AGC, obtineam intermodulatii urate seara in banda de 40 de metri cand porneau statiile de radiodifuziune, intermodulatii care ajungeau sa imi calareasca DC-ul si imi stricau toata buna dispozitie. 

 

Dupa multe masuratori si stratageme am decis sa abandonez frontend-ul cu AD si sa trec pe Tayloe cum e descris aici http://www.norcalqrp.org/files/Tayloe_mixer_x3a.pdf.

 

In cazul celorlalti parametri (selectivitate, IP3, etc) am decis sa mai astept pana rezolv o alta problema legata de aparatura de masura pe care o detin; am un analizor de spectru HP70000 si doua generatoare de semnal HP8656B, vechi dar care isi fac treaba, buba cu ele este ca referintele nu sunt sincronizate asa ca am pus totul pe pauza si am luat-o cu un alt proiect adiacent, un standard de frecventa de 8 x 10MHz + 1 x 100MHz disciplinate prin GPS cu un modul uBlox. Din fericire sunt pe final cu proiectul asta, mai am de mosmondit pe la software, sa fac UI-ul mai aratos.

 

Odata ce termin cu asta, ma pot intoarce la receptor/transceiver pentru mai  multe masuratori calitative. Am in plan sa implementez si un simplu SINAD meter in software, sa ma ajute vizual cand fac tweak la varii parametri.

 

E mult de munca si de invatat, nu stiu intotdeauna ce fac insa e o calatorie frumoasa. Scopul e sa finalizez un transceiver pe care sa il folosesc in trafic si care sa depaseasca specificatiile FT-100D-ului din dotare.

 

Toate cele bune!

 

 

Link spre comentariu

@benishor
Din mixer
Tayloe ai intrat in ADC-ul uC ?
Poti pune te rog o schema bloc ? (aproximativa)
Din ce ai postat pana acum, nu esti departe de ceva industrial.
Felicitari domnule pentru realizare !
 

Link spre comentariu

Salut @Liviu.Mihaiu,

 

Din Tayloe mixer nu am intrat in ADC-ul uC-ului (din motive de rezolutie) ci in ADC-ul din CODEC-ul pe care il are placa STM32F746NG DISCOVERY on-board si anume un WM8994. Partea interesanta aici a fost legata de faptul ca mbed vine cu drivere default pentru board-ul mai sus amintit care sunt facute sa duca doar comunicare SAI pe 16 biti cu codecul. Si cum codecul este mai potent decat atat (24 bit), am vrut sa storc cat pot din codec pentru a maximiza dynamic range-ul. Asa ca a trebuit sa citesc datasheet-ul si sa modific driverele audio sa suporte sample depth de 24 biti; o experienta amuzanta/frustranta in sine.

 

Multumesc pentru felicitari, insa mai e mult pana la un produs finit.

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