Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2352 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1366734
gwenCPP
Je taf
Posté le 15-05-2006 à 17:37:02  profilanswer
 

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
mood
Publicité
Posté le 15-05-2006 à 17:37:02  profilanswer
 

n°1367045
IrmatDen
Posté le 16-05-2006 à 00:44:15  profilanswer
 

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
n°1367110
gwenCPP
Je taf
Posté le 16-05-2006 à 09:13:54  profilanswer
 

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
n°1367345
gwenCPP
Je taf
Posté le 16-05-2006 à 11:55:06  profilanswer
 

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
n°1368756
gwenCPP
Je taf
Posté le 17-05-2006 à 14:25:58  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[RESOLU][SQL SERVER] Problème de curseur[Resolu] BATCH - comment executer un programme 32 bit ?
php pas interpreté completement par IIS [RESOLU][Delphi] Application Multi-lingue [résolu]
[résolu]mysql clé étrangère dans une autre base de donnéesModifier liens avec à onchange [RESOLU]
[resolu] Caractere d'echappement (il m'en manque un)[Résolu]Lecture de fichier qui lit que le premier caractère
[Résolu] Problème d'encodage de String.[Résolu] Arrêter un Thread qui attend un paquet sur un DatagramSocket
Plus de sujets relatifs à : [RESOLU]Convertir un float ou int en une valeur Q15 et réciproquement


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR