CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Cordic.cc
Go to the documentation of this file.
2 
3 #include <stdint.h>
4 #include <math.h>
5 #include <vector>
6 #include <iostream>
7 #include <iomanip>
8 
9 Cordic::Cordic( const uint32_t& aPhiScale , const uint32_t& aMagnitudeBits , const uint32_t& aSteps ) : mPhiScale( aPhiScale ) , mMagnitudeScale( 1 << aMagnitudeBits ) , mMagnitudeBits( aMagnitudeBits ) , mSteps( aSteps ) , mPi( 3.1415926535897932384626433832795 )
10 {
11  mRotations.reserve( mSteps );
12 
13  double lValue( 1.0 );
14 
15  for( uint32_t lStep( 0 ); lStep!=mSteps ; ++lStep ){
16  lValue /= sqrt( 1.0 + pow( 4.0 , -double(lStep) ) );
17  mRotations.push_back( tower( atan( pow( 2.0 , -double(lStep) ) ) ) );
18  }
19  mMagnitudeRenormalization = uint32_t( round( mMagnitudeScale * lValue ) );
20 }
21 
23 
24 double Cordic::NormalizePhi( const uint32_t& aPhi)
25 {
26  return double( aPhi ) / double( mPhiScale );
27 }
28 
29 double Cordic::NormalizeMagnitude( const uint32_t& aMagnitude )
30 {
31  return double( aMagnitude ) / double( mMagnitudeScale );
32 }
33 
34 int32_t Cordic::IntegerizeMagnitude( const double& aMagnitude )
35 {
36  return int32_t( aMagnitude * mMagnitudeScale );
37 }
38 
39 uint32_t Cordic::tower( const double& aRadians )
40 {
41  return uint32_t( round( mPhiScale * 36.0 * aRadians / mPi ) );
42 }
43 
44 void Cordic::operator() ( int32_t aX , int32_t aY , int32_t& aPhi , uint32_t& aMagnitude )
45 {
46  bool lSign(true);
47 
48  switch( ((aY>=0)?0x0:0x2) | ((aX>=0)?0x0:0x1) ){
49  case 0:
50  aPhi = 0;
51  break;
52  case 1:
53  aPhi = tower( mPi );
54  lSign = false;
55  aX = -aX;
56  break;
57  case 2:
58  aPhi = tower( 2 * mPi );
59  lSign = false;
60  aY = -aY;
61  break;
62  case 3:
63  aPhi = tower( mPi );
64  aX = -aX;
65  aY = -aY;
66  break;
67  default:
68  throw 0;
69  }
70 
71  for( uint32_t lStep( 0 ); lStep!=mSteps ; ++lStep ){
72  if ( (aY < 0) == lSign ){
73  aPhi -= mRotations[ lStep ];
74  }else{
75  aPhi += mRotations[ lStep ];
76  }
77 
78  int32_t lX(aX), lY(aY);
79  if( lY < 0 ){
80  aX = lX - (lY >> lStep);
81  aY = lY + (lX >> lStep);
82  }else{
83  aX = lX + (lY >> lStep);
84  aY = lY - (lX >> lStep);
85  }
86  }
87 
88  aMagnitude = (aX * mMagnitudeRenormalization) >> mMagnitudeBits;
89 }
virtual ~Cordic()
Definition: Cordic.cc:22
uint32_t mMagnitudeBits
Definition: Cordic.h:25
int32_t IntegerizeMagnitude(const double &aMagnitude)
Definition: Cordic.cc:34
uint32_t mPhiScale
Definition: Cordic.h:23
double NormalizeMagnitude(const uint32_t &aMagnitude)
Definition: Cordic.cc:29
T sqrt(T t)
Definition: SSEVec.h:48
const double mPi
Definition: Cordic.h:30
uint32_t mSteps
Definition: Cordic.h:26
void operator()(int32_t aX, int32_t aY, int32_t &aPhi, uint32_t &aMagnitude)
Definition: Cordic.cc:44
uint32_t tower(const double &aRadians)
Definition: Cordic.cc:39
Cordic(const uint32_t &aPhiScale, const uint32_t &aMagnitudeBits, const uint32_t &aSteps)
Definition: Cordic.cc:9
uint32_t mMagnitudeScale
Definition: Cordic.h:24
std::vector< uint32_t > mRotations
Definition: Cordic.h:28
double NormalizePhi(const uint32_t &aPhi)
Definition: Cordic.cc:24
uint32_t mMagnitudeRenormalization
Definition: Cordic.h:27
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40