Q15 Library
mikroC PRO for PIC32 includes a library for operating and working with Q15 fractional number format.
Library Routines
- Q15_Abs
 - Q15_Add
 - Q15_Sub
 - Q15_Itof
 - Q15_Ftoi
 - Q15_Itoa
 - Q15_Atoi
 - Q15_Sin
 - Q15_Cos
 - Q15_Tan
 - Q15_Asin
 - Q15_Acos
 - Q15_Atan
 - Q15_Log
 
Q15_Abs
| Prototype | 
 unsigned int Q15_Abs (int in, int *out);  | 
|---|---|
| Description | 
 Function calculates absolute value of the Q15 fractional format number.  | 
| Parameters | 
  | 
| Returns | 
 Function always returns zero.  | 
Q15_Add
| Prototype | 
 unsigned int Q15_Add(int in1, int in2, int *out);  | 
|---|---|
| Description | 
 Function sums two Q15 format numbers. If the result exceeds [-32768, 32767] limits, result will be maximal(minimal) number in Q15 format.  | 
| Parameters | 
  | 
| Returns | 
  | 
Q15_Sub
| Prototype | 
 unsigned int Q15_Sub(int in1, int in2, int *out);  | 
|---|---|
| Description | 
 Function subtracts two Q15 format numbers. If the result exceeds [-32768, 32767] limits, result will be maximal(minimal) number in Q15 format.  | 
| Parameters | 
  | 
| Returns | 
  | 
Q15_Itof
| Prototype | 
 unsigned int Q15_Itof(int x, float *f);  | 
|---|---|
| Description | 
 Function converts number from the Q15 fractional number format to floating point number format.  | 
| Parameters | 
  | 
| Returns | 
 Function always returns zero.  | 
Q15_Ftoi
| Prototype | 
 unsigned int Q15_Ftoi(float f, int *x);  | 
|---|---|
| Description | 
 Function converts number from the floating point number format to Q15 fractional number format. Input number scope should be in the range of [-1.00000, 0.99996]. If the floating point number is not in this range, the resulting number will be 0x7FFF (0x8000).  | 
| Parameters | 
  | 
| Returns | 
  | 
Q15_Itoa
| Prototype | 
 void Q15_Itoa(int x, char *s);  | 
|---|---|
| Description | 
 Function converts number from the Q15 fractional format to ASCII string. Output ASCII string is in the following format : sn.ddddddddddddddd 
 
  | 
| Parameters | 
  | 
| Returns | 
 Nothing.  | 
Q15_Atoi
| Prototype | 
 unsigned int Q15_Atoi(char *s, int* out);  | 
|---|---|
| Description | 
 Function converts the input ASCII string s into a number in Q15 fractional point format. Input ASCII string should be in the following format: sn.ddddddddddddddd 
 
  | 
| Parameters | 
  | 
| Returns | 
  | 
Q15_Cos
| Prototype | 
 int Q15_Cos(int x);  | 
|---|---|
| Description | 
 Function returns the cosine of   | 
| Parameters | 
  | 
| Returns | 
 Function returns value in the Q15 format, ranging from 17748 to 32767.  | 
Q15_Sin
| Prototype | 
 int Q15_Sin(int x);  | 
|---|---|
| Description | 
 Function returns the sine of   | 
| Parameters | 
  | 
| Returns | 
 Function returns value in the Q15 format, ranging from -27580 to 27578.  | 
Q15_Tan
| Prototype | 
 int Q15_Tan(int x);  | 
|---|---|
| Description | 
 Function returns the tangent of   | 
| Parameters | 
  | 
| Returns | 
 Function returns value in the Q15 format, ranging from -32768 to 32767.  | 
Q15_Asin
| Prototype | 
 int Q15_Asin(int x);  | 
|---|---|
| Description | 
 Function returns the arc sine of   | 
| Parameters | 
  | 
| Returns | 
 Function returns value in the Q15 format, ranging from -32768 to 32767.  | 
Q15_Atan
| Prototype | 
 int Q15_Atan(int x);  | 
|---|---|
| Description | 
 Function returns the arc tangent of   | 
| Parameters | 
  | 
| Returns | 
 Function returns value in the Q15 format, ranging from -25532 to 25509.  | 
Q15_Acos
| Prototype | 
 int Q15_Acos(int x);  | 
|---|---|
| Description | 
 Function returns the arc cosine of   | 
| Parameters | 
  | 
| Returns | 
 Function returns value in the Q15 format, ranging from 2887 to 32767.  | 
Q15_Log
| Prototype | 
 int Q15_Log(int x);  | 
|---|---|
| Description | 
 Function returns the logarithm of   | 
| Parameters | 
  | 
| Returns | 
 Function returns value in the Q15 format, ranging from -32748 to 0.  | 
Library Example
int  Q15_1, Q15_2;
int   i;
long  l;
unsigned r;
float f;
char  stringQ15[19];
void main() {
  // Q15_Ftoi
  f = 0.5;
  r = Q15_Ftoi(f, &Q15_1);                      // Q15_1 = 0x4000; r = 0;
  f = 1.5;
  r = Q15_Ftoi(f, &Q15_1);                      // Q15_1 = 0x7FFF; r = 1;
  f = -2.5;
  r = Q15_Ftoi(f, &Q15_1);                      // Q15_1 = 0x8000; r = 1;
  // Q15_Itof
  Q15_1 = 0x1000;
  r = Q15_Itof(Q15_1, &f);                      // f = 0.125; r = 0;
  // Q15_Itoa
  Q15_1 = 0xFFFF;
  Q15_Itoa(Q15_1, stringQ15);                   // stgingQ15 = "-0.000030517578125"
  // Q15_Atoi
  r = Q15_Atoi("+0.25", &Q15_1);                // Q15_1 = 0x2000; r = 0;
  r = Q15_Atoi("        +0.7", &Q15_1);         // Q15_1 = 0x5999; r = 0;
  r = Q15_Atoi("mikroe.25", &Q15_1);            // r = 2;
  // Q15_Abs
  Q15_Abs(0x8000, &Q15_1);                      // Q15_1 = 0x7FFF;
  Q15_Abs(0xE000, &Q15_1);                      // Q15_1 = 0X2000;
  
  // Q15_Add
  r = Q15_Add(0x2000, 0x4000, &Q15_1);          // Q15_1 = 0x6000; r = 0;
  r = Q15_Add(0x7000, 0x4000, &Q15_1);          // Q15_1 = 0x7FFF; r = 1;
  
  // Q15_Sub
  r = Q15_Sub(0x2000, 0x4000, &Q15_1);          // Q15_1 = 0xE000; r = 0;
  r = Q15_Sub(0x7000, 0xC000, &Q15_1);          // Q15_1 = 0x7FFF; r = 1;
  
  // Q15_Cos
  Q15_Ftoi(0.5, &Q15_1);
  Q15_2 = Q15_Cos (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = cos(0.5) = 0.8775635
  
  Q15_Ftoi(1, &Q15_1);
  Q15_2 = Q15_Cos (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = cos(1) = 0.5403023
  
  // Q15_Sin
  Q15_Ftoi(0.5, &Q15_1);
  Q15_2 = Q15_Sin (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = sin(0.5) = 0.4794006
  Q15_Ftoi(1, &Q15_1);
  Q15_2 = Q15_Sin (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = sin(1) = 0.84161138
  // Q15_Tan
  Q15_Ftoi(0.5, &Q15_1);
  Q15_2 = Q15_Tan (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = tan(0.5) = 0.54623
  Q15_Ftoi(0.78546, &Q15_1);
  Q15_2 = Q15_Tan (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = tan(0.78546) = 0.999
  // Q15_Asin
  Q15_Ftoi(0.5, &Q15_1);
  Q15_2 = Q15_Asin (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = asin(0.5) = 0.52349
  Q15_Ftoi(0.8416137, &Q15_1);
  Q15_2 = Q15_Asin (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = asin(0.8416137) = 0.999
  Q31_Ftoi(0, &Q31_1);
  Q31_2 = Q31_Asin (Q31_1);
  Q31_Itof(Q31_2, &f);                          // f = asin(0) = 0
  // Q15_Acos
  Q15_Ftoi(0.9, &Q15_1);
  Q15_2 = Q15_Acos (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = acos(0.9) = 0.451026
  Q15_Ftoi(0.8, &Q15_1);
  Q15_2 = Q15_Acos (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = acos(0.8) = 0.6430969
  // Q15_Atan
  Q15_Ftoi(0.5, &Q15_1);
  Q15_2 = Q15_Atan (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = atan(0.5) = 0.463531
  Q15_Ftoi(1, &Q15_1);
  Q15_2 = Q15_Atan (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = atan(1) = 0.778472
  // Q15_Log
  Q15_Ftoi(0.5, &Q15_1);
  Q15_2 = Q15_Log (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = log(0.5) = -0.301239
  Q15_Ftoi(1, &Q15_1);
  Q15_2 = Q15_Log (Q15_1);
  Q15_Itof(Q15_2, &f);                          // f = log(1) = 0
}
What do you think about this topic ? Send us feedback!



