Changeset 5573

Show
Ignore:
Timestamp:
10/29/07 13:39:26 (6 years ago)
Author:
jgaeddert
Message:

removing costas loop processing block from frame synchronizer; consumes too much processing; carrier offset estimation works MUCH better

Location:
experimental/components/SymbolSyncPoly/branches/SymbolSyncPoly-metadata/src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • experimental/components/SymbolSyncPoly/branches/SymbolSyncPoly-metadata/src/FrameSynchronizerDSP.cpp

    r5561 r5573  
    4545    UpdatePhaseLoopFilterCoefficients(0.0025f); 
    4646    UpdateTimingLoopFilterCoefficients(ALPHA_T_HI, BETA_T_HI); 
    47  
    48     // Costas loop 
    49     pd2_cl = 0.0f; 
    50     tmp2_cl = 0.0f; 
    51     q_hat_cl = 0.0f; 
    52     q_prime_cl = 0.0f; 
    53     UpdateCostasLoopFilterCoefficients(0.02f); 
    5447 
    5548    e_i = 0; 
     
    7366    input_log.close(); 
    7467#endif 
    75 } 
    76  
    77 // Find frame header using Costas loop 
    78 bool FrameSynchronizerDSP::FindFrameHeaderCostasLoop( 
    79     short * I_in, 
    80     short * Q_in, 
    81     unsigned int input_length, 
    82     unsigned int &num_read, 
    83     short * I_out, 
    84     short * Q_out, 
    85     unsigned int output_length, 
    86     unsigned int &num_written) 
    87 { 
    88     alpha_s = 0.027f; 
    89     beta_s = 1.02f; 
    90  
    91     int i(0); 
    92     short I, Q; 
    93     num_read = 0; 
    94     num_written = 0; 
    95     //printf("nco CV = %f\n", cv/(2*PI)); 
    96  
    97     while ( i < (signed int) input_length ) { 
    98         v++; 
    99  
    100         // apply nco to input sample 
    101         ApplyNCO(I_in[i], Q_in[i], I, Q); 
    102         //I = I_in[i]; 
    103         //Q = Q_in[i]; 
    104         i++; 
    105  
    106         // push samples into buffer 
    107         PushInput(I, Q); 
    108  
    109         // compute filtered outputs (stored in mf_i, mf_q) 
    110         ComputeFilterBankOutputs(); 
    111          
    112         // compute costas loop phase error on matched-filter outputs 
    113         ///\todo matched filter output won't work because of delay 
    114         pd2_cl = GenerateCostasLoopPhaseError(I, Q); 
    115         //pd2_cl = GenerateCostasLoopPhaseError(mf_i, mf_q); 
    116         pd2_cl /= Ac; 
    117          
    118         // advance costas loop filter 
    119         AdvanceCostasLoopFilter(); 
    120  
    121         // update nco 
    122         UpdateNCO(); 
    123             //I_out[num_written] = mf_i; 
    124             //Q_out[num_written] = mf_q; 
    125             //num_written++; 
    126  
    127         // decimate 
    128         if ( v >= (signed int) k ) { 
    129             // enable output 
    130             v -= k; 
    131             I_out[num_written] = mf_i; 
    132             Q_out[num_written] = mf_q; 
    133             num_written++; 
    134             //printf("I = %d, Q = %d\n", mf_i, mf_q); 
    135  
    136             // generate timing error 
    137             GenerateTimingError(); 
    138  
    139             // advance timing loop filter 
    140             AdvanceTimingLoopFilter(); 
    141  
    142             // compute filter bank index 
    143             ComputeFilterBankIndex(); 
    144  
    145             // update v 
    146             switch (lc) { 
    147             case SHIFT: 
    148                 // normal operation; do nothing 
    149                 break; 
    150             case SKIP: 
    151                 v--; 
    152                 //printf("skip\n"); 
    153                 lc = SHIFT; 
    154                 break; 
    155             case STUFF: 
    156                 v++; 
    157                 //printf("stuff\n"); 
    158                 lc = SHIFT; 
    159                 break; 
    160             default:; 
    161             } 
    162  
    163             // push sample into buffer 
    164             inputBuffer.Push(mf_i); 
    165             r = CorrelateSequence( pnFrameSyncCode, 255 ); 
    166  
    167             if ( abs(r) > int( Ac/2 ) ) { 
    168                 r_frame_sync = abs(r); 
    169                 std::cout << "PN FRAME SYNC CODE FOUND!!!" << std::endl; 
    170                 std::cout << "  r = " << r_frame_sync << std::endl; 
    171  
    172                 // check for phase inversion; if so inject pi radians into NCO 
    173                 // [not sure how well this will work with band-limited pulse shapes] 
    174                 if ( r<0 ) { 
    175                     std::cout << "  [Frame sync found negative PN code]" << std::endl; 
    176                     nco_control += PI; 
    177                 } 
    178  
    179                 operationalMode = EXTRACT_CONTROL_CODES; 
    180                 inputBuffer.Release(); 
    181                 numControlCodesReceived = 0; 
    182  
    183                 //num_read = i+1; 
    184                 //return true; 
    185  
    186                 // reduce bandwidth of loop filters for steady tracking mode 
    187                 //UpdatePhaseLoopFilterCoefficients(0.0025f); 
    188                 //UpdateTimingLoopFilterCoefficients(ALPHA_T_LO, BETA_T_LO); 
    189  
    190             } 
    191  
    192         } 
    193     } 
    194      
    195     num_read = input_length; 
    196     return false; 
    19768} 
    19869 
  • experimental/components/SymbolSyncPoly/branches/SymbolSyncPoly-metadata/src/FrameSynchronizerDSP.h

    r5472 r5573  
    6464    /// Destructor 
    6565    ~FrameSynchronizerDSP(); 
    66  
    67     /// \brief Uses a CostasLoop to lock to the carrier, correlates with P/N sequence 
    68     FRAME_SYNCHRONIZER_DEFINE_API(FindFrameHeaderCostasLoop) 
    6966 
    7067    // Finds the frame header P/N sync code 
     
    147144    unsigned int header_phase_lock_delay_counter; 
    148145 
    149     // Costas loop methods 
    150  
    151     void UpdateCostasLoopFilterCoefficients(float _BT_cl) { 
    152         BT_cl = _BT_cl; 
    153         float k1(1.0f); 
    154         float XI(0.707106781186547f); 
    155  
    156         beta_cl = 2*BT_cl/(XI+1/(4*XI))/k1; 
    157         alpha_cl = 2*XI*beta_cl; 
    158  
    159         printf("\n\nbeta_cl = %f\n\n\n", beta_cl); 
    160         printf("\n\nalpha_cl = %f\n\n\n", alpha_cl); 
    161  
    162         ///\todo this is necessary because of the delay introduced by the filter 
    163         //beta_cl /= 30.0f; 
    164     }; 
    165  
    166     float GenerateCostasLoopPhaseError(short I, short Q) { 
    167         return ( I > 0 ) ? (float) Q : (float) -Q; 
    168     } 
    169  
    170     void AdvanceCostasLoopFilter() { 
    171         q_prime_cl = pd2_cl*beta_cl + tmp2_cl; 
    172         q_hat_cl = alpha_cl*pd2_cl + q_prime_cl; 
    173         tmp2_cl = q_prime_cl; 
    174          
    175         // store filtered error signal in external variable 
    176         q_hat_c = q_hat_cl; 
    177     } 
    178      
    179     // Costas loop variables 
    180     float BT_cl;        ///< Bandwidth-time product of Costas loop filter 
    181     float alpha_cl;     ///< Costas loop filter feedback coefficient 
    182     float beta_cl;      ///< Costas loop filter feedforward coefficient 
    183  
    184     float pd2_cl;       ///< 
    185     float tmp2_cl;      ///< 
    186     float q_hat_cl;     ///< 
    187     float q_prime_cl;   ///< 
    188  
    189146  private: 
    190147    /// Disallow copy constructor