Changeset 4184
- Timestamp:
- 06/14/07 21:32:43 (6 years ago)
- Location:
- SigProc/trunk/SigProc
- Files:
-
- 2 modified
-
SigProc.h (modified) (2 diffs)
-
fec_conv.cpp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
SigProc/trunk/SigProc/SigProc.h
r4150 r4184 44 44 class TrellisEntry{ 45 45 public: 46 ///Contructor 47 TrellisEntry(); 48 ///Destructor 49 ~TrellisEntry(); 46 50 unsigned int previousState; ///< The state prior to the current state, used for tracing back the trellis 47 51 unsigned short int symbolNo; ///< The symbol that caused the change of state to the currrent state … … 77 81 void GenerateTrellisTable(unsigned int * generatorPolynomials); 78 82 79 ///Pe forms modulo 2 addition to the bits of the input number (symbol)83 ///Performs modulo 2 addition to the bits of the input number (symbol) 80 84 unsigned short int Modulo2BitWiseAdd(unsigned short int inputNumber); 81 85 }; -
SigProc/trunk/SigProc/fec_conv.cpp
r4176 r4184 25 25 #include <math.h> 26 26 27 27 28 namespace SigProc { 28 29 30 //----------------------------Trellis Entry------------------------------------- 31 TrellisEntry::TrellisEntry() 32 { 33 previousState=0; 34 symbolNo=0; 35 distance=-1; 36 } 37 38 TrellisEntry::~TrellisEntry() 39 { 40 41 42 } 43 44 //----------------------------trellisTable-------------------------------------- 45 29 46 trellisTable::trellisTable( 30 unsigned int * generatorPolynomials,31 unsigned short int k,32 unsigned short intn,33 unsigned short K)47 unsigned int * generatorPolynomials, 48 unsigned short int k_in, 49 unsigned short int n_in, 50 unsigned short K_in) 34 51 { 35 52 //Build trellis table 36 trellisTable::k=k ;37 trellisTable::n=n ;38 trellisTable::K=K ;53 trellisTable::k=k_in; 54 trellisTable::n=n_in; 55 trellisTable::K=K_in; 39 56 40 57 //std::cout<<"Constructor, generatorPolynomials:"; 41 for (int i=0;i<n;i++){42 43 std::cout<<generatorPolynomials[i]<<" ";44 }58 // for (int i=0;i<n;i++){ 59 60 // std::cout<<generatorPolynomials[i]<<" "; 61 //} 45 62 //std::cout<<std::endl; 46 63 47 64 //std::cout<<"Input bits:"<<k<<" Contraint Length:"<<K<<std::endl; 65 trellisTable::nextState=NULL; 66 trellisTable::output=NULL; 48 67 trellisTable::GenerateTrellisTable(generatorPolynomials); 49 68 } … … 52 71 { 53 72 //Deallocate memory 54 for (unsigned int i = 0; i < trellisTable::numberOfTrellisStates; i++){ 55 delete []trellisTable::nextState[i]; 56 } 57 delete []trellisTable::nextState; 58 59 60 for (unsigned int i = 0; i < trellisTable::numberOfTrellisStates; i++){ 61 delete []trellisTable::output[i]; 62 } 63 delete []trellisTable::output; 73 if (trellisTable::nextState!=NULL){ 74 for (unsigned int i = 0; i < trellisTable::numberOfTrellisStates; i++){ 75 delete []trellisTable::nextState[i]; 76 } 77 delete []trellisTable::nextState; 78 } 79 80 if (trellisTable::output!=NULL){ 81 for (unsigned int i = 0; i < trellisTable::numberOfTrellisStates; i++){ 82 delete []trellisTable::output[i]; 83 } 84 delete []trellisTable::output; 85 } 64 86 } 65 87 … … 67 89 void trellisTable::GenerateTrellisTable(unsigned int * generatorPolynomials) 68 90 { 69 70 91 numberOfTrellisStates=int(pow(2,(k*(K-1)))); 71 92 numberOfInputStates=int(pow(2,k)); 93 72 94 //std::cout<<"NumberOfTrellisStates="<<numberOfTrellisStates<<std::endl; 73 95 //std::cout<<"numberOfInputStates="<<numberOfInputStates<<std::endl; … … 79 101 } 80 102 103 81 104 output = new unsigned int *[numberOfTrellisStates]; 82 83 105 for (unsigned int i = 0; i < numberOfTrellisStates; i++){ 84 106 output[i] = new unsigned int[numberOfInputStates]; 85 107 } 86 108 87 unsigned int ENCregister , tempOut;109 unsigned int ENCregister=0, tempOut=0; 88 110 89 111 for (unsigned int tstate=0;tstate<numberOfTrellisStates;tstate++){ 90 112 //std::cout<<tstate<<":"; 91 113 for (unsigned short int inputIdx=0;inputIdx<numberOfInputStates;inputIdx++){ 114 92 115 ENCregister=inputIdx*numberOfTrellisStates+tstate; 93 116 nextState[tstate][inputIdx]=(unsigned int)floor(ENCregister/pow(2,k)); … … 98 121 // <<"power:"<<(unsigned short int)pow(2,n-bitNo-1)<<"tempOut:"<<tempOut<<"\n"; 99 122 // std::cout<<"Mod2add:"<<Modulo2BitWiseAdd((ENCregister&generatorPolynomials[bitNo])*(unsigned short int)pow(2,n-bitNo-1))<<"\n"; 123 100 124 tempOut+=Modulo2BitWiseAdd(ENCregister&generatorPolynomials[bitNo])* (unsigned short int)pow(2,n-bitNo-1); 101 125 } … … 112 136 { 113 137 //std::cout<<"IN:"<<inputNumber; 114 unsigned int tempOut ;138 unsigned int tempOut=0; 115 139 tempOut=inputNumber % 2; 116 140 inputNumber>>=1; 141 117 142 while (inputNumber>0){ 118 143 tempOut^=inputNumber % 2; … … 123 148 } 124 149 150 151 //-------------------------------fec_conv-------------------------------------- 152 125 153 void fec_conv::SetTrellisTable(trellisTable *theTrellisTableIn) 126 154 { … … 133 161 for (i=numberOfBits;i>0;i--){ 134 162 outputData[i-1]=decNumber % 2; 135 decNumber>>=1; 163 164 if (decNumber>0) decNumber>>=1; 136 165 } 137 166 } … … 168 197 inbits+=tmp; 169 198 } 199 200 if (inbits>(unsigned int)(theTrellisTable->numberOfInputStates-1)){ 201 std::cout<<"ERROR:fec_conv_encoder::Encode inbits>numberOfInputStates-1"; 202 std::cout<<"inbits:"<<inbits<<" numberOfInputStates:"<<theTrellisTable->numberOfInputStates; 203 throw 0; 204 }; 205 170 206 //std::cout<<"state:"<<currentState<<" inbits:"<<inbits<<" outbits:"<<outbits<<"\n"; 171 207 outbits=theTrellisTable->output[currentState][inbits]; … … 176 212 } 177 213 214 //------------------------------Decoder----------------------------------------- 215 fec_conv_decoder::fec_conv_decoder() 216 { 217 tracedBackSymbols=NULL; 218 theTrellis=NULL; 219 decodedSymbolIndex=0; 220 currentTrellisIndex=0; 221 mode=0; 222 } 223 224 fec_conv_decoder::~fec_conv_decoder() 225 { 226 if (tracedBackSymbols!=NULL) delete []tracedBackSymbols; 227 228 if (theTrellis!=NULL){ 229 for (unsigned int i = 0; i < theTrellisTable->numberOfTrellisStates; i++){ 230 delete theTrellis[i]; 231 }; 232 233 delete []theTrellis; 234 } 235 236 }; 178 237 void fec_conv_decoder::SetMode(unsigned short int mode) 179 238 { … … 246 305 inbits+=tmp; 247 306 } 307 308 248 309 //std::cout<<"inbits:"<<inbits<<"\n"; 249 310 currentTrellisIndex++; 311 312 if (currentTrellisIndex>noOfSymbols2TraceBack){ 313 std::cout<<"ERROR:fec_conv_decoder::Symbol2Decode currentTrellisIndex>Traceback length"; 314 throw 0; 315 }; 316 317 if (inbits>(unsigned int)(pow(theTrellisTable->n,2)-1)){ 318 std::cout<<"ERROR:fec_conv_decoder::Symbol2Decode inbits>2^n-1\n"; 319 std::cout<<"inbits:"<<inbits<<" numberOfInputStates:"<<pow(theTrellisTable->n,2)-1; 320 throw 0; 321 }; 322 250 323 //std::cout<<"currentTrellisIndex:"<<currentTrellisIndex<<"\n"; 251 324 for (unsigned int tstate=0;tstate<theTrellisTable->numberOfTrellisStates;tstate++){ … … 340 413 outputData, 341 414 theTrellisTable->k); 415 } else { 416 std::cout<<"ERROR: fec_conv_decoder::GetDecodedSymbol attempt to get more symbols of what is available\n"; 417 throw 0; 418 342 419 } 343 420 … … 345 422 346 423 } else { 347 } 348 } 349 350 fec_conv_decoder::fec_conv_decoder() 351 { 352 tracedBackSymbols=NULL; 353 theTrellis=NULL; 354 decodedSymbolIndex=0; 355 currentTrellisIndex=0; 356 mode=0; 357 } 358 359 fec_conv_decoder::~fec_conv_decoder() 360 { 361 if (tracedBackSymbols!=NULL) delete []tracedBackSymbols; 362 363 if (theTrellis!=NULL){ 364 for (unsigned int i = 0; i < theTrellisTable->numberOfTrellisStates; i++){ 365 delete theTrellis[i]; 366 }; 367 368 delete []theTrellis; 369 } 370 371 }; 424 std::cout<<"ERROR: fec_conv_decoder::GetDecodedSymbol trellis wasnt traced back properly\n"; 425 throw 0; 426 } 427 } 428 429 372 430 373 431 } // namespace SigProc