fdmdv_put_test_bits working, and reasonable output from fdmdv_demod.c, although not...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 1 May 2012 06:03:49 +0000 (06:03 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 1 May 2012 06:03:49 +0000 (06:03 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@388 01035d8c-6547-0410-b346-abe4f91aad63

12 files changed:
codec2-dev/octave/README_fdmdv.txt
codec2-dev/octave/fdmdv_demod.m
codec2-dev/octave/fdmdv_demod_c.m [new file with mode: 0644]
codec2-dev/src/Makefile.am
codec2-dev/src/Makefile.in
codec2-dev/src/fdmdv.c
codec2-dev/src/fdmdv.h
codec2-dev/src/fdmdv_demod.c
codec2-dev/src/fdmdv_internal.h
codec2-dev/src/fdmdv_put_test_bits.c [new file with mode: 0644]
codec2-dev/unittest/Makefile.in
codec2-dev/unittest/tfdmdv.c

index 459801ccded1bcb23b906f0100fe3fbc11f22e97..2f874672079eaf4825cd23a369b9ced2e8c6b9cd 100644 (file)
@@ -46,8 +46,11 @@ TODO
     $ ./fdmdv_mod test.c2 test.raw
     $ play -r 8000 -s -2 test.raw
     
-    Two seconds of test frame data out of sound device: 
+    Two seconds of test frame data modulated and sent out of sound device: 
        $ ./fdmdv_get_test_bits - 2800 | ./fdmdv_mod - - | play -t raw -r 8000 -s -2 -
+    Count errors in two seconds of test frame data:
+       $ ./fdmdv_get_test_bits - 2800 | ./fdmdv_put_test_bits -
 
 [ ] PAPR idea
     + automatically weak phases to reduce PAPR, e.g. slow variations in freq...
index 791ca03b33da0d05e450a620aa76b0a21ea98e06..7a21d0dc38cd8ce1871e4e40c3f07de500991208 100644 (file)
@@ -1,7 +1,7 @@
 % fdmdv_demod.m
 %
-% Demodulator function for FDMDV modem.  Requires 8kHz sample rate raw files
-% as input
+% Demodulator function for FDMDV modem (Octave version).  Requires
+% 8kHz sample rate raw files as input
 %
 % Copyright David Rowe 2012
 % This program is distributed under the terms of the GNU General Public License 
diff --git a/codec2-dev/octave/fdmdv_demod_c.m b/codec2-dev/octave/fdmdv_demod_c.m
new file mode 100644 (file)
index 0000000..05f1fc1
--- /dev/null
@@ -0,0 +1,45 @@
+% fdmdv_demod_c.m
+%
+% Plots Octave dump file information from C FDMDV demodulator program,
+% to give a similar set of plots to fdmdv_demod.m.  Useful for off
+% line analysis of demod performance.
+%
+% Copyright David Rowe 2012
+% This program is distributed under the terms of the GNU General Public License 
+% Version 2
+%
+
+function fdmdv_demod_c(dumpfilename, bits)
+
+  fdmdv; % include modem code
+  frames = bits/(Nc*Nb);
+
+  load(dumpfilename);
+
+  % ---------------------------------------------------------------------
+  % Plots
+  % ---------------------------------------------------------------------
+
+  xt = (1:frames)/Rs;
+  secs = frames/Rs;
+
+  figure(1)
+  clf;
+  plot(real(rx_symbols_log_c(1:Nc+1,30:frames)),imag(rx_symbols_log_c(1:Nc+1,30:frames)),'+')
+  axis([-2 2 -2 2]);
+  title('Scatter Diagram');
+
+  figure(2)
+  clf;
+  subplot(211)
+  plot(xt, rx_timing_log_c(1:frames))
+  title('timing offset (samples)');
+  subplot(212)
+  plot(xt, foff_log_c(1:frames))
+  hold on;
+  plot(xt, coarse_fine_log_c(1:frames)*75, 'r');
+  hold off;
+  title('Freq offset (Hz)');
+  grid
+
+endfunction
index a2230685f02d79c6f10e7a507fb713e55fe7bb8f..c8b81b5165a1a2ad1572fed5b30c0b89aae358e6 100644 (file)
@@ -122,7 +122,7 @@ libcodec2_la_LDFLAGS = $(LIBS)
 library_includedir = $(prefix)/include
 library_include_HEADERS        = codec2.h
 
-bin_PROGRAMS = c2demo c2enc c2dec c2sim fdmdv_get_test_bits fdmdv_mod fdmdv_demod
+bin_PROGRAMS = c2demo c2enc c2dec c2sim fdmdv_get_test_bits fdmdv_mod fdmdv_demod fdmdv_put_test_bits 
 
 c2demo_SOURCES = c2demo.c
 c2demo_LDADD = $(lib_LTLIBRARIES) 
@@ -148,3 +148,7 @@ fdmdv_mod_LDFLAGS = $(LIBS)
 
 fdmdv_demod_SOURCES = fdmdv_demod.c fdmdv.c fft.c kiss_fft.c octave.c
 fdmdv_demod_LDFLAGS = $(LIBS)
+
+fdmdv_put_test_bits_SOURCES = fdmdv_put_test_bits.c fdmdv.c fft.c kiss_fft.c
+fdmdv_put_test_bits_LDFLAGS = $(LIBS)
+
index 8e3e2d796cb4cbe0bbabbf0fa098ac7e238e1363..621088cbd55cd082052f50d3f094ecc2dfaa4e7b 100644 (file)
@@ -41,7 +41,7 @@ host_triplet = @host@
 noinst_PROGRAMS = generate_codebook$(EXEEXT) genlspdtcb$(EXEEXT)
 bin_PROGRAMS = c2demo$(EXEEXT) c2enc$(EXEEXT) c2dec$(EXEEXT) \
        c2sim$(EXEEXT) fdmdv_get_test_bits$(EXEEXT) fdmdv_mod$(EXEEXT) \
-       fdmdv_demod$(EXEEXT)
+       fdmdv_demod$(EXEEXT) fdmdv_put_test_bits$(EXEEXT)
 subdir = src
 DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \
        $(srcdir)/Makefile.in
@@ -100,6 +100,10 @@ am_fdmdv_mod_OBJECTS = fdmdv_mod.$(OBJEXT) fdmdv.$(OBJEXT) \
        fft.$(OBJEXT) kiss_fft.$(OBJEXT)
 fdmdv_mod_OBJECTS = $(am_fdmdv_mod_OBJECTS)
 fdmdv_mod_LDADD = $(LDADD)
+am_fdmdv_put_test_bits_OBJECTS = fdmdv_put_test_bits.$(OBJEXT) \
+       fdmdv.$(OBJEXT) fft.$(OBJEXT) kiss_fft.$(OBJEXT)
+fdmdv_put_test_bits_OBJECTS = $(am_fdmdv_put_test_bits_OBJECTS)
+fdmdv_put_test_bits_LDADD = $(LDADD)
 generate_codebook_SOURCES = generate_codebook.c
 generate_codebook_OBJECTS = generate_codebook.$(OBJEXT)
 generate_codebook_LDADD = $(LDADD)
@@ -120,11 +124,13 @@ LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 SOURCES = $(libcodec2_la_SOURCES) $(c2dec_SOURCES) $(c2demo_SOURCES) \
        $(c2enc_SOURCES) $(c2sim_SOURCES) $(fdmdv_demod_SOURCES) \
        $(fdmdv_get_test_bits_SOURCES) $(fdmdv_mod_SOURCES) \
-       generate_codebook.c genlspdtcb.c
+       $(fdmdv_put_test_bits_SOURCES) generate_codebook.c \
+       genlspdtcb.c
 DIST_SOURCES = $(libcodec2_la_SOURCES) $(c2dec_SOURCES) \
        $(c2demo_SOURCES) $(c2enc_SOURCES) $(c2sim_SOURCES) \
        $(fdmdv_demod_SOURCES) $(fdmdv_get_test_bits_SOURCES) \
-       $(fdmdv_mod_SOURCES) generate_codebook.c genlspdtcb.c
+       $(fdmdv_mod_SOURCES) $(fdmdv_put_test_bits_SOURCES) \
+       generate_codebook.c genlspdtcb.c
 library_includeHEADERS_INSTALL = $(INSTALL_HEADER)
 HEADERS = $(library_include_HEADERS)
 ETAGS = etags
@@ -333,6 +339,8 @@ fdmdv_mod_SOURCES = fdmdv_mod.c fdmdv.c fft.c kiss_fft.c
 fdmdv_mod_LDFLAGS = $(LIBS)
 fdmdv_demod_SOURCES = fdmdv_demod.c fdmdv.c fft.c kiss_fft.c octave.c
 fdmdv_demod_LDFLAGS = $(LIBS)
+fdmdv_put_test_bits_SOURCES = fdmdv_put_test_bits.c fdmdv.c fft.c kiss_fft.c
+fdmdv_put_test_bits_LDFLAGS = $(LIBS)
 all: all-am
 
 .SUFFIXES:
@@ -451,6 +459,9 @@ fdmdv_get_test_bits$(EXEEXT): $(fdmdv_get_test_bits_OBJECTS) $(fdmdv_get_test_bi
 fdmdv_mod$(EXEEXT): $(fdmdv_mod_OBJECTS) $(fdmdv_mod_DEPENDENCIES) 
        @rm -f fdmdv_mod$(EXEEXT)
        $(LINK) $(fdmdv_mod_LDFLAGS) $(fdmdv_mod_OBJECTS) $(fdmdv_mod_LDADD) $(LIBS)
+fdmdv_put_test_bits$(EXEEXT): $(fdmdv_put_test_bits_OBJECTS) $(fdmdv_put_test_bits_DEPENDENCIES) 
+       @rm -f fdmdv_put_test_bits$(EXEEXT)
+       $(LINK) $(fdmdv_put_test_bits_LDFLAGS) $(fdmdv_put_test_bits_OBJECTS) $(fdmdv_put_test_bits_LDADD) $(LIBS)
 generate_codebook$(EXEEXT): $(generate_codebook_OBJECTS) $(generate_codebook_DEPENDENCIES) 
        @rm -f generate_codebook$(EXEEXT)
        $(LINK) $(generate_codebook_LDFLAGS) $(generate_codebook_OBJECTS) $(generate_codebook_LDADD) $(LIBS)
@@ -472,6 +483,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv_demod.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv_get_test_bits.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv_mod.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv_put_test_bits.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fft.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate_codebook.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genlspdtcb.Po@am__quote@
index f0501ddecbfd902ddde936fca179b93b7836d568..8c30a02d7ddea2214549144f5ba1bbbd02d8eb35 100644 (file)
@@ -893,10 +893,9 @@ float rx_est_timing(COMP rx_symbols[],
 
 \*---------------------------------------------------------------------------*/
 
-float qpsk_to_bits(int rx_bits[], int *sync_bit, COMP prev_rx_symbols[], COMP rx_symbols[])
+float qpsk_to_bits(int rx_bits[], int *sync_bit, COMP phase_difference[], COMP prev_rx_symbols[], COMP rx_symbols[])
 {
     int   c;
-    COMP  phase_difference[NC+1];
     COMP  pi_on_4;
     COMP  d;
     int   msb=0, lsb=0;
@@ -957,31 +956,36 @@ float qpsk_to_bits(int rx_bits[], int *sync_bit, COMP prev_rx_symbols[], COMP rx
 
 \*---------------------------------------------------------------------------*/
 
-void fdmdv_put_test_bits(struct FDMDV *f, int *sync, int *bit_errors, int rx_bits[])
+void fdmdv_put_test_bits(struct FDMDV *f, int *sync, int *bit_errors, int *ntest_bits, int rx_bits[])
 {
     int   i,j;
     float ber;
 
     /* Append to our memory */
 
-    for(i=0,j=FDMDV_BITS_PER_FRAME; i<NTEST_BITS-FDMDV_BITS_PER_FRAME; i++)
+    for(i=0,j=FDMDV_BITS_PER_FRAME; i<NTEST_BITS-FDMDV_BITS_PER_FRAME; i++,j++)
        f->rx_test_bits_mem[i] = f->rx_test_bits_mem[j];
-    for(i=NTEST_BITS-FDMDV_BITS_PER_FRAME,j=0; i<NTEST_BITS; i++)
+    for(i=NTEST_BITS-FDMDV_BITS_PER_FRAME,j=0; i<NTEST_BITS; i++,j++)
        f->rx_test_bits_mem[i] = rx_bits[j];
     
     /* see how many bit errors we get when checked against test sequence */
        
     *bit_errors = 0;
-    for(i=0; i<FDMDV_BITS_PER_FRAME; i++)
+    for(i=0; i<NTEST_BITS; i++) {
        *bit_errors += test_bits[i] ^ f->rx_test_bits_mem[i];
+       //printf("%d %d %d %d\n", i, test_bits[i], f->rx_test_bits_mem[i], test_bits[i] ^ f->rx_test_bits_mem[i]);
+    }
 
     /* if less than a thresh we are aligned and in sync with test sequence */
 
-    ber = *bit_errors/NTEST_BITS;
+    ber = (float)*bit_errors/NTEST_BITS;
   
     *sync = 0;
     if (ber < 0.2)
        *sync = 1;
+   
+    *ntest_bits = NTEST_BITS;
+    
 }
 
 /*---------------------------------------------------------------------------*\
@@ -1091,6 +1095,7 @@ void fdmdv_demod(struct FDMDV *fdmdv, int rx_bits[], int *sync_bit, float rx_fdm
     COMP          rx_fdm_fcorr[M+M/P];
     COMP          rx_baseband[NC+1][M+M/P];
     COMP          rx_filt[NC+1][P+1];
+    COMP          rx_symbols[NC+1];
     float         env[NT*P];
  
     /* freq offset estimation and correction */
@@ -1104,9 +1109,9 @@ void fdmdv_demod(struct FDMDV *fdmdv, int rx_bits[], int *sync_bit, float rx_fdm
 
     fdm_downconvert(rx_baseband, rx_fdm_fcorr, fdmdv->phase_rx, fdmdv->freq, *nin);
     rx_filter(rx_filt, rx_baseband, fdmdv->rx_filter_memory, *nin);
-    fdmdv->rx_timing = rx_est_timing(fdmdv->rx_symbols, rx_filt, rx_baseband, fdmdv->rx_filter_mem_timing, env, fdmdv->rx_baseband_mem_timing, *nin);   
-    foff_fine = qpsk_to_bits(rx_bits, sync_bit, fdmdv->prev_rx_symbols, fdmdv->rx_symbols);
-    memcpy(fdmdv->prev_rx_symbols, fdmdv->rx_symbols, sizeof(COMP)*(NC+1));
+    fdmdv->rx_timing = rx_est_timing(rx_symbols, rx_filt, rx_baseband, fdmdv->rx_filter_mem_timing, env, fdmdv->rx_baseband_mem_timing, *nin);  
+    foff_fine = qpsk_to_bits(rx_bits, sync_bit, fdmdv->phase_difference, fdmdv->prev_rx_symbols, rx_symbols);
+    memcpy(fdmdv->prev_rx_symbols, rx_symbols, sizeof(COMP)*(NC+1));
 
     /* freq offset estimation state machine */
 
@@ -1138,12 +1143,11 @@ void fdmdv_get_demod_stats(struct FDMDV *fdmdv, struct FDMDV_STATS *fdmdv_stats)
     fdmdv_stats->rx_timing = fdmdv->rx_timing/M;
     fdmdv_stats->clock_offset = 0.0; /* TODO - implement clock offset estimation */
 
-    /* adjust for phase offset to make suitable for scatter plot */
-
     assert((NC+1) == FDMDV_NSYM);
 
-    for(c=0; c<NC+1; c++)
-       fdmdv_stats->rx_symbols[c] = cmult(cmult(fdmdv->rx_symbols[c], cconj(fdmdv->prev_rx_symbols[c])), pi_on_4);
+    for(c=0; c<NC+1; c++) {
+       fdmdv_stats->rx_symbols[c] = fdmdv->phase_difference[c];
+    }
 
 }
 
index 5f9e9458a5b4cf5bcf6237548e5b38382db4c37b..346349621cd1831e8166af5f6d0d98f90ea8bb3c 100644 (file)
@@ -64,7 +64,7 @@ void          fdmdv_mod(struct FDMDV *fdmdv_state, COMP tx_fdm[], int tx_bits[],
 void          fdmdv_demod(struct FDMDV *fdmdv_state, int rx_bits[], int *sync_bit, float rx_fdm[], int *nin);
     
 void          fdmdv_get_test_bits(struct FDMDV *fdmdv_state, int tx_bits[]);
-void          fdmdv_put_test_bits(struct FDMDV *f, int *sync, int *bit_errors, int rx_bits[]);
+void          fdmdv_put_test_bits(struct FDMDV *f, int *sync, int *bit_errors, int *ntest_bits, int rx_bits[]);
     
 void          fdmdv_get_demod_stats(struct FDMDV *fdmdv_state, struct FDMDV_STATS *fdmdv_stats);
 void          fdmdv_get_waterfall_line(struct FDMDV *fdmdv_state, float magnitudes[], int *magnitude_points);
index d91715dc368e0d1265ce970e2b9ebc04cb8aa2d4..ce44536a2b67b743f43d0f57b7b4a3d723aa5e75 100644 (file)
@@ -46,8 +46,6 @@
 
 #define MAX_FRAMES 50*60 /* 1 minute at 50 symbols/s */
 
-void dump_to_octave(struct FDMDV *fdmdv, FILE *f);
-
 int main(int argc, char *argv[])
 {
     FILE         *fin, *fout;
@@ -63,7 +61,7 @@ int main(int argc, char *argv[])
     int           state, next_state;
 
     int           frames;
-    FILE         *foct;
+    FILE         *foct = NULL;
     struct FDMDV_STATS stats;
     COMP          rx_symbols_log[FDMDV_NSYM][MAX_FRAMES];
     int           coarse_fine_log[MAX_FRAMES];
@@ -162,7 +160,7 @@ int main(int argc, char *argv[])
 
     /* Optional dump to Octave log file */
 
-    if ( (foct = fopen(argv[3],"wt")) == NULL ) {
+    if ( strcmp(argv[3],"|") && (foct = fopen(argv[3],"wt")) == NULL ) {
        fprintf(stderr, "Error opening Octave dump file: %s: %s.\n",
                argv[3], strerror(errno));
        exit(1);
index 827fa9f67813ab57eb539f61452d07021887e34b..435244fd9f29210edd0514b9d5ed8283f4a4f60c 100644 (file)
@@ -117,7 +117,7 @@ struct FDMDV {
     COMP  rx_filter_mem_timing[NC+1][NT*P];
     COMP  rx_baseband_mem_timing[NC+1][NFILTERTIMING];
     float rx_timing;
-    COMP  rx_symbols[NC+1];
+    COMP  phase_difference[NC+1];
     COMP  prev_rx_symbols[NC+1];
     
     /* freq est state machine */
@@ -149,7 +149,7 @@ float rx_est_timing(COMP  rx_symbols[],
                   float env[],
                   COMP  rx_baseband_mem_timing[NC+1][NFILTERTIMING], 
                   int   nin);   
-float qpsk_to_bits(int rx_bits[], int *sync_bit, COMP prev_rx_symbols[], COMP rx_symbols[]);
+float qpsk_to_bits(int rx_bits[], int *sync_bit, COMP phase_difference[], COMP prev_rx_symbols[], COMP rx_symbols[]);
 int freq_state(int sync_bit, int *state);
 
 #endif
diff --git a/codec2-dev/src/fdmdv_put_test_bits.c b/codec2-dev/src/fdmdv_put_test_bits.c
new file mode 100644 (file)
index 0000000..ed773e7
--- /dev/null
@@ -0,0 +1,112 @@
+/*---------------------------------------------------------------------------*\
+                                                                             
+  FILE........: fdmdv_put_test_bits.c
+  AUTHOR......: David Rowe  
+  DATE CREATED: 1 May 2012
+                                                                             
+  Using a file of packed test bits as input, determines bit error
+  rate.  Useful for testing fdmdv_demod.
+
+\*---------------------------------------------------------------------------*/
+
+
+/*
+  Copyright (C) 2012 David Rowe
+
+  All rights reserved.
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License version 2, as
+  published by the Free Software Foundation.  This program is
+  distributed in the hope that it will be useful, but WITHOUT ANY
+  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+  License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <errno.h>
+
+#include "fdmdv.h"
+
+#define BITS_PER_CODEC_FRAME (2*FDMDV_BITS_PER_FRAME)
+#define BYTES_PER_CODEC_FRAME (BITS_PER_CODEC_FRAME/8)
+
+int main(int argc, char *argv[])
+{
+    FILE         *fin;
+    struct FDMDV *fdmdv;
+    char          packed_bits[BYTES_PER_CODEC_FRAME];
+    int           rx_bits[2*FDMDV_BITS_PER_FRAME];
+    int           i, bit, byte;
+    int           test_frame_sync, bit_errors, total_bit_errors, total_bits, ntest_bits;
+
+    if (argc < 2) {
+       printf("usage: %s InputBitFile\n", argv[0]);
+       printf("e.g    %s test.c2\n", argv[0]);
+       exit(1);
+    }
+
+    if (strcmp(argv[1], "-") == 0) fin = stdin;
+    else if ( (fin = fopen(argv[1],"rb")) == NULL ) {
+       fprintf(stderr, "Error opening input bit file: %s: %s.\n",
+         argv[1], strerror(errno));
+       exit(1);
+    }
+
+    fdmdv = fdmdv_create();
+    total_bit_errors = 0;
+    total_bits = 0;
+
+    while(fread(packed_bits, sizeof(char), BYTES_PER_CODEC_FRAME, fin) == BYTES_PER_CODEC_FRAME) {
+       /* unpack bits, MSB first */
+
+       bit = 7; byte = 0;
+       for(i=0; i<BITS_PER_CODEC_FRAME; i++) {
+           rx_bits[i] = (packed_bits[byte] >> bit) & 0x1;
+           //printf("%d 0x%x %d\n", i, packed_bits[byte], rx_bits[i]);
+           bit--;
+           if (bit < 0) {
+               bit = 7;
+               byte++;
+           }
+       }
+       assert(byte == BYTES_PER_CODEC_FRAME);
+
+       fdmdv_put_test_bits(fdmdv, &test_frame_sync, &bit_errors, &ntest_bits, rx_bits);
+       if (test_frame_sync == 1) {
+           total_bit_errors += bit_errors;
+           total_bits = total_bits + ntest_bits;
+           printf("+");
+       }
+       else
+           printf("-");
+       fdmdv_put_test_bits(fdmdv, &test_frame_sync, &bit_errors, &ntest_bits, &rx_bits[FDMDV_BITS_PER_FRAME]);
+       if (test_frame_sync == 1) {
+           total_bit_errors += bit_errors;
+           total_bits = total_bits + ntest_bits;
+           printf("+");
+       }
+       else
+           printf("-");
+       
+       /* if this is in a pipeline, we probably don't want the usual
+          buffering to occur */
+
+        if (fin == stdin) fflush(stdin);
+    }
+
+    fclose(fin);
+    fdmdv_destroy(fdmdv);
+
+    printf("\nbits %d  errors %d  BER %1.4f\n", total_bits, total_bit_errors, (float)total_bit_errors/(1E-6+total_bits) );
+    return 0;
+}
+
index b705e5b398bed9d01bbeb4a97b66d865a1285a65..00af6dcbab89b97e56104b4c4054a5242214860e 100644 (file)
@@ -75,7 +75,7 @@ am_tcodec2_OBJECTS = tcodec2.$(OBJEXT) quantise.$(OBJEXT) \
 tcodec2_OBJECTS = $(am_tcodec2_OBJECTS)
 tcodec2_DEPENDENCIES =
 am_tfdmdv_OBJECTS = tfdmdv.$(OBJEXT) fdmdv.$(OBJEXT) fft.$(OBJEXT) \
-       kiss_fft.$(OBJEXT)
+       kiss_fft.$(OBJEXT) octave.$(OBJEXT)
 tfdmdv_OBJECTS = $(am_tfdmdv_OBJECTS)
 tfdmdv_DEPENDENCIES =
 am_tinterp_OBJECTS = tinterp.$(OBJEXT) sine.$(OBJEXT) fft.$(OBJEXT) \
@@ -270,7 +270,7 @@ tcodec2_LDFLAGS = $(LIBS)
 scalarlsptest_SOURCES = scalarlsptest.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/dump.c ../src/fft.c ../src/kiss_fft.c $(CODEBOOKS)
 scalarlsptest_LDADD = $(lib_LTLIBRARIES) 
 scalarlsptest_LDFLAGS = $(LIBS)
-tfdmdv_SOURCES = tfdmdv.c ../src/fdmdv.c ../src/fft.c ../src/kiss_fft.c
+tfdmdv_SOURCES = tfdmdv.c ../src/fdmdv.c ../src/fft.c ../src/kiss_fft.c ../src/octave.c
 tfdmdv_LDADD = $(lib_LTLIBRARIES) 
 tfdmdv_LDFLAGS = $(LIBS)
 all: all-am
@@ -375,6 +375,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lsp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nlp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/octave.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pack.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/phase.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/postfilter.Po@am__quote@
@@ -705,6 +706,20 @@ fdmdv.obj: ../src/fdmdv.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fdmdv.obj `if test -f '../src/fdmdv.c'; then $(CYGPATH_W) '../src/fdmdv.c'; else $(CYGPATH_W) '$(srcdir)/../src/fdmdv.c'; fi`
 
+octave.o: ../src/octave.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT octave.o -MD -MP -MF "$(DEPDIR)/octave.Tpo" -c -o octave.o `test -f '../src/octave.c' || echo '$(srcdir)/'`../src/octave.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/octave.Tpo" "$(DEPDIR)/octave.Po"; else rm -f "$(DEPDIR)/octave.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='../src/octave.c' object='octave.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o octave.o `test -f '../src/octave.c' || echo '$(srcdir)/'`../src/octave.c
+
+octave.obj: ../src/octave.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT octave.obj -MD -MP -MF "$(DEPDIR)/octave.Tpo" -c -o octave.obj `if test -f '../src/octave.c'; then $(CYGPATH_W) '../src/octave.c'; else $(CYGPATH_W) '$(srcdir)/../src/octave.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/octave.Tpo" "$(DEPDIR)/octave.Po"; else rm -f "$(DEPDIR)/octave.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='../src/octave.c' object='octave.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o octave.obj `if test -f '../src/octave.c'; then $(CYGPATH_W) '../src/octave.c'; else $(CYGPATH_W) '$(srcdir)/../src/octave.c'; fi`
+
 mostlyclean-libtool:
        -rm -f *.lo
 
index e502088e45ecf8dee0479b514ffd0fd98e8ecf38..63370014755c4d2f1bfd73f8405d004a1dfadfc5 100644 (file)
@@ -126,7 +126,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);       
-       foff_fine = qpsk_to_bits(rx_bits, &sync_bit, fdmdv->prev_rx_symbols, rx_symbols);
+       foff_fine = qpsk_to_bits(rx_bits, &sync_bit, fdmdv->phase_difference, fdmdv->prev_rx_symbols, rx_symbols);
        memcpy(fdmdv->prev_rx_symbols, rx_symbols, sizeof(COMP)*(NC+1));
        fdmdv->coarse_fine = freq_state(sync_bit, &fdmdv->fest_state);
        fdmdv->foff  -= TRACK_COEFF*foff_fine;
@@ -218,7 +218,7 @@ int main(int argc, char *argv[])
     octave_save_int(fout, "coarse_fine_log_c", coarse_fine_log, 1, FRAMES);  
     fclose(fout);
 
-    codec2_destroy(fdmdv);
+    fdmdv_destroy(fdmdv);
 
     return 0;
 }