Changeset 4184

Show
Ignore:
Timestamp:
06/14/07 21:32:43 (6 years ago)
Author:
hvolos
Message:

Added some throws to ensure sanity

Location:
SigProc/trunk/SigProc
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • SigProc/trunk/SigProc/SigProc.h

    r4150 r4184  
    4444class TrellisEntry{ 
    4545    public: 
     46        ///Contructor 
     47        TrellisEntry(); 
     48        ///Destructor 
     49        ~TrellisEntry();         
    4650        unsigned int previousState; ///< The state prior to the current state, used for tracing back the trellis 
    4751        unsigned short int symbolNo; ///< The symbol that caused the change of state to the currrent state 
     
    7781        void GenerateTrellisTable(unsigned int * generatorPolynomials); 
    7882 
    79         ///Peforms modulo 2 addition to the bits of the input number (symbol) 
     83        ///Performs modulo 2 addition to the bits of the input number (symbol) 
    8084        unsigned short int Modulo2BitWiseAdd(unsigned short int inputNumber); 
    8185}; 
  • SigProc/trunk/SigProc/fec_conv.cpp

    r4176 r4184  
    2525#include <math.h> 
    2626 
     27 
    2728namespace SigProc { 
    2829 
     30//----------------------------Trellis Entry------------------------------------- 
     31TrellisEntry::TrellisEntry() 
     32{ 
     33    previousState=0; 
     34    symbolNo=0; 
     35    distance=-1; 
     36} 
     37 
     38TrellisEntry::~TrellisEntry() 
     39{ 
     40 
     41 
     42} 
     43 
     44//----------------------------trellisTable-------------------------------------- 
     45 
    2946trellisTable::trellisTable( 
    30 unsigned int * generatorPolynomials, 
    31 unsigned short int k, 
    32 unsigned short int n, 
    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) 
    3451{ 
    3552    //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; 
    3956 
    4057    //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    //} 
    4562    //std::cout<<std::endl; 
    4663 
    4764    //std::cout<<"Input bits:"<<k<<" Contraint Length:"<<K<<std::endl; 
     65    trellisTable::nextState=NULL; 
     66    trellisTable::output=NULL; 
    4867    trellisTable::GenerateTrellisTable(generatorPolynomials); 
    4968} 
     
    5271{ 
    5372    //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    } 
    6486} 
    6587 
     
    6789void trellisTable::GenerateTrellisTable(unsigned int * generatorPolynomials) 
    6890{ 
    69  
    7091    numberOfTrellisStates=int(pow(2,(k*(K-1)))); 
    7192    numberOfInputStates=int(pow(2,k)); 
     93 
    7294    //std::cout<<"NumberOfTrellisStates="<<numberOfTrellisStates<<std::endl; 
    7395    //std::cout<<"numberOfInputStates="<<numberOfInputStates<<std::endl; 
     
    79101    } 
    80102 
     103 
    81104    output = new unsigned int *[numberOfTrellisStates]; 
    82  
    83105    for (unsigned int i = 0; i < numberOfTrellisStates; i++){ 
    84106        output[i] = new unsigned int[numberOfInputStates]; 
    85107    } 
    86108 
    87     unsigned int ENCregister, tempOut; 
     109    unsigned int ENCregister=0, tempOut=0; 
    88110 
    89111    for (unsigned int tstate=0;tstate<numberOfTrellisStates;tstate++){ 
    90112        //std::cout<<tstate<<":"; 
    91113        for (unsigned short int inputIdx=0;inputIdx<numberOfInputStates;inputIdx++){ 
     114 
    92115            ENCregister=inputIdx*numberOfTrellisStates+tstate; 
    93116            nextState[tstate][inputIdx]=(unsigned int)floor(ENCregister/pow(2,k)); 
     
    98121                //      <<"power:"<<(unsigned short int)pow(2,n-bitNo-1)<<"tempOut:"<<tempOut<<"\n"; 
    99122                // std::cout<<"Mod2add:"<<Modulo2BitWiseAdd((ENCregister&generatorPolynomials[bitNo])*(unsigned short int)pow(2,n-bitNo-1))<<"\n"; 
     123 
    100124                tempOut+=Modulo2BitWiseAdd(ENCregister&generatorPolynomials[bitNo])* (unsigned short int)pow(2,n-bitNo-1); 
    101125            } 
     
    112136{ 
    113137    //std::cout<<"IN:"<<inputNumber; 
    114     unsigned int tempOut; 
     138    unsigned int tempOut=0; 
    115139    tempOut=inputNumber % 2; 
    116140    inputNumber>>=1; 
     141 
    117142    while (inputNumber>0){ 
    118143        tempOut^=inputNumber % 2; 
     
    123148} 
    124149 
     150 
     151//-------------------------------fec_conv-------------------------------------- 
     152 
    125153void fec_conv::SetTrellisTable(trellisTable *theTrellisTableIn) 
    126154{ 
     
    133161    for (i=numberOfBits;i>0;i--){ 
    134162        outputData[i-1]=decNumber % 2; 
    135         decNumber>>=1; 
     163 
     164        if (decNumber>0) decNumber>>=1; 
    136165    } 
    137166} 
     
    168197        inbits+=tmp; 
    169198    } 
     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 
    170206    //std::cout<<"state:"<<currentState<<" inbits:"<<inbits<<" outbits:"<<outbits<<"\n"; 
    171207    outbits=theTrellisTable->output[currentState][inbits]; 
     
    176212} 
    177213 
     214//------------------------------Decoder----------------------------------------- 
     215fec_conv_decoder::fec_conv_decoder() 
     216{ 
     217    tracedBackSymbols=NULL; 
     218    theTrellis=NULL; 
     219    decodedSymbolIndex=0; 
     220    currentTrellisIndex=0; 
     221    mode=0; 
     222} 
     223 
     224fec_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}; 
    178237void fec_conv_decoder::SetMode(unsigned short int mode) 
    179238{ 
     
    246305        inbits+=tmp; 
    247306    } 
     307 
     308    
    248309    //std::cout<<"inbits:"<<inbits<<"\n"; 
    249310    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 
    250323    //std::cout<<"currentTrellisIndex:"<<currentTrellisIndex<<"\n"; 
    251324    for (unsigned int tstate=0;tstate<theTrellisTable->numberOfTrellisStates;tstate++){ 
     
    340413            outputData, 
    341414            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     
    342419        } 
    343420         
     
    345422         
    346423    } 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 
    372430 
    373431} // namespace SigProc