stecj366
Sonar is meer dan Ping...
Hallo,
Ik ben bezig in een FPGA een FIR te implementeren, maar zit nu met een praktisch probleem:
Ik heb een ADC die met een precisie van 12 bits tussen 0 en 5 V kan converteren. De aangelegde signalen zijn gebiassed op 2.5V.
Nu is mijn probleem het volgende: Ik kan de filtercoefficienten met de hand wel berekenen, en ook met matlab kan je een filter mooi ontwerpen. Maar hoe moet ik de bekomen coefficienten nu eigenlijk gaan gebruiken in mijn FPGA? Moet ik deze op een of andere manier dan gaan schalen zodat ze overeenkomen met de ingelezen spanningen?
In de datasheet staat iets van
VCH_=LSB*CODE10, waarbij LSB de waarde van 000...01 is. Kan ik dan de coefficienten voor mijn ADC berkenen op deze manier:
Coeff'=Coeff/LSB, waarbij Coeff' de nieuwe waarde voor de coefficient is?
Heeft iemand al ervaring met het implementeren van een (FIR)Filter op deze manier? Hoe wordt dat gedaan?
Alvast bedankt
Jan
stecj366
Sonar is meer dan Ping...
Heeft er iemand een idee?
Ik heb zelf nog wat proberen zoeken, maar niet echt iets gevonden... Het probleem is dus hoe ik de waarden vd coeff. vd FIR/IIR moet transformeren zodat ze overeenkomen met de ADC die ik gebruik.
Op 4 oktober 2006 11:19:31 schreef stecj366:
Heeft er iemand een idee?Ik heb zelf nog wat proberen zoeken, maar niet echt iets gevonden... Het probleem is dus hoe ik de waarden vd coeff. vd FIR/IIR moet transformeren zodat ze overeenkomen met de ADC die ik gebruik.
Hoi,
Ik denk dat ik snap wat je bedoelt, heb het zelf ook eens meegemaakt.
Wat ik toen deed was het volgende. Als het goed is krijg je uit matlab floating point coefficienten, om dit praktisch te kunnen implementeren zou ik het zo doen: Schaal alle coeffs zodanig dat je kleinste coeff nog net 1 is (zodat je 'm niet kwijtraakt doordat -ie nul wordt).
stel dat je floating point coeff-array x heet, kun je zeggen:
x_out=x/min(x);
Dan de boel afronden (round(x_out)) en HEEL GOED opletten dat je nu geen kwantisatie-ellende krijgt: ff beide plotten en vergelijken die hap:
En ff normaliseren voor DC/DC-gain.
x_out=x/min(x);
figure,freqz(x),hold all,freqz(round(x_out))
Net zolang tweaken tot je filter doet wat -ie moet doen met zo klein mogelijke coeffs. Ik hoop dat dit je verder kan helpen.
Vervolgens kan je de output van het filter gaan schalen met een gain die je zelf bepaalt.
Kun je hier iets mee?
LaStei
carpe cerevisi
Klopt, hoe steiler de filters, hoe lastiger het wordt om de co-effiecienten van het filter zo te keizen dat het filter doet wat het moet doen binnen het aantal bits wat je ter beschikking hebt. Ook vermenigvuldigen met constantes zodat je zo goed als alleen maar integers hebt is ook een mogelijkheid.