Convertir un float ou int en une valeur Q15 et réciproquement [RESOLU] - C++ - Programmation
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
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
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
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 :
|
La fonction ci-dessous permet la conversion inverse
Code :
|
//Attention, je ne l'ai testé que sur Q1.15 pour le moment, mais mathématiquement, la fonction marche.
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