Changeset 8662

Show
Ignore:
Timestamp:
02/05/09 14:54:40 (4 years ago)
Author:
ttsou
Message:

integrated GNU Radio block for clock recovery

Location:
ossiedev/branches/ttsou/dist/components/gmsk_demod
Files:
2 added
3 modified

Legend:

Unmodified
Added
Removed
  • ossiedev/branches/ttsou/dist/components/gmsk_demod/configure.ac

    r8636 r8662  
    2020 
    2121AX_BOOST_BASE([1.35]) 
     22AX_BOOST_THREAD 
    2223CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" 
    2324CFLAGS="$CFLAGS $BOOST_CPPFLAGS" 
     
    2829AC_CHECK_HEADERS([standardinterfaces/complexShort.h], [], [AC_MSG_ERROR([cannot find standardInterfaces header files])]) 
    2930 
     31AC_CHECK_LIB([gnuradio-core], [main], [], [AC_MSG_ERROR([cannot find gnuradio library])],[$BOOST_LDFLAGS $BOOST_THREAD_LIB]) 
     32AC_CHECK_HEADERS([gnuradio/gr_count_bits.h], [], [AC_MSG_ERROR([cannot find gnuradio header files])]) 
     33 
    3034AC_LANG_POP 
    3135 
     
    3337 
    3438PKG_CHECK_MODULES(OSSIE, ossie >= 0.6.0,,exit) 
    35 CXXFLAGS="$CXXFLAGS $OSSIE_CFLAGS" 
     39CXXFLAGS="$CXXFLAGS $OSSIE_CFLAGS $CPPFLAGS $BOOST_LDFLAGS $BOOST_THREAD_LIB -I/usr/local/include/gnuradio" 
    3640IDL_FLAGS="$OSSIE_CFLAGS" 
    3741AC_SUBST(IDL_FLAGS) 
  • ossiedev/branches/ttsou/dist/components/gmsk_demod/gmsk_demod.cpp

    r8636 r8662  
    2424#include <iostream> 
    2525#include "gmsk_demod.h" 
     26#include <gr_clock_recovery_mm_ff.h> 
    2627 
    2728gmsk_demod_i::gmsk_demod_i(const char *uuid, omni_condition *condition) :  
     
    114115    PortTypes::ShortSequence *i_in(NULL), *q_in(NULL); 
    115116 
    116     std::complex<float> cmplx_prod[i_in_length]; 
     117    std::complex<float> cmplx_prod;; 
    117118    std::complex<float> cmplx_cur; 
    118119    std::complex<float> cmplx_pre; 
    119     short demod_out[i_in_length]; 
    120  
    121     gain = sps * 2 / M_PI; 
     120 
     121    unsigned int i_in_len; 
     122    short i_in_prev = 0; 
     123    short q_in_prev = 0; 
     124 
     125    // 
     126    // Demod params 
     127    // 
     128    unsigned int sps = 4; 
     129    unsigned int gain = sps * 2 / M_PI; 
    122130    float fp_gain = 5000; 
    123  
     131    unsigned int pkt_len = 64; 
     132 
     133    // 
     134    // GNU Radio  
     135    // 
     136    gr_vector_int                  ninput_items_required(1); 
     137    gr_vector_int                  ninput_items(1); 
     138    gr_vector_const_void_star      input_items; 
     139    std::vector<bool>              input_done; 
     140    gr_vector_void_star            output_items; 
     141    int                            noutput_items; 
     142 
     143    float omega; 
     144    float gain_omega; 
     145    float mu = 0.5; 
     146    float gain_mu = 0.175; 
     147    float omega_relative_limit = 0.005; 
     148    float freq_err = 0.0; 
     149 
     150    omega = sps * (1 + freq_err); 
     151    gain_omega = 0.25 * gain_mu * gain_mu; 
     152 
     153    gr_clock_recovery_mm_ff_sptr gr_clock_recovery = 
     154        gr_make_clock_recovery_mm_ff(omega, gain_omega, mu, gain_mu); 
     155 
     156    gr_clock_recovery->forecast(pkt_len, ninput_items_required); 
     157 
     158    // 
     159    // Processing loop 
     160    //  
    124161    while (gmsk_demod->processing_active) { 
    125162        gmsk_demod->p_in->getData(i_in, q_in); 
     163        i_in_len = i_in->length(); 
     164        unsigned short demod_out[i_in_len]; 
    126165 
    127166        // 
     
    129168        // 
    130169        cmplx_cur = std::complex<float>((*i_in)[0], (*q_in)[0]); 
    131         cmplx_pre = std::complex<float>(i_in_save, q_in_save); 
    132         cmplx_prod[0] = cmplx_cur * conj(cmplx_pre); 
    133         demod_out[0] = fp_gain * gain * atan( imag(cmplx_prod[0]) / real(cmplx_prod[0])); 
    134  
    135         for (unsigned int i=1; i<i_in_length; i++) { 
     170        cmplx_pre = std::complex<float>(i_in_prev, q_in_prev); 
     171        cmplx_prod = cmplx_cur * conj(cmplx_pre); 
     172        demod_out[0] = fp_gain * gain * atan( imag(cmplx_prod) / real(cmplx_prod)); 
     173 
     174        for (unsigned int i=1; i<i_in_len; i++) { 
    136175            cmplx_cur = std::complex<float>((*i_in)[i], (*q_in)[i]); 
    137176            cmplx_pre = std::complex<float>((*i_in)[i-1], (*q_in)[i-1]); 
    138             cmplx_prod[i] = cmplx_cur * conj(cmplx_pre); 
    139             demod_out[i] = fp_gain * gain * atan( imag(cmplx_prod[i]) / real(cmplx_prod[i])); 
     177            cmplx_prod = cmplx_cur * conj(cmplx_pre); 
     178            demod_out[i] = fp_gain * gain * atan( imag(cmplx_prod / real(cmplx_prod))); 
    140179        } 
    141180 
    142181        // 
    143         // Floating point hack 
    144         // 
     182        // Type conversion 
     183        // 
     184        std::vector<const void*> demod_vec(i_in_len); 
     185        for (unsigned int i=0; i<i_in_len; i++) { 
     186            demod_vec[i] = (const void*) &demod_out[i]; 
     187        } 
    145188 
    146189        // 
    147190        // Timing recovery 
    148191        // 
     192        noutput_items = gr_clock_recovery->general_work(pkt_len, 
     193                                                        ninput_items, 
     194                                                        demod_vec, 
     195                                                        output_items); 
    149196 
    150197        gmsk_demod->p_in->bufferEmptied(); 
  • ossiedev/branches/ttsou/dist/components/gmsk_demod/gmsk_demod.h

    r8636 r8662  
    7272 
    7373    // Component specifics 
    74     unsigned int sps;  
    75     short i_in_prev; 
    76     short q_in_prev; 
     74    //short i_in_prev; 
     75    //short q_in_prev; 
    7776};