[RESOLU]Convertir un float ou int en une valeur Q15 et réciproquement

Convertir un float ou int en une valeur Q15 et réciproquement [RESOLU] - C++ - Programmation

Marsh Posté le 15-05-2006 à 17:37:02    

Bonjour,
 
Je communique avec un DSP via une liaison série et je dois lui envoyer des valeurs au format Q15 et q12.
J'affiche mes valeurs en int ou en float et je dois réaliser la conversion de ces valeurs en Q15 (voir Q12 dans le future).
 
Il m'arrive également de lire ces valeurs au format Q15 (Q12) sur la liaison série, je dois donc les transformer en int ou float.
 
Je cherche toutes informations pour me mettre sur la voie car je ne connais pas ce format (Q15 et Q12).
Si ça existe, je cherche même un bout de code pour cette conversion en C/C++.
 
Merci à vous.
Gwen.


Message édité par gwenCPP le 17-05-2006 à 14:26:41

---------------
Dans la vie le meilleur chemin n'est pas forcément le plus droit mais celui sur lequel on se sent le plus à l'aise
Reply

Marsh Posté le 15-05-2006 à 17:37:02   

Reply

Marsh Posté le 16-05-2006 à 00:44:15    

Salut,
Il y a ce doc qui parle de la prog des DSP, de l'arithmétique en virgule fixe et un peu de Q15. Et plus généralement de ce à quoi correspond le chiffre après le Q dans ce contexte ;)
 
Sinon, faut chercher du côté des specs de ton DSP. Une recherche sur Google en ressort plusieurs type; à toi de trouver le tien :)


Message édité par IrmatDen le 16-05-2006 à 00:45:04
Reply

Marsh Posté le 16-05-2006 à 09:13:54    

Salut,
 
 
Merci pour ta réponse, le pdf que tu as mis en lien va m'aider à réaliser ma conversion Q15 vers float.
Je post une solution dès que çà marche.
 
Gwen
 
 
 


---------------
Dans la vie le meilleur chemin n'est pas forcément le plus droit mais celui sur lequel on se sent le plus à l'aise
Reply

Marsh Posté le 16-05-2006 à 11:55:06    

Voici une demie réponse à mon problème, qui pourra je l'espère dépanner d'autres personne :
 
La fonction marche pour N = 15 mais je pense qu'elle est valable pour d'autres également.
 
q : le nombre au format Qn
n : l'indice de Qn
 
double QNToFloat(short q,unsigned char n)
{
 double x = 0.0;     // Résulat de la conversion
 bool bitsign = (q>>n)&0x01;  // Obtenir le signe de la variable au format Q15
 
 for(int i=(n-1); i>=0;i--)
 {
  // Formule de conversion
  x = ( (q>>i)&0x01) * Math::Pow(2,(-1)*(n-i)) + x;
 }
 // Nombre négatif ou positif
 if (bitsign)
 {
  x = x-1.0;
 }
 return x;
}
 
Attention : La Fonction puissance est une fonction C++ .NET, elle est à remplacer pour l'utiliser en C.
 
Il me reste à faire la même chose mais dans l'autre sens.
Si quelqu'un sait le faire, çà me dépannerait beaucoup,
 
merci d'avance,
 
Gwen


Message édité par gwenCPP le 16-05-2006 à 11:55:22

---------------
Dans la vie le meilleur chemin n'est pas forcément le plus droit mais celui sur lequel on se sent le plus à l'aise
Reply

Marsh Posté le 17-05-2006 à 14:25:58    

Re,
 
 
Mon Problème est résolu, voici le code que ça donne :
 
Le code suivant permet de généraliser la fonction du poste précédent au format DaQb (ou Qa.b si j'ai bien compris les notations)
 
 

Code :
  1. double DaQbToFloat(short q,unsigned char a, unsigned char b)
  2. {
  3. double x = 0.0;    // Résulat de la conversion
  4. bool bitsign = (q>>(a+b-1))&0x01;  // Obtenir le signe de la variable au format Q15
  5. // Nombre négatif ou positif
  6. if (bitsign)
  7. {
  8.  x = -1.0*((q>>(a+b-1))&0x01) * Math::Pow(2.0,(double)a-1);
  9. }
  10. for(int i=0; i<=(a+b-2);i++)
  11. {
  12.  // Formule de conversion
  13.  x = ( (q>>i)&0x01) * Math::Pow(2.0,(double)(i-b)) + x;
  14. }
  15. return x;
  16. }


 
 
La fonction ci-dessous permet la conversion inverse  
 

Code :
  1. short FloatToDaQb(double x,unsigned char a, unsigned char b)
  2. {
  3. short res=0;    // Résultat
  4. double x_temp = x;
  5.              // Décomposition des parties entièreset décimales fixes
  6. for(int i=(a+b-2);i>=0;i--)
  7. {
  8.  if ( 0 <= (x_temp-Math::Pow(2,i-b)) )
  9.  {
  10.   res = (0x01<<i)|res;
  11.   x_temp = x_temp-Math::Pow(2,i-b);
  12.  }
  13. }
  14.              // Gestion du bit de signe
  15. if (x >= Math::Pow(2,a-1))
  16. {
  17.  res = (0x01<<(a+b-1))|res;
  18. }
  19. return res;
  20. }


 
//Attention, je ne l'ai testé que sur Q1.15 pour le moment, mais mathématiquement, la fonction marche.


---------------
Dans la vie le meilleur chemin n'est pas forcément le plus droit mais celui sur lequel on se sent le plus à l'aise
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed