root/pmsm/simulator_zdenek/ekf_example/fixed.cpp @ 79

Revision 52, 2.1 kB (checked in by smidl, 17 years ago)

zprovozneni na linuxu

Line 
1/*
2   Operace v pevne radove carce
3   
4   9.10.2005
5*/
6
7
8#include "fixed.h"
9
10long prevod(double x, unsigned int posun);
11// prevod "x" do systemu "Qposun"
12double zprevod(long x, unsigned int posun);
13// prevod "x" ze systemu "Qposun" do DOUBLE
14long nasob(int x, int y,unsigned int posun);
15// (x*y)>>posun
16int deleni15(int x, int y);
17// (x*Q15/y) se saturaci
18int deleni(int x, int y, int posun1, int posun2, int scale, int posun_fin);
19// obecne deleni: x_"Qposun1"*"Qscale"/y_"Qposun2" -> "Q_posun_fin"
20
21 
22long prevod(double x, unsigned int posun)
23{
24  long y,nasobic;
25  int znamenko;
26 
27  nasobic=(long)1<<posun;
28  if (x>=0) znamenko=1;
29  else znamenko=-1;
30  y=(long)(x*nasobic+znamenko*0.5);
31 
32  return y;
33}
34
35double zprevod(long x, unsigned int posun)
36{
37  long nasobic;
38  double y;
39 
40  nasobic=(long)1<<posun;
41  y=(double)x/nasobic;
42 
43  return y;
44}
45
46long nasob(int x, int y,unsigned int posun)
47{
48  long z,zaokrouhl;                     // zaokrouhl ... zaokrouhlovani vysledku pricteni 0.5
49  int znamenko;
50 
51  if (posun>0)
52    zaokrouhl=(long)1<<(posun-1);
53  else zaokrouhl=0;
54  z=(long)x*y;
55  if (z>=0) znamenko=1;
56  else znamenko=-1;
57  z=(z+znamenko*zaokrouhl)>>posun;
58 
59  return z;
60}
61
62int deleni15(int x, int y)   // deleni Q15/Q15 se saturaci
63{
64  long z;
65   
66  z=(long)x*32768/y;
67  if (z>32767) z=32767;
68  if (z<-32768) z=-32768; 
69 
70  return (int)z;
71}
72
73int deleni(int x, int y, int posun1, int posun2, int scale, int posun_fin) 
74/*
75x/y    ... podil
76posun1 ... posun x (scale faktor)
77posun2 ... posun y
78scale  ... posun pri deleni - pomocny
79posun_fin ... system, ve kterem ma byt vysledek (scale faktor vysledku)
80*/
81{
82  int z;
83  int bit_posun;
84  long zz, scale_fakt, scale_fin;
85 
86  scale_fakt=(long)1<<scale;
87  bit_posun=(posun1+scale-posun2)-posun_fin;
88 
89  zz=(long)x*scale_fakt/y;
90
91  if (bit_posun>=0)
92    zz=(int)(zz>>bit_posun);
93  else
94  { bit_posun*=-1;
95    zz=(int)(zz<<bit_posun);
96  }
97 
98  // Saturace vystupu
99  if (zz>32767)
100    z=32767;
101  else if (zz<-32768)
102    z=-32768;
103  else
104    z=zz;
105 
106  return z;
107}
Note: See TracBrowser for help on using the browser.