Sari la conținut
ELFORUM - Forumul electronistilor

cum schimb referinta la un semnal ?


mircang9

Postări Recomandate

Pana o sa postez tensiunile masurate pe calea de semnal la intrarea in ADC si ce mi-ai mai cerut

dau schema placii filtrului: este vorba de placa demo originala de starter kit pentru dsPIC:

http://ww1.microchip.com/downloads/en/D ... sGuide.pdf.

Este afisata in detaliu la rubrica Schematics. Este afisata la pagina 34. Iesirea din FTJ si anti-aliasing filter notata cu MIC_SIG ( Microphone signal sau de la LINE IN ) este legata la intrarea AN0 al ADC

de la dsPIC33FJ256GP506.

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

In ce pozitie este J7 ? Eu cred ca este corect sa fie pus pe 1-2, adica line in. In felul asta iti face C61 separarea componentei continue din linia telefonica. Daca e pe mic (2-3) si bagi linia telefonica, componenta continua de pe linie iti satureaza amplificatoarele si nu mai intra semnal alternativ in ADC. In functionare normala, pe pinii 1, 7, 8 si 14 ai lui U10 trebuie sa ai 1.65V. Daca nu ai asa, ceva nu e in regula si nu are cum sa mearga. Tensiunile se pot masura cu un multimetru digital.

Link spre comentariu

E pe LINE IN jumperul si tot nu scoate nimic. Azi n-am apucat sa masor punctele cu voltmetrul.

Cand o sa-mi pot face timp o sa va spun.

 

Am o intrebare Cirip: cum socotesc coeficientii filtrului IIR ? pe care ii calculeaza dsPICFdLite ?

Varianta full n-o am. IIR Butterworth am observat ca filtreaza mai bine decat cu functiile Eliptic si Bessel. La IIR calculeaza maxim ordinul 8 adica 4 sectiuni a cate

b0, b1, b2, a1, a2 la fiecare sectiune din cele 4. Daca imi poti indica o carte care sa

arate modul de calcul mai usor si coeficientii calculati sa se potriveasca cu

softul Mplab 30 la dsPIC. Inca nu m-am apucat serios la calculul coeficientilor la filtrul IIR.

La filtrul FIR stiu sa calculez datorita ajutorului tau. La fel acele comenzi din Matlab de filtrare

imi sunt foarte folositoare si acum.

 

Cu coeficientii IIR calculati de dsPICfdLite filtrul IIR lucreaza bine. Dar probabil voi avea nevoie de

mai multi coeficienti.

 

Postez aici programul. Este o versiune modificata de mine din programe demo adunate in

acest program ( exemplul demo al placii de conversie ADC si redare PWM si un exemplu demo cu

filtru IIR luat de pe net ). Recunosc ca la conversia ADC n-am respectat cum am facut ca in trecut cand am masurat zgomotul de conversie cu acel buffer de 9000 esantioane cu masa legata pe intrarea in ADC. Partea interesanta este ca este functional. Ai zis in trecut ca este complicat scris, dar functioneaza !

 

La FRAME_SIZE am trecut 8 esantioane. Am pus si 4 si merge si asa. Am inteles ca trebuie sa fie puteri a lui 2 numarul de esantioane. La 4 sectiuni de coeficienti nu stiu care este numarul optim

de esantioane care sa-l pun pentru FRAME_SIZE si care sa fie frecventa de esantionare maxima

raportata la numarul de coeficienti. Ma gandesc ca exista totusi si o limita maxima

a frecventei de esantionare. Aici i-am dat 8 KHz. I-am dat si 96 KHz dar parca e prea mult la filtre IIR.

 

Am gasit un programel scris in limbajul C la http://www.exstrom.com/journal/sigproc/

dar nu stiu cum sa integrez coeficientii calculati cu bwbp.c ( compilat cu gcc pentru windows din

pachetul software "CodeBlocks" ) in programul atasat aici pentru placa demo cu dsPIC33FJ si cu Mplab C30. Poate imi zici cum sa fac.

 

La fel la Excel 2003 am o problema: dupa reinstalare nu-mi mai merg calculele de conversie pentru formatul Q15 cu "0x" & RIGHT(DEC2HEX($C$10*I68,4),4). Am cautat sa instalez PRO11.MSI dar degeaba imi apare #NAME? Cand dau sa instaleze Analysis-Tool si ii dau calea

catre folderul ce contine fisiserul PRO11.MSI zice ca nu e acolo.

 

Sper sa-mi zici, te rog mult.

Multumesc mult Cirip.

Link spre comentariu
E pe LINE IN jumperul si tot nu scoate nimic. Azi n-am apucat sa masor punctele cu voltmetrul. Cand o sa-mi pot face timp o sa va spun.
Astept cu interes.

 

Am o intrebare Cirip: cum socotesc coeficientii filtrului IIR ? pe care ii calculeaza dsPICFdLite ?
Matlab ti-i poate calcula in cantitatea si calitatea dorita :) Uita-te prin helpuri. Parca butter(ceva parametri) e una dintre comenzi ca sa dea pe goarna coeficienti ptr filtru Butterworth. Trebuie sa ai instalata DSP Toolbox.

 

Daca imi poti indica o carte care sa arate modul de calcul mai usor
Ti-am spus in postul asta ce carti si imi mentin opinia: viewtopic.php?p=843588#p843588 Din pacate "mai usor" nu exista. Daca nu stapanesti bine teoria, nu ai sanse, asa ca folosesti softuri de care gasesti. E o solutie: Matlab, pe care inteleg ca il ai, dar trebuie sa intelegi ce faci. Desepelul pe care l-am postat la sectiunea "Proiectul Meu" este proiectat si simulat integral in Matlab. Are sute de coeficienti.

 

si coeficientii calculati sa se potriveasca cu softul Mplab 30 la dsPIC.
Asta e numai o chestie de formatare. Scrie un script Matlab, care sa genereze coeficientii direct in formatul care te intereseaza.

 

Inca nu m-am apucat serios la calculul coeficientilor la filtrul IIR. La filtrul FIR stiu sa calculez datorita ajutorului tau. La fel acele comenzi din Matlab de filtrare imi sunt foarte folositoare si acum.
Nu sunt convins ca iti trebuie IIR. Eu am facut filtrul ala de care vorbeam cu FIR si am mai si redus la jumatate frecventa clocului, ca sa scap de niste zgomot.

 

Postez aici programul. Este o versiune modificata de mine din programe demo adunate in acest program ( exemplul demo al placii de conversie ADC si redare PWM si un exemplu demo cu filtru IIR luat de pe net ).
Din pacate chestii adunate = carpeala.

 

La FRAME_SIZE am trecut 8 esantioane. Am pus si 4 si merge si asa. Am inteles ca trebuie sa fie puteri a lui 2 numarul de esantioane.
Nu stiu de unde ai inteles asta. Cu cat ai buferele mai mari, cu atat ai latenta mai mica de intrare/iesire din filtru. Facand filtrare in bloc, faci un call si un return la "FRAME_SIZE" esantioane. Daca frame-ul e mic, pierzi o gramada de timp cu call/ret si salvare/restaurare context. Mai mult, eu am folosit asa numitele buffere ping-pong. Sunt 2 buffere care lucreaza alternativ. Unul se proceseaza in timp ce celalalt se incarca cu esantioane. E foarte eficient asa.

 

La 4 sectiuni de coeficienti nu stiu care este numarul optim de esantioane care sa-l pun pentru FRAME_SIZE
Eu, dupa ce am fost multumit de functionarea filtrului, am marit bufferele pana am ocupat tot RAM-ul. Cred ca am bufere de peste 1000 de esantioane la filtre cu vreo 180 de coeficienti.

 

si care sa fie frecventa de esantionare maxima raportata la numarul de coeficienti.
Nu au legatura. Frecventa de esantionare depinde de frecv maxima din spectrul de intrare, asa cum ne invata teorema Nyquist-Shanon. Incearca sa deschizi macar una din cartile alea. Iti sunt necesare notiuni fundamentale.

 

Ma gandesc ca exista totusi si o limita maxima a frecventei de esantionare. Aici i-am dat 8 KHz. I-am dat si 96 KHz dar parca e prea mult la filtre IIR.
Limita maxima e cat te tine hardware-ul. Daca poti sa esantionezi la 1GHz ptr un semnal de 100Hz, cinste tie! :) Totusi, pe ce criterii ai decis ca "96 KHz e prea mult la filtre IIR" ?

 

Am gasit un programel [...] nu stiu cum sa integrez coeficientii
Nu am timp sa scotocesc, dar pot sa-ti sugerez sa urmaresti formatul dat in manualul de utilizare al compilatorului.

 

La fel la Excel 2003 am o problema:
Habar n-am. Aici chiar ca tre sa te descurci singur. Ai pastrat o copie intacta a fisierului excel pe care ti l-am dat? Ala tre sa mearga. Daca nu, poate mai e pe undeva pe forum.

 

Am si eu o curiozitate. Cred ca se fac aproape 2 ani de cand sapi la chestia asta. Nazdravania asta desepita face parte din atributiile tale de serviciu?

Link spre comentariu

Cu filtrare digitala m-am ocupat maxim trei luni pana acum. Pentru banda de trecere de doar 60 Hz am observat ca trebe inseriate trei DSP cu filtrare FIR, asa ca m-am gandit sa trec la filtrare IIR ca sa folosesc doar un DSP. Am incercat si demodulare FSK cu inmultirea Sn (esantioanele curente ) cu Sn_k ( esantioanele intarziate ) produs pe care l-am pus in vectorul Vn si apoi am facut filtrare FTJ cu IIR. Poti vedea in programul atasat. Am folosit si eu DMA si buffere ping-pong. Am pus 256 coeficienti si 256 esantioane. Mai mult n-a incaput in RAM. Din noiembrie anul trecut pana acum n-am mai lucrat la desepeala din lipsa de timp. Recent am gasit timp sa continuicu desepeala. Placa demo nu da semnal 0 logic de la PIC18F pe Switch_to_target_+3,3V si dsPIC33F nu este alimentat cu 3,25 V. N-am dat nivel logic la D+ ( l-am lasat in aer ). Am masurat cand leg la calculator si am observat ca la D+ este 2,98V iar la D- 0V ( GND ). E cam rezolvata problema asta:o sa-i dau un 2,9 V la D+ si GND la D- si nu o sa le las in aer. Asa PIC18F vede ca si cum ar fi legataplaca demo la portul usb de la calculator.Ca atributii de serviciu am altceva de facut. De filtrare digitala m-am ocupat din placere si ca hobbymai mult.Caut sa merg pe calea mai usoara daca este posibil adica sa nu scriu programe de la a-z si sa le adaptez la nevoi. Daca se poate sa gasesc coeficientii cu softuri gata facute as renunta la atata teorie chiar daca mi-ar place sa aprofundez si teoria. Azi am vazut si eu in MATLAB 7 cum calculeaza coeficientii, dar n-am gasit instalat DSP Toolbox.Teorema lui taica Shannon am inteles-o dar ma gandeam ca poate exista o limita maxima.In filtrarea IIR am pus 4 la FRAME_SIZE sau 8 intrucat este doar b0, b1, b2, a1, a2. Dar ai dreptate ca instructiunile call si return incetineste, insa la FIR am pus numar maxim la FRAME_SIZE ( 256 cu DMA ).Ce DSP ai folosit ? ai folosit librariile ? ce latime de banda filtrata ai aplicat ?Multumesc pentru atentie si raspunsuri *** :smt115

Link spre comentariu

Ce DSP ai folosit ? ai folosit librariile ? ce latime de banda filtrata ai aplicat ?

Salut,Toate detaliile sunt la viewtopic.php?p=1009676#p1009676 , dar le mai spun o data; in fond imi mai fac si eu reclama :da Procesor: dsPIC33FJ64GP804Da, am folosit librariile.Latimea de banda minima este de 100Hz, dar nu valoarea absoluta e importanta, ci raportul fata de frecv de esantionare. In cazul meu, frecv de esantionare este de 32.5KHz, deci banda este 100/32.5KHz= 0.3% din frecv de esantionare. Nu am scazut banda mai mult ptr ca nu se mai aude cum trebuie, dar as fi putut sa o mai scad.Alte comentarii:Nu inseriaza nimeni desepeuri. Nu se face asa ceva. E ca si cum ai spune ca inseriezi PCuri. Daca ai nevoie de banda mai ingusta, "inseriezi" module de procesare in interiorul aceluiasi procesor, pana ii dau electronii pe nas. Daca lucrezi cu IIR, ar trebui sa poti inseria filtre destul de multe, ptr ca necesita calcule mai putine decat FIR. Aici trebuie insa atentie: IIR poate fi instabil, spre deosebire de FIR care e stabil neconditionat. Procedura e cam asa: calculezi ordinul filtrului total din cerintele temei, apoi se factorizeaza filtrul de ordin mare in filtre succesive de orinul 1 si 2, grupand impreuna polii si zerourile aflate la distanta mica unul de celalalt, ca sa minimizezi erorile de calcul. In cazul meu, se fac 3 procesari succesive: decimare, filtrare pr. zisa si la sfarsit interpolare. Toate sunt FIR-uri de zeci/sute de coeficienti. Dupa parerea mea, "calea usoara" nu prea tine aici. Tre matematica la greu. Asta este.O modalitate posibila ptr. calculul coeficientilor la IIR, daca nu ai soft specilalizat, e cam asa: Se pleaca de la un filtru analogic cu caracteristica dorita. Nu trebuie valorile pieselor, ci doar functia de transfer in H(s). Astea sunt polinoamele Buterworth, Cebasev, Bessel si ce mai vrei, ale caror poli si nuluri se gasesc in tabele. Apoi se denormeaza polinomul, adica il scalezi ca sa il aduci la frecv dorita. Polinoamele ca atare sunt ptr frecventa unghiulara de 1rad/s. Apoi aplici transformarea biliniara ca sa treci din timp continuu, (s), in timp discret, (z). Atentie la predistorsionarea frecventei (frequency warping), altfel filtrul digital iese decalat. Ai obtinut transformata Z a functiei de transfer. Din asta se obtine direct, prin recunoastere, ecuatia recursiva in y(n). Destul de laborios, dar te asigur ca altfel nu merge.Cu titlu distractiv, am facut toata procedura de mai sus si am implementat-o pe un PIC16F877, cand dsPICul nici macar nu se nascuse. Totul in asembler. :nebunrau: Daca am timp, fac un exemplu in excel cu proiectarea unui IIR.Zici ca ai incercat sa demodulezi prin metoda intarzierii. Care a fost rezultatul? A mers? Ce probleme au aparut?Cirip
Link spre comentariu

Chiar te rog sa m-ajuti cu un exemplu in Excel de proiectare filtru IIR.Foarte important ce ai spus.Cand am zis dsPICuri "inseriate" m-am referit la filtre FIR, adica ce prelucreaza unul da mai departe celuilalt. Mai buna exprimare era: in cascada. Fenomenul l-am observat aplicand filtrarile inregistrate din nou prin acelasi dsPIC si am observat spectrul.N-a iesit bine cu demodulare FSK, adica n-a iesit demodulat.

Link spre comentariu

Am respectat pentru demodulare FSK ce este scris in documentul din atasament. Nu-mi mai amintesc ce frecvente am ales pentru F0 si F1 pentru care am calculat k. Frecventa de esantionare Fe = 1/Team ales-o la 50 Hz ( 50 biti pe secunda ). Atasez exemplul de cod in limbajul c cu care n-am obtinut rezultate satisfacatoare adica nimic.

Practical digital fsk modem.pdf

Link spre comentariu

Acolo am pus in loc de OCPWMWrite(pOCPWMHandle,Vn,FRAME_SIZE);asa: OCPWMWrite(pOCPWMHandle,filterOut,FRAME_SIZE);cand am incercat sa fac demodularea prin aceasta metoda ca doar nu scoteam vectorul produs ci ce iese din filtrarea trece jos evident; dar n-a mers inca.Cu placa demo pentru dsPIC a trebuit sa-i intrerup traseul de la RB0 de la PIC18F67J50 care mergea in baza tranzistorului pnp si i-am lipit in baza cu un firicel nivel logic 0 si astfel dsPICu este mereu alimentat. Am incercat sa-i dau la D+ 2,9V si la D- 0V ( masa ) asa cum am masurat cand este legat la usb dar degeaba. Acum am 1,63 V la iesirile amplificatoarelor de la U10 ceea ce e bine.

Link spre comentariu

Frecventa de esantionare Fe = 1/Te am ales-o la 50 Hz ( 50 biti pe secunda ).

Daca imi amintesc bine, purtatoarele se intind pana pe la 1KHz. In conditiile astea nu are cum sa mearga cu Fe=50Hz. Te trage de maneca taica Nyquist :) Esti sub-esantionat rau de tot.Am citit si ca ai obtinut 1.65V pe operationale. Acum iese ceva din IIR?Nu pot sa raspund in detaliu la fiecare post al tau ptr ca sunt si eu prins cu ceva chestii personale. Am incercat sa fac un spreadsheet excel cu proiectarea unui IIR plecand de la polinomul Butterworth, dar inca nu a iesit la zar. Imi scapa ceva. Dar postez cand termin.Intr-un post anterior spuneai de desepeuri cascadate, nu inseriate. Am inteles ideea, dar spuneam ca nu se face asa. Nu are sens sa inseriezi cipane fizice. "Inserierea" sau cascadarea, cum vrei sa-i spui, daca este necesara, se face soft, prin aranjarea modulelor de program. Explicam mai sus ca in jucaria aia a mea am "cascadat" 3 module: decimare, filtrarea pr. zisa, interpolare. Fiecare sectiune este in senta un filtru FIR, dar toate sunt rulate de acelasi procesor.Iti urmaresc in continuare posturile si evolutia depanarii. O s-o scoti la capat pana la urma :)Spor!Cirip
Link spre comentariu

Imi cer scuze pentru greseala de exprimare. Fe am ales-o bine 8 KHz. Se vede in fisierul demodulator.c

in prima linie de comentariu. Fcut am ales-o 50 Hz intrucat viteza de transfer este 50 biti pe secunda.

 

Dar pentru asta o sa mai incerc metoda asta de demodulare de inmultire si filtrare trece jos.

 

Imi amintesc ca am incercat sa aplic filtrare FIR in acelasi dsPIC ( cel de pe placa demo pomenit mai sus ) in forma:

 

#define FRAME_SIZE 256

 

/* Allocate memory for buffers and drivers */

 

fractional adcBuffer [ADC_CHANNEL_DMA_BUFSIZE] __attribute__((space(dma)));

fractional ocPWMBuffer [OCPWM_DMA_BUFSIZE] __attribute__((space(dma)));

fractional samples [FRAME_SIZE];

int i;

 

/* Instantiate the drivers */

ADCChannelHandle adcChannelHandle;

OCPWMHandle ocPWMHandle;

 

/* Create the driver handles */

ADCChannelHandle *pADCChannelHandle = &adcChannelHandle;

OCPWMHandle *pOCPWMHandle = &ocPWMHandle;

 

/* extern definitions for the imported *.s files from dsPIC Filter Design */

extern FIRStruct ftbFilter; /*Contains filter structures for FIR-BPF*/

 

fractional FilterOut[FRAME_SIZE] ; /*Output array where filtered output will*/

/*be stored */

int main(void)

{

/* Configure Oscillator to operate the device at 40MHz.

...

/* Intialize the board and the drivers */

SASKInit();

ADCChannelInit(pADCChannelHandle,adcBuffer); /* For the ADC */

OCPWMInit(pOCPWMHandle,ocPWMBuffer); /* For the OCPWM */

 

/* Start Audio input and output function */

ADCChannelStart(pADCChannelHandle);

OCPWMStart(pOCPWMHandle);

 

/* Main processing loop. Executed for every input and

output frame */

 

/*Initialize the filter state variables (delay line) prior to calling */

/*the FIR() routine the very first time */

 

FIRDelayInit(&ftbFilter);

 

while(1)

{

/* Obtaing the ADC samples */

while(ADCChannelIsBusy(pADCChannelHandle));

ADCChannelRead(pADCChannelHandle,samples,FRAME_SIZE);

 

/* Perform FIR Band Pass filtering on samples from ADC */

 

FIR(FRAME_SIZE,&FilterOut[0],&samples[0],&ftbFilter);

FIR(FRAME_SIZE,&FilterOut[0],&FilterOut[0],&ftbFilter);

FIR(FRAME_SIZE,&FilterOut[0],&FilterOut[0],&ftbFilter);

 

/* Wait till the OC is available for a new frame */

while(OCPWMIsBusy(pOCPWMHandle));

 

/* Write the frame to the output */

OCPWMWrite (pOCPWMHandle,FilterOut,FRAME_SIZE);

}

}

 

Din cate imi amintesc aplicand filtrare repetata se observa la iesire ca apar intarzieri ceea ce

m-a dus la concluzia ca trebe sa folosesc trei dsPICuri fizice separate puse in cascada.

Totusi acum vad ceva ce-mi pare cam dubios. Vectorul FilterOut este si vector sursa si vector

destinatie ( cu rezultatul filtrarii ) ceea ce cred ca se cam bate cap in cap:

 

FIR(FRAME_SIZE,&FilterOut[0],&FilterOut[0],&ftbFilter);

 

Parca am facut asa din lipsa de memorie RAM ca altfel scriam asa:

 

FIR(FRAME_SIZE,&FilterOut1[0],&samples[0],&ftbFilter); // prima filtrare

FIR(FRAME_SIZE,&FilterOut2[0],&FilterOut1[0],&ftbFilter); // a doua filtrare

FIR(FRAME_SIZE,&FilterOut3[0],&FilterOut2[0],&ftbFilter); // a treia filtrare

 

O sa aprofundez mai mult ce ai scris pana acum: decimare, interpolare .... hmmm :jytuiyu

 

Am observat la placa demo ca apare 1.63V la iesirea din amplificatoare dar n-am apucat sa

verific daca si filtreaza fara sa folosesc calculatorul adica pe un montaj independent de calculator.

O sa incerc cat de curand imi pot face timp.

 

Multumesc mult pentru sfaturi Cirip. Nu ma dau batut pana nu reusesc nazdravania :rade: asta cu filtrarea digitala si demodularea asta cu DSP. Evident ca si la demodulare ceva mi-a scapat, ca doar

metoda este consacrata si bine stiuta si aplicata ( acea cu inmultirea esantioanelor cu intarzierile lor si FTJ ). La desepeala ma intereseaza mai mult filtrarea decat demodularea deoarece ma bazez

inca pe demodularea cu masurarea de perioade. Nu este profesionala metoda cu masurarea de perioade dar atata timp cat demoduleaza corect este bine.

 

Astept cu viu interes exemplul din Excel cu proiectarea IIR.

 

Inca nu mi-am facut timp sa rezolv cu Excelu dar am incercat totusi fisierul pe care mi l-ai dat pe la

inceputuri dar daca dau sa calculeze din nou o celula apare #NAME? ceea ce inseamna ca trebe

sa instalez cum trebuie Analysis Tools.

Link spre comentariu

Am calculat coeficientii filtrului IIR Butterworth cu fdatool in Matlab 7, i-am cuantizat single precision floating point si i-am integrat intr-un fisier extensia s ( asemanator cu fisierele generate de dsPICfdLite ). Dar surpriza: nu scoate nimic dsPICu dupa ce il programez cu coeficientii calculati. Am respectat intocmai cele scrise in fisierul atasat Lab5.rar. Acolo in locul impementarii de la pagina 12 pentru IIRrevA am aplicat implementarea pentru dsPIC ca si cum as fi generat coeficientii cu dsPICfdLite. Am creat un fisier cu extensia m si am scris functia sos_C_header. Apoi am trecut coeficientii din fisierul cu extensia h obtinuti cu functia sos_C_header in Excel in format Q15. Dar tot degeaba: nu scoate nimc dsPICu. Am aplicat un fisier sunet cu canalul 7 ce trebe filtrat si nu scoate nimic dsPICu. Am fost atent ca in program sa folosesc aceeasi frecventa Fs = 8 KHz de esantionare ca la coeficientii calculatii cu fdatool din Matlab. Am incercat si sa impart la 2 toti coeficientii din Excel dar in schimb chiar daca nu aplic nimic la intrare dsPICu scoate o sinusoida cu frecventa de 4096 Hz, total aiurea. Am zis sa incerc si sa impart la doi pentru ca in comentatriu in dreptul fiecarui coeficient din fisierul extensia s ( aici am salvat cu extensia txt ca n-am voi sa postez extensia s ) apare impartit la doi:.hword 0x0437 ; b( 1,0)/2

FR_IIR_Canal_7_Butterworth.txt

Link spre comentariu

M-am apucat sa aplic coeficientii calculati dupa cartea lui Proakis la pagina 360 dar in loc de elliptic ampus butterworth. Sunt 236 de sectiuni a cate b0 b1 b2 a1 a2 ! cu a0 = 1.Asa ca am ce implementa ! O sa vad ce iese. Trebe sa bag in Excel toti coeficientii, sa-i convertescin format Q15 sa fac fisierul cu extensia s si sa bag in program si apoi sa testez. In imaginea Labor amscris comenzile din Matlab cu care am obtinut coeficientii in forma cascadata.Acum nu stiu sa iau pe b0 = 9.1789e-013 sau b0 = 1 in calcule ?Problema la conversia coeficientilor in format Q15 este ca acei coeficienti care sunt mai mari de 2 nu pot fi convertiti in format Q15 ( 16 biti ). De exemplu b1=14.9841 de la sectiunea 1 ( din 236 sectiunibiquads ) nu poate fi convertit in format Q15.

Coef.txt

post-23035-139829503615_thumb.jpg

Link spre comentariu

Salut,

 

Paiii ... nu are cum sa mearga asa. Nu te poti astepta sa trantesti niste coeficienti in desepel si sa mearga. S-o luam pe rand.

 

Dar surpriza: nu scoate nimic dsPICu
Se mai intampla, numai ca eu as propune ca mai intai sa elaborezi tot algoritmul strict matematic, in Matlab, fara sa te incurci cu restrictiile implementarii, adica sa lasi dsPICul deoparte in etapa asta.

 

daca nu aplic nimic la intrare dsPICu scoate o sinusoida cu frecventa de 4096 Hz, total aiurea
Inseamna ca e instabil. Oscileaza. FIR e inerent stabil. Cu IIR trebuie multa grija. Nu mai zic ca vrei sa demodulezi FSK. Pentru asta iti trebuie faza liniara (timp de intrziere de grup constant). Altfel introduce filtrul distorsiuni de nu mai recuperezi nimic din date.

 

Am zis sa incerc si sa impart la doi
Nu poti sa imparti la 2 asa pur si simplu. Coeficientii se pot scala, dar numai in anumite conditii. Altfel muti polii si filtrul poate deveni instabil.

 

cartea lui Proakis la pagina 360
Care dintre carti, ce editie? La pag 360 in editia a patra "DSP Principii, Algoritmi, Aplicatii" zice ceva despre deconvolutie. Poti sa pui aici pagina scanata? Plus ca procedura de proiectare e cam elaborata ca sa incapa numai intr-o pagina.

 

Coeficienti mai mari ca 2 [...] 236 sectiuni biquads
Nr de sectiuni este enorm. Fiecare sectiune biquad are nevoie de 5 inmultiri si 5 adunari. Inmultite cu 236 de sectiuni, da peste 1000 de inmultiri si adunari. Cred ca era mai eficient cu un FIR cu 200 de coeficienti.

 

Acum nu stiu sa iau pe b0 = 9.1789e-013 sau b0 = 1 in calcule ?
Intai ca nu sunt convins ca e corect. Verifica-ti caracteristica filtrului rezultat cu functia freqz. In al doilea rand, ceva inmultit cu 10^-13 e mai aproape de 0 decat de 1 :)

 

Despre codul Matlab

Intai te-as ruga sa-l postezi text, ca sa nu mai trebuiasca sa il scriu eu de mana. Apoi, ceea ce-i ceri filtrului este de balamuc. Tu vrei sa creasca atenuarea de la 0 la 40dB intr-un hertz. Nu se poate asa ceva. Trebuie sa te porti rezonabil cu el. Asa cum am spus mai sus, incearca sa aplici o functie freqz pe coeficientii obtinuti, ca sa ii vezi caracteristica. E clar ca e in sfecla, pentru ca amplificarea in banda de trecere este de 250dB (!!!). Daca ii incarci asa in dsPIC, nu are cum sa mearga.

 

Parerea mea este sa ne mentinem numai in Matlab, deocamdata. Dupa ce zbarnaie in matlab, ne ocupam de implementare. In acest spirit, nu mai posta fisiere mamut din MPLAB. Eu nu ma uit pe ele. Atata timp cat algoritmul nu merge, nu are sens sa incerci sa-l incarci in procesor.

 

Am niste fisiere mai vechi de-ale tale si o sa incerc, in limita timpului, sa filtrez canalul 7 si sa ti-l trimit, sa vedem daca il poti demodula cu procesorul celalalt. As incerca sa il si demodulez, dar sunt prins cu niste chestii personale. Vedem ...

 

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