Jump to content
PLC Forum


peppe855

Scalare guadagni usando formato q1.15

Recommended Posts

peppe855

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 to comment
Share on other sites


peppe855

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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...