Sari la conținut
ELFORUM - Forumul electronistilor

cum schimb referinta la un semnal ?


mircang9

Postări Recomandate

Salut,La 8KHz, 60000 de esantioane trec in 7.5 secunde, adica un fleac dpdv practic. Asta inseamna ca ai un regim tranzitoriu de aprox. 7 secunde. E foarte normal, ptr ca timpul de crestere este invers proportional cu banda filtrului. Filtrul fiind foarte ingust, ca sa extraga numai componenta continua, raspunde lent. Are inertie.Ptr simulare, porneste filtrul cu o valoare initiala in primul esantion apropiata de media semnalului, nu cu zero, si o sa vezi ce frumos o sa arate. Bomboana ochiului si mai multe nu. :)

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

Top autori în acest subiect

  • mircang9

    66

  • cirip

    34

  • 10vid

    2

  • Ionut Pavel

    2

Top autori în acest subiect

Imagini postate

M-am uitat bine la grafic si pragul de decizie adica media adaptiva nu genereaza corect datele. Acea medie trebuie ridicata mai sus adica aplicata o corectie pana la valoarea 0.08 ( valoarea ochiometrica ) prin care sunt demodulate corect datele. Ma gandesc ca corectia o fac prin reglarea receptorului ( FTB+demodulator ) prin aplicarea la intrare a unui clock de 50 Hz modulat FSK la intrare in receptor si astfel adun sau scad cu o constanta valoarea mediei adaptive in functie de cum este de corect reconstituit la iesire acel clock de 50 Hz aplicat la intrare.
Ceea ce am observat interesant la acea formula recursiva adica y_data(k)=(1-a)*y_data(k-1)+a*x_mul(k) creste mai repede decat scade si astfel ajunge dupa chiar 80000 esantioane sa se sincronizeze pana la urma pe media semnalului. Am observat asta initializand y_data cu zero si considerand x_mul un sir de cativa biti de 0/1. Asta se intampla la primul FTJ. Adica "1"-urile din x_mul fac sa creasca mai repede decat scad "0"-urile din x_mul ( vectorul de intrare ), valoarea iesirii din FTJ adica y_data(k). Adica se comporta ca un "condensator" care se incarca mai repede cu "1" decat se descarca cu "0". Se vede chiar pe grafic ( poza 2 ) daca ma uit mai atent: la bitii de 1 valoarea medie urca mai repede decat coboara in dreptul bitilor de 0.
Apropo de debug in timp real adica fara breakpoint. Te referi la folosirea LED-urilor ? De exemplu pentru a testa valori de registrii fara breakpoint sau debug soft ci prin rulare normala, leg extern 16 leduri la 16 pini si undeva in program incarc registrul urmarit in "registrul" ( portul ) cu LED-uri.

post-181251-0-03482600-1486662434_thumb.png

post-181251-0-35040700-1486662464_thumb.png

post-181251-0-51100500-1486662480_thumb.png

mirc_ch6.zip

Editat de mircang9
Link spre comentariu

Ceea ce am observat interesant la acea formula recursiva adica y_data(k)=(1-a)*y_data(k-1)+a*x_mul(k) creste mai repede decat scade
E ca si cum ai spune ca un condensator se incarca mai repede decat se descarca, desi folosesti aceeasi rezistenta ptr incarcare/descarcare. Chichita e in alta parte. Panta tensiunii (derivata) depinde de diferenta de tensiune intre sursa de incarcare/descarcare si condensator (valoarea lui y in cazul pur matematic). Uite graficele de mai jos. In al doilea grafic, tensiunea urca mai repede decat coboara din cauza diferentei mai mari intre tensiunea curenta si cea la care trebuie sa ajunga.

post-174676-0-10763700-1486694597_thumb.png

Daca ai un dezechilibru intre cati de 1 si cati de 0 ai in sirul de date, valoarea componentei continue nu va fi la jumatate. Daca ai siruri lungi de 1 sau de 0, vor fi probleme. E la alegerea ta sa folosesti algoritmul optim de calcul a pragului. Ceea ce ti-am aratat e doar una dintre optiuni.

 

Apropo de debug in timp real adica fara breakpoint. Te referi la folosirea LED-urilor ?
Nu. Ma refeream la folosirea directa a procesorului, nu a simulatorului. Desigur ca folosesti breakpointuri ptr oprire la o anumita instructiune.

Link spre comentariu

Cam asta ar fi simularea grosiera a algoritmului de demodulare din DSP. Am atasat modelul. Am impartit vectorul x_in in vectori mai mici de cate 512 esantioane. Urmeaza sa integrez pe langa demodulare FSK si filtrarea FTB pe cate 512 esantioane in model. Graficul de mai jos e generat cu scriptul atasat "mirc_ch6_dsp.m"

 

Am modificat formula de calcul componenta continua adica:

 

x_mul(k)=(1-a)*x_mul(k-1)+1.08*a*y_data(k); % filtru FTJ pentru aflarea valorii medii

 

Am introdus acel 1.08 in loc de 1 pentru a ridica mai sus valoarea mediei. Datele 0/1 sunt generate corect si la fel si cele extrase.

 

Te-ai referit la debug pe simulatorul in Matlab pentru dsPIC-uri ? Am vazut ca e cam scump acel simulator pentru integrare in Matlab. Ceva de genul din acest link:

 

http://www.microchip.com/Developmenttools/ProductDetails.aspx?PartNO=SW007023

 

Imi zici, te rog frumos, si de alt algoritm de aflare a componentei continue in afara de filtrare trece jos FTJ cu Fcut foarte mic ?

post-181251-0-34245100-1486751576_thumb.png

post-181251-0-76979400-1486751787_thumb.png

mirc_ch6_dsp.zip

Editat de mircang9
Link spre comentariu

Te-ai referit la debug pe simulatorul in Matlab pentru dsPIC-uri ?
Nooo. Ptr. dsPIC folosesc numai MPLAB 8.92 combinat cu XC16. Asta e tot. In etapele initiale folosec simulatorul din MPLAB, apoi, cand incepe sa miste, arunc in lupta PicKit3-ul agatat de procesor.

Imi zici, te rog frumos, si de alt algoritm
Aici va trebui sa faci propria cercetare. Eu am fost multumit de media alunecatoare si nu am mai sapat dupa altceva.

Editat de cirip
Link spre comentariu

Salut Cirip,

 

XC16 versiunea free ?

 

Vreau sa leg MPLABv8.92+XC16+PIC Kit2 impreuna pentru dezvoltarea proiectului.

 

Cum folosesc simulatorul din MPLABv8.92 ? asa in linii mari, ca sa stiu de unde pot incepe. Multumesc mult Cirip *

 

Iti multumesc mult Cirip pentru rabdarea si modul ordonat in care mi-ai raspuns pana acum. Pentru astea meriti laude si felicitari. Nu stiu cum te-as putea rasplati. La mine partea asta cu comunicatia este cea mai belicoasa treaba.

 

:aplauze

 

 

Ti-am trimis mesaj pe Messenger.

Editat de mircang9
Link spre comentariu

XC16 versiunea free ?

Da.


Cum folosesc simulatorul din MPLABv8.92 ? asa in linii mari, ca sa stiu de unde pot incepe.
Dupa ce ai instalat IDE-ul si XC16, clic pe debugger si alegi ce vrei sa folosesti. Uite in poza de mai jos.

post-174676-0-88435000-1486830092_thumb.png

Editat de cirip
Link spre comentariu
  • 2 săptămâni mai târziu...
In denumirea graficelor este scris ceea ce reprezinta. Am demodulat cu placa demo cu dsPIC DSC Starter Kit 1 adica cu modulul PWM cu ping-pong DMA iesire la pin RD0/OC1 pentru cate 256 esantioane pentru fiecare buffer ping - pong.
Frecventa de esantionare 8000 Hz. Preluare esantioane cu ADC cu DMA ping-pong.
Iesirea la OC1 a trebuit sa o amplific cu Audacity de 30 ori ca sa pot observa bitii demodulati.
La inceputul fisierului modulat ( semnalul util din Canal 1 ) este clock ( 20 ms - 1 logic - 390 Hz / 20 ms - 0 logic - 450 Hz ). La sfarsitul fisierului am introdus 0101 - fiecare bit avand durata cate 1 secunda. Primul zero logic, de la sfarsit din secventa 0101, este ceva mai scurt in demodulare. Urmatorii biti adica 101 au durata 1 secunda adica corect. In cadrul secventei 0101 spre sfarsitul fiecarui bit demodulat se observa acele oscilatii parazite mari.
Filtrarea am afisat-o cu algoritmul inscris in memoria de program doar ca la iesire la OC1 am scos iesirea din FTB si nu din demodulare pentru a vedea ca algoritmul se executa in timp util adica in timp real pentru a nu aparea salturi in redarea semnalului la iesire adica redarea cu PWM ( iesirea ) sa fie mai lenta decat intrarea de la ADC.
Memoria de program ocupata este de doar 1% din 256KB. Memoria RAM este ocupata doar 50% din 16KB. Programul ruleaza la viteza de Fcy = 40 MHz = 40 MIPS adica 40 milioane de instructiuni executate pe secunda.
dsPIC33FJ256GP506 ruleaza la un clock intern Fosc = 80 MHz.
Pentru FTB am folosit FIR iar pentru FTJ am folosit filtru cu medie alunecatoare cu a = 0.01. Valoarea medie de la iesirea FTJ am obtinut-o cu FTJM cu medie alunecatoare cu a = 0.002. Daca foloseam a = 0.00002 ca in Matlab valoarea medie cobora mult sub valorile scoase din FTJ. Valoarea a = 0.002 am dedus-o in mod debug si observand daca media obtinuta cu FTJM este cam la mijlocul valorilor obtinute de FTJ.
Am folosit Mplab C30 v3.1.
Din grafice se observa ca FTB de tip FIR este functional.
Demodularea am realizat-o cu urmatoarea secventa de sfarsit a algoritmului de demodulare:

/* Extract vector with demodulated data */
for(i=0;i<255;i++)
{
if(y_data>average_data)
{
demodulated_data = 1;
}
if(y_data==average_data)
{
demodulated_data = 0;
}
if(y_data<average_data)
{
demodulated_data = -1;
}
}
unde y_data este vectorul de la iesirea FTJ iar average_data este de la iesire din FTJM.
Vectorul demodulated_data l-am trimis la modulul PWM pentru redare la iesire la pin OC1 cu Fs = 8000 Hz.
Intrebare: Vectorul demodulated_data il pot aplica direct la un pin de iesire ( RF5 ) fara sa aplic rata de esantionare de 8000 Hz ca la ADC ? Fara sa folosesc modulul PWM si DMA pentru redare demodulare in timp real ? Adica sa scriu in felul urmator :

/* Extract vector with demodulated data */
for(i=0;i<255;i++)
{
if(y_data>average_data)
{
//demodulated_data = 1;
RF5 = 1;
}
if(y_data==average_data)
{
//demodulated_data = 0;
RF5 = 0;
}
if(y_data<average_data)
{
//demodulated_data = -1;
RF5 = 0;
}
// daca scot cu rata de esantionare aplic temporizarea din linia urmatoare
temporizare(); // temporizare cu durata Ts = 1/Fs = 1/8000Hz = 125 us
}
?

Imaginea "Mix_L400&Canal 1_12_sec_clock_0_1_0_1.png" reprezinta linia cu celelalte canale amestecata cu Canalul 1 modulat cu clock si secventa 0101 de la sfarsitul celor 12 secunde din fisierul wav.

 

Imaginea "Mix_L400&Canal 1_12_sec_clock_0_1_0_1_filtratCanal 1.png" reprezinta rezultatul filtrarii cu FIR pentru Canal 1 cu algoritmul de demodulare inclus in program.

 

Imaginea "Demodulat din Mix_L400&Canal 1_12_sec_clock_0_1_0_1.png" reprezinta rezultatul demodularii exact asa cum este inregistrat cu Audacity.

 

Imaginea "Demodulat din Mix_L400&Canal 1_12_sec_clock_0_1_0_1 si amplificat de 30 ori.png" reprezinta demodularea amplificata cu Audacity de 30 ori. Se observa clock-ul demodulat.

 

Imaginea "Demodulat din Mix_L400&Canal 1_12_sec_clock_0_1_0_1 si amplificat de 30 ori_2.png" reprezinta demodularea amplificata cu Audacity de 30 ori. Se observa secventa de biti 0101 de la sfarsitul celor 12 secunde ale fisierului "Mix_L400&Canal 1_12_sec_clock_0_1_0_1.wav".

 

In placa demo am aplicat CICLIC fisierul de 12 secunde "Mix_L400&Canal 1_12_sec_clock_0_1_0_1.wav" din Winamp pe intrarea LINE_IN in placa. Iesirea din placa demo cu dsPIC am inregistrat-o cu Audacity pentru analiza rezultatelor.

 

Am folosit urmatoarele conexiuni intre calculator si placa demo:

 

1) LINE_OUT ( pentru boxe ) din placa de sunet a PC-ului ==============> LINE_IN in placa demo - un fir cu doua mufe de tip TRS.

 

2) Iesire din placa demo ==============> LINE_IN in placa de sunet a PC-ului - al doilea fir cu doua mufe de tip TRS.

 

Demodularea este mono.

post-181251-0-83518700-1487611923_thumb.png

post-181251-0-53894800-1487611934_thumb.png

post-181251-0-11611000-1487612044_thumb.png

Editat de mircang9
Link spre comentariu

Primul 0 din secventa de sfarsit 0101 este mai scurt decat urmatorii trei pentru ca asa am generat semnalul pentru intrarea in placa demo. Deci e corecta demodularea ca intervale de timp adica durata bitilor demodulati. Ramane sa rezolv partea de oscilatii parazite.

Link spre comentariu

Am incercat cu FIR in loc de medie alunecatoare pentru FTJ. FIR cu Fcut 50 Hz.

Asa am eliminat oscilatiile parazite mici din demodulare.

Au ramas cele mari din demodulare din dreptul secventei de la sfarsit adica 0101.

 

Maine o sa folosesc in loc de FTJ de tip FIR, FTJ de tip IIR. Iar media de comparatie o calculez tot cu un filtru FTJ IIR dar cu Fcut = 3 Hz.

 

Cred ca media alunecatoare cu care fac comparatia imi joaca feste. Am facut debug si am preluat esantioanele de la medie si de la iesire din FTJ si am bagat in Excel, media totusi nu e medie. cand e pe la medie, cand coboara sub grafic. Cred ca o sa generez un fisier mai lung adica de 5 minute ca sa nu prind sfarsitul si inceputul fisierului care il aplic ciclic si care cred ca imi deviaza pe verticala media.

 

Am afisat graficul cand average e sub ftj_out. Dar am prins si cand average e centrat pe ftj_out.

 

Am folosit si 3 FTJ de tip medie alunecatoare cu a = 0.01 si mai apar oscilatii.

Cu FTJ de tip FIR e mult mai bine. Dar in Excel arata ca si FIR mai prezinta niste oscilatii.

O sa vad cum merge cu IIR.

 

Am scos la pin RF5 demodularea fara DMA atat cu temporizare de esantionare 8 KHz cat si direct fara esantionare dar deocamdata nu iese ceva multumitor pe osciloscop ca sa postez. E foarte instabila demodularea. Curios ca prin PWM la pin OC1 se vede ca bitii sunt scosi corect in acel clock de 50 Hz.

post-181251-0-50881800-1487706453_thumb.png

post-181251-0-08221300-1487707804_thumb.png

post-181251-0-51572400-1487709425_thumb.png

Editat de mircang9
Link spre comentariu

Intrebare: Vectorul demodulated_data il pot aplica direct la un pin de iesire ( RF5 ) fara sa aplic rata de esantionare de 8000 Hz ca la ADC ? Fara sa folosesc modulul PWM si DMA pentru redare demodulare in timp real ?
Cred ca o varianta mai compacta de a decide 1 sau 0 digital ar fi asa:

if((y_data-average_data) >0){
demodulated_data = 1;
}
else{
demodulated_data = 0;
}

Ar trebui sa fie si mai rapid, ptr ca nu faci atatea teste.

 

// daca scot cu rata de esantionare aplic temporizarea din linia urmatoare
temporizare(); // temporizare cu durata Ts = 1/Fs = 1/8000Hz = 125 us
Nu cred ca ai nevoie de temporizare. Cadenta de 8KHz, cu care faci esantionarea, provine din alta parte, probabil dintr-un timer. O poti folosi pe aia ca sa scrii la portul digital. Asta inseamna ca vei scrie de 160 de ori pe bit transmis (la 50 Baud). Sau, poti sa scrii la portul digital o data la 160 de esantioane analogice, dar trebuie sa ai grija sa mentii sincronismul cu tranzitiile rezultate la demodulare.

Referitor la clockul extras si postat in Audacity, cred ca lipsesc joasele. De aia ai impulsurile alea exponentiale, in loc sa vezi un dreptunghi curat. Daca folosesti placa de sunet ca sa vezi clocul, e de asteptat sa deformeze datorita lipsei cuplajului in CC. Forma se poate imbunatati oarecum conectand o rezistenta de ordinul zecilor de KOhmi in serie cu intrarea placii de sunet, dar pierzi din nivel. Cauti compromisul optim prin incercari.

 

Link spre comentariu

Schema osciloscop audio ( 0 - 20 kHz ) pentru masurare la pin RF5 a datelor demodulate.

 

Urmeaza testarea "aruncarii afara" prin RF5 a bitilor demodulati prin metoda de salt sincronizat pe tranzitii peste cate 160 esantioane din vectorul demodulated_data fara temporizare sau rata de esantionare cu timer.

 

160 esantioane = Fs/Fbaud = 8 KHz/50 Hz.

 

Am lasat rezistenta de pull-up la RF5 de 200k, ca sa nu stric placa demo, iar cu osciloscopul digital ( nu cu schema de mai jos ) am citit un semnal digital cu "1" logic de 3.6V. Pe placa demo RF5 este legat la iesire doar la rezistenta de pull-up de 200k.

 

Pinul RF5 suporta un nivel de 5V la iesire.

post-181251-0-45831500-1487789799_thumb.png

Editat de mircang9
Link spre comentariu

Cred ca am gasit sursa oscilatiilor.

 

Oscilatiile mici sunt de la FTJ. Cand am pus un FIR mai selectiv am eliminat oscilatiile mici.

 

Am simulat in Matlab pe un fisier cu clock pana la secunda 8 apoi secventa 01010 pana la secunda 13, fiecare bit din secventa avand durata de o secunda.

 

Am generat in Audacity acest fisier cu rata de esantionare 8000 Hz mono cu 32 bit float, pentru ca simularea sa se apropie cat mai mult de situatia reala din dsPIC.

 

Afisez rezultatele atat in simulare algoritm pe intregul bloc de 100000 esantioane ( prima poza ) cat si simulare algoritm pe cate 256 esantioane ( poza a doua ). Se observa foarte bine acele oscilatii mari din dreptul bitilor din secventa 01010. Cauza este FTJM adica Fcut de la filtrul trece jos pentru aflarea valorii medii. Pozele sunt generate cu a = 0.01 pentru FTJM adica un Fcut cam mare. Pentru secventa 01010 trebuie un Fcut < 1 Hz ! In dreptul clock-ului demodularea este buna chiar si cu a = 0.1 adica Fcut >> 1 Hz.

 

 

In plus la demodulare pe blocuri de cate 256 esantioane oscilatiile sunt mai dese si mai mari decat in prima poza cand demodularea adica algoritmul e aplicat pe intreg blocul de 100000 de esantioane odata.

 

:dffe

 

 

 

 

 

post-181251-0-08058700-1487839555_thumb.png

post-181251-0-11189600-1487839568_thumb.png

Editat de mircang9
Link spre comentariu

Referitor la constanta "a" de la FTJM, constanta "a" trebuie sa fie cat mai mica. Un a = 0.000001 este deocamdata satisfacatoare daca datele sunt un 0 sau 1 logic continuu.

 

Am atasat oscilatiile mari pentru diferite valoari ale constantei "a". Se observa ca de la a < 0.0005 oscilatiile sunt eliminate.

post-181251-0-81593100-1487845854_thumb.png

post-181251-0-77609600-1487845876_thumb.png

Editat de mircang9
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