peppe855 Inserito: 10 agosto 2016 Segnala Inserito: 10 agosto 2016 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!
peppe855 Inserita: 11 agosto 2016 Autore Segnala Inserita: 11 agosto 2016 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?
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora