Vai al contenuto
PLC Forum


Scalare guadagni usando formato q1.15


peppe855

Messaggi consigliati

Buona sera, sto' studiando da circa un mesetto il dspic30f o per lo meno le sue periferiche più importanti. Leggendo il manuale sul adc a 10bit mi sono reso conto che tale periferica permette di ottenere in uscite varie formattazioni per il risultato e tra queste c'è quella denominata q1.15 ora essendo io parecchio 'ignorante' dal punto di vista informatico ho approfondito la cosa ed ho scoperto che tale modalità di rappresentazione numerica è molto utilizzata nel mondo dsp, in quanto la maggior parte delle librerie messe a disposizione dalla casa madre richiedono in ingresso (e forniscono in uscita) valori compresi in decimale tra [-1 , 1)  mentre in binario nella forma appunto 1.15 in cui il brimo bit è di segno e i restanti sono la parte frazionaria.
Bene fin qui nessun problema nel senso che ho compreso (o almeno credo) che qualsiasi numero decimale che sia inferiore all'unita puo' essere riportato nel formato q1.15 semplicemente moltiplicandolo per 2^15, queste operazioni di portarsi in q1.15 danno il beneficio di non portarti all' overflow (e di perdere poco in fatto di risoluzione), quindi in caso si debba eseguire un'operazione in cui i valori iniziali sono ad es:
a=0.3; b=0.1; io posso in fase di settaggio moltiplicare entrambi per 2^15 ottenendo:
int a=00100110 01100110; int b=00001100 11001100
ora da un libro di testo apprendo che se dopo tale operazione volessi fare il prodotto c=a*b; avrei un risultato a 32 bit in formato q2.30 che va' quindi riportato in q1.15 facendo queste operazioni: shiftando di un bit a sinistra c<<1 (cosi ho il risultato in formato 1.31) e considerando come risultato i soli bit da 16 a 31 per poterli usare nelle operazioni seguenti con altri numeri a 16 bit.
Ora facendo queste operazioni in simulazioni in MPLAB scopro che c= 00000000 00000000 11000010 10010000 e che quindi i bit da 16 a 31 sono tutti nulli.
Domande (finalmente):
1) Dov'è l'inghippo?
2) Ma questa notazione q1.15 prevede gia' che i valori in base10 siano inferiori all'unità, quindi se ad esempio in un calcolo un parametro non è 0.3 0 in generale <1 come posso restare coerente con questa rappresentazione? (dovrei fare una pre-scalatura?)
Spero che il preambolo non sia stato troppo pesante e che la domanda non sia troppo banale, come sempre grazie!

Link al commento
Condividi su altri siti


In pratica se dichiaro int a,b; long int c; ed eseguo come ho scritto sopra cioè a=0.3*32768; b=0.1*32768; c=a*b;
c<<1; il risultato è quello di sopra e mi risulta errato, se invece a e b non li dichiaro come variabili e faccio direttamente il calcolo c=(0.3*32768)*(0.1*32768);
c<<1;

allora i conti tornano, quale puo' essere il motivo?

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...