rx_est_timing working in C
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 24 Apr 2012 00:04:10 +0000 (00:04 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 24 Apr 2012 00:04:10 +0000 (00:04 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@378 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/README_fdmdv.txt
codec2-dev/octave/fdmdv.m
codec2-dev/octave/tfdmdv.m
codec2-dev/src/fdmdv.c
codec2-dev/unittest/tfdmdv.c

index 541e4a819010037fd74ae3858adb43a6267a2ffc..d0a011dce92c0e9308ef51b57bb26ae511fe7e86 100644 (file)
@@ -21,6 +21,7 @@ TODO
 [ ] block diagram
 [ ] blog posts(s)
 [ ] Codec 2 web page update
+[ ] demo modem C test program
 
 Tests
 
index afa503e64e5fe340755da067b1ff46bed0c41fc1..6ce43b712d1a930674fc10aa50701dd3dcf564df 100644 (file)
@@ -318,7 +318,7 @@ endfunction
 
 % Estimate optimum timing offset, re-filter receive symbols
 
-function [rx_symbols rx_timing] = rx_est_timing(rx_filt, rx_baseband, nin)
+function [rx_symbols rx_timing env] = rx_est_timing(rx_filt, rx_baseband, nin)
   global M;
   global Nt;
   global Nc;
@@ -365,7 +365,7 @@ function [rx_symbols rx_timing] = rx_est_timing(rx_filt, rx_baseband, nin)
      rx_timing += M;
   end
 
-  % rx_filt_mem_timing contains M + Nfilter + M samples of the
+  % rx_baseband_mem_timing contains M + Nfilter + M samples of the
   % baseband signal at rate M this enables us to resample the filtered
   % rx symbol with M sample precision once we have rx_timing
 
index 1ba7a79487f2ac53a969c4a44f53537a3748d623..776bcc4ad394d8d973455fc288eb4359de94d3b8 100644 (file)
@@ -34,6 +34,9 @@ S2_log = [];
 foff_log = [];
 rx_baseband_log = [];
 rx_filt_log = [];
+env_log = [];
+rx_timing_log = [];
+rx_symbols_log = [];
 
 for f=1:frames
 
@@ -69,7 +72,10 @@ for f=1:frames
   rx_baseband_log = [rx_baseband_log rx_baseband];
   rx_filt = rx_filter(rx_baseband, M);
   rx_filt_log = [rx_filt_log rx_filt];
-
+  [rx_symbols rx_timing env] = rx_est_timing(rx_filt, rx_baseband, M);
+  env_log = [env_log env];
+  rx_timing_log = [rx_timing_log rx_timing];
+  rx_symbols_log = [rx_symbols_log rx_symbols];
 end
 
 % Compare to the output from the C version
@@ -112,7 +118,7 @@ endfunction
 
 n = 28;
 stem_sig_and_error(1, 211, tx_bits_log_c(1:n), tx_bits_log(1:n) - tx_bits_log_c(1:n), 'tx bits', [1 n -1.5 1.5])
-stem_sig_and_error(1, 212, real(tx_symbols_log_c(1:n/2)), tx_symbols_log(1:n/2) - tx_symbols_log_c(1:n/2), 'tx symbols real', [1 n/2 -1.5 1.5])
+stem_sig_and_error(1, 212, real(tx_symbols_log_c(1:n/2)), real(tx_symbols_log(1:n/2) - tx_symbols_log_c(1:n/2)), 'tx symbols real', [1 n/2 -1.5 1.5])
 
 % tx_filter()
 
@@ -146,6 +152,7 @@ plot_sig_and_error(8, 211, real(S2_log), real(S2_log - S2_log_c), 'S2 real' )
 plot_sig_and_error(8, 212, imag(S2_log), imag(S2_log - S2_log_c), 'S2 imag' )
 
 plot_sig_and_error(9, 211, real(foff_log), real(foff_log - foff_log_c), 'Freq Offset' )
+plot_sig_and_error(9, 212, rx_timing_log, rx_timing_log - rx_timing_log_c, 'Rx Timing' )
 
 c=10;
 plot_sig_and_error(10, 211, real(rx_baseband_log(c,:)), real(rx_baseband_log(c,:) - rx_baseband_log_c(c,:)), 'Rx baseband real' )
@@ -154,6 +161,9 @@ plot_sig_and_error(10, 212, imag(rx_baseband_log(c,:)), imag(rx_baseband_log(c,:
 plot_sig_and_error(11, 211, real(rx_filt_log(c,:)), real(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'Rx filt real' )
 plot_sig_and_error(11, 212, imag(rx_filt_log(c,:)), imag(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'Rx filt imag' )
 
+plot_sig_and_error(12, 211, env_log, env_log - env_log_c, 'env' )
+plot_sig_and_error(12, 212, real(rx_symbols_log(c,:)), real(rx_symbols_log(c,:) - rx_symbols_log_c(c,:)), 'rx symbols' )
+
 % ---------------------------------------------------------------------------------------
 % AUTOMATED CHECKS ------------------------------------------
 % ---------------------------------------------------------------------------------------
@@ -190,5 +200,8 @@ check(S2_log, S2_log_c, 'S2');
 check(foff_log, foff_log_c, 'rx_est_freq_offset');
 check(rx_baseband_log, rx_baseband_log_c, 'fdm_downconvert');
 check(rx_filt_log, rx_filt_log_c, 'fdm_downconvert');
+check(env_log, env_log_c, 'env');
+check(rx_timing_log, rx_timing_log_c, 'rx_est_timing');
+check(rx_symbols_log, rx_symbols_log_c, 'rx_symbols');
 
 printf("\npasses: %d fails: %d\n", passes, fails);
index 3f691d8f00c69ede457f84011655cadeb9011350..4525a114b8fc3030c3b3df24e3ee6671cce7d051 100644 (file)
@@ -818,11 +818,11 @@ float rx_est_timing(COMP rx_symbols[],
 
     for(c=0; c<NC+1; c++) 
        for(i=0,j=nin; i<NFILTERTIMING-nin; i++,j++)
-           rx_baseband_mem_timing[c][i] = rx_filter_mem_timing[c][j];
+           rx_baseband_mem_timing[c][i] = rx_baseband_mem_timing[c][j];
     for(c=0; c<NC+1; c++) 
        for(i=NFILTERTIMING-nin,j=0; i<NFILTERTIMING; i++,j++)
            rx_baseband_mem_timing[c][i] = rx_baseband[c][j];
-
+    
     /* rx filter to get symbol for each carrier at estimated optimum
        timing instant.  We use rate M filter memory to get fine timing
        resolution. */
index 4c82927b883ff99ad4c23fadade16a731519912c..b7405f1556214510a87793a4e34e7a17cceb39d5 100644 (file)
@@ -47,8 +47,8 @@ int main(int argc, char *argv[])
 {
     struct FDMDV *fdmdv;
     int           tx_bits[FDMDV_BITS_PER_FRAME];
-    COMP          tx_symbols[(NC+1)];
-    COMP          tx_baseband[(NC+1)][M];
+    COMP          tx_symbols[NC+1];
+    COMP          tx_baseband[NC+1][M];
     COMP          tx_fdm[M];
     float         rx_fdm[M+M/P];
     float         foff;
@@ -58,6 +58,9 @@ int main(int argc, char *argv[])
     COMP          rx_fdm_fcorr[M+M/P];
     COMP          rx_baseband[NC+1][M+M/P];
     COMP          rx_filt[NC+1][P+1];
+    float         rx_timing;
+    float         env[NT*P];
+    COMP          rx_symbols[NC+1];
 
     int           tx_bits_log[FDMDV_BITS_PER_FRAME*FRAMES];
     COMP          tx_symbols_log[(NC+1)*FRAMES];
@@ -74,7 +77,10 @@ int main(int argc, char *argv[])
     int           rx_baseband_log_col_index;
     COMP          rx_filt_log[NC+1][(P+1)*FRAMES];
     int           rx_filt_log_col_index;
-
+    float         env_log[NT*P*FRAMES];
+    float         rx_timing_log[FRAMES];
+    COMP          rx_symbols_log[NC+1][FRAMES];
+                         
     FILE         *fout;
     int           f,c,i;
 
@@ -117,6 +123,7 @@ int main(int argc, char *argv[])
        
        fdm_downconvert(rx_baseband, rx_fdm_fcorr, fdmdv->phase_rx, fdmdv->freq, nin);
        rx_filter(rx_filt, rx_baseband, fdmdv->rx_filter_memory, nin);
+       rx_timing = rx_est_timing(rx_symbols, rx_filt, rx_baseband, fdmdv->rx_filter_mem_timing, env, fdmdv->rx_baseband_mem_timing, nin);       
 
        /* save log of outputs ------------------------------------------------------*/
 
@@ -135,7 +142,7 @@ int main(int argc, char *argv[])
        memcpy(&pilot_lpf2_log[f*NPILOTLPF], fdmdv->pilot_lpf2, sizeof(COMP)*NPILOTLPF);
        memcpy(&S1_log[f*MPILOTFFT], fdmdv->S1, sizeof(COMP)*MPILOTFFT);
        memcpy(&S2_log[f*MPILOTFFT], fdmdv->S2, sizeof(COMP)*MPILOTFFT);
-       memcpy(&foff_log[f], &foff, sizeof(float));
+       foff_log[f] = foff;
 
        /* rx down conversion */
 
@@ -153,6 +160,12 @@ int main(int argc, char *argv[])
        }
        rx_filt_log_col_index += (P*M)/nin;
 
+       /* timing estimation */
+
+       memcpy(&env_log[NT*P*f], env, sizeof(float)*NT*P);
+       rx_timing_log[f] = rx_timing;
+       for(c=0; c<NC+1; c++)
+           rx_symbols_log[c][f] = rx_symbols[c];
     }
 
     /* dump logs to Octave file for evaluation by tfdmdv.m Octave script */
@@ -174,6 +187,9 @@ int main(int argc, char *argv[])
     octave_save_float(fout, "foff_log_c", foff_log, 1, FRAMES);  
     octave_save_complex(fout, "rx_baseband_log_c", (COMP*)rx_baseband_log, (NC+1), rx_baseband_log_col_index, (M+M/P)*FRAMES);  
     octave_save_complex(fout, "rx_filt_log_c", (COMP*)rx_filt_log, (NC+1), rx_filt_log_col_index, (P+1)*FRAMES);  
+    octave_save_float(fout, "env_log_c", env_log, 1, NT*P*FRAMES);  
+    octave_save_float(fout, "rx_timing_log_c", rx_timing_log, 1, FRAMES);  
+    octave_save_complex(fout, "rx_symbols_log_c", (COMP*)rx_symbols_log, (NC+1), FRAMES, FRAMES);  
     fclose(fout);
 
     codec2_destroy(fdmdv);