first pass at an interleaver, for sizes larger thanone frame we need to workout a...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 28 May 2012 02:45:10 +0000 (02:45 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 28 May 2012 02:45:10 +0000 (02:45 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@506 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/Makefile.am
codec2-dev/src/Makefile.in
codec2-dev/src/fdmdv.h
codec2-dev/src/fdmdv_interleave.c [new file with mode: 0644]
codec2-dev/unittest/Makefile.am
codec2-dev/unittest/Makefile.in
codec2-dev/unittest/create_interleaver.c [new file with mode: 0644]
codec2-dev/unittest/t48_8.c

index 428daee7e8f973c6bae2053815721e065cbc4c62..6ba4136740ef67952cf80c5a83637c0a7340a951 100644 (file)
@@ -123,7 +123,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 fdmdv_put_test_bits 
+bin_PROGRAMS = c2demo c2enc c2dec c2sim fdmdv_get_test_bits fdmdv_mod fdmdv_demod fdmdv_put_test_bits fdmdv_interleave
 
 c2demo_SOURCES = c2demo.c
 c2demo_LDADD = $(lib_LTLIBRARIES) 
@@ -153,3 +153,6 @@ 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)
 
+fdmdv_interleave_SOURCES = fdmdv_interleave.c
+fdmdv_interleave_LDFLAGS = $(LIBS)
+
index d4591e74c43b32ec214ea43ebe875423caff624a..1989a457f386de15010254d9c4ee6c20f90f1490 100644 (file)
@@ -41,7 +41,8 @@ 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_put_test_bits$(EXEEXT)
+       fdmdv_demod$(EXEEXT) fdmdv_put_test_bits$(EXEEXT) \
+       fdmdv_interleave$(EXEEXT)
 subdir = src
 DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \
        $(srcdir)/Makefile.in
@@ -97,6 +98,9 @@ am_fdmdv_get_test_bits_OBJECTS = fdmdv_get_test_bits.$(OBJEXT) \
        fdmdv.$(OBJEXT) fft.$(OBJEXT) kiss_fft.$(OBJEXT)
 fdmdv_get_test_bits_OBJECTS = $(am_fdmdv_get_test_bits_OBJECTS)
 fdmdv_get_test_bits_LDADD = $(LDADD)
+am_fdmdv_interleave_OBJECTS = fdmdv_interleave.$(OBJEXT)
+fdmdv_interleave_OBJECTS = $(am_fdmdv_interleave_OBJECTS)
+fdmdv_interleave_LDADD = $(LDADD)
 am_fdmdv_mod_OBJECTS = fdmdv_mod.$(OBJEXT) fdmdv.$(OBJEXT) \
        fft.$(OBJEXT) kiss_fft.$(OBJEXT)
 fdmdv_mod_OBJECTS = $(am_fdmdv_mod_OBJECTS)
@@ -124,14 +128,15 @@ LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
 SOURCES = $(libcodec2_la_SOURCES) $(c2dec_SOURCES) $(c2demo_SOURCES) \
        $(c2enc_SOURCES) $(c2sim_SOURCES) $(fdmdv_demod_SOURCES) \
-       $(fdmdv_get_test_bits_SOURCES) $(fdmdv_mod_SOURCES) \
-       $(fdmdv_put_test_bits_SOURCES) generate_codebook.c \
-       genlspdtcb.c
+       $(fdmdv_get_test_bits_SOURCES) $(fdmdv_interleave_SOURCES) \
+       $(fdmdv_mod_SOURCES) $(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) $(fdmdv_put_test_bits_SOURCES) \
-       generate_codebook.c genlspdtcb.c
+       $(fdmdv_interleave_SOURCES) $(fdmdv_mod_SOURCES) \
+       $(fdmdv_put_test_bits_SOURCES) generate_codebook.c \
+       genlspdtcb.c
 library_includeHEADERS_INSTALL = $(INSTALL_HEADER)
 HEADERS = $(library_include_HEADERS)
 ETAGS = etags
@@ -343,6 +348,8 @@ 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)
+fdmdv_interleave_SOURCES = fdmdv_interleave.c
+fdmdv_interleave_LDFLAGS = $(LIBS)
 all: all-am
 
 .SUFFIXES:
@@ -458,6 +465,9 @@ fdmdv_demod$(EXEEXT): $(fdmdv_demod_OBJECTS) $(fdmdv_demod_DEPENDENCIES)
 fdmdv_get_test_bits$(EXEEXT): $(fdmdv_get_test_bits_OBJECTS) $(fdmdv_get_test_bits_DEPENDENCIES) 
        @rm -f fdmdv_get_test_bits$(EXEEXT)
        $(LINK) $(fdmdv_get_test_bits_LDFLAGS) $(fdmdv_get_test_bits_OBJECTS) $(fdmdv_get_test_bits_LDADD) $(LIBS)
+fdmdv_interleave$(EXEEXT): $(fdmdv_interleave_OBJECTS) $(fdmdv_interleave_DEPENDENCIES) 
+       @rm -f fdmdv_interleave$(EXEEXT)
+       $(LINK) $(fdmdv_interleave_LDFLAGS) $(fdmdv_interleave_OBJECTS) $(fdmdv_interleave_LDADD) $(LIBS)
 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)
@@ -484,6 +494,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv.Po@am__quote@
 @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_interleave.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@
index 66b9e573dac4e364b8266fd1a300505efd13e5b8..733db21d1a02bcc0705e18a3e1c9306dec25832e 100644 (file)
@@ -78,6 +78,9 @@ void          fdmdv_put_test_bits(struct FDMDV *f, int *sync, int *bit_errors, i
 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);
 
+void          fdmdv_8_to_48(float out48k[], float in8k[], int n);
+void          fdmdv_48_to_8(float out8k[], float in48k[], int n);
+
 #endif
 
 #ifdef __cplusplus
diff --git a/codec2-dev/src/fdmdv_interleave.c b/codec2-dev/src/fdmdv_interleave.c
new file mode 100644 (file)
index 0000000..010aa1a
--- /dev/null
@@ -0,0 +1,163 @@
+/*---------------------------------------------------------------------------*\
+                                                                             
+  FILE........: fdmdv_interleave.c
+  AUTHOR......: David Rowe  
+  DATE CREATED: May 27 2012
+                                                                             
+  Given an input file of bits outputs an interleaved or optionally
+  de-intervleaved file of bits.
+                                                                             
+\*---------------------------------------------------------------------------*/
+
+
+/*
+  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 MAX_INTERLEAVER 1024
+
+int main(int argc, char *argv[])
+{
+    FILE         *fin, *fout, *finter;
+    int          interleaver[MAX_INTERLEAVER];
+    char         *packed_bits;
+    int          *bits;
+    int          *interleaved_bits;
+    int           i, bit, byte, m, mpacked, frames, interleave, src_bit, dest_bit;
+
+    if (argc < 4) {
+       printf("usage: %s InputBitFile OutputBitFile InterleaverFile [de]\n", argv[0]);
+       printf("e.g    %s hts1a.c2 hts1a_interleaved.c2 interleaver.txt\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);
+    }
+
+    if (strcmp(argv[2], "-") == 0) fout = stdout;
+    else if ( (fout = fopen(argv[2],"wb")) == NULL ) {
+       fprintf(stderr, "Error opening output bit file: %s: %s.\n",
+         argv[2], strerror(errno));
+       exit(1);
+    }
+
+    if ((finter = fopen(argv[3],"rt")) == NULL ) {
+       fprintf(stderr, "Error opening interleaver file: %s: %s.\n",
+         argv[3], strerror(errno));
+       exit(1);
+    }
+
+    if (argc == 5)
+       interleave = 1;
+    else
+       interleave = 0;
+
+    /* load interleaver, size determines block size we will process */
+
+    src_bit = 0;
+    while(fscanf(finter, "%d\n", &dest_bit) == 1) {
+       if (interleave)
+           interleaver[dest_bit] = src_bit;
+       else
+           interleaver[src_bit] = dest_bit;
+           
+       src_bit++;
+       if (src_bit == MAX_INTERLEAVER) {
+           fprintf(stderr, "Error interleaver too big\n");
+           exit(1);
+       }       
+    }
+    fclose(finter);
+
+    m = src_bit;
+    fprintf(stderr, "Interleaver size m = %d  interleave = %d\n", m, interleave);
+    mpacked = m/8;
+
+    packed_bits = (char*)malloc(mpacked*sizeof(char));
+    assert(packed_bits != NULL);
+    bits = (int*)malloc(m*sizeof(int));
+    assert(bits != NULL);
+    interleaved_bits = (int*)malloc(m*sizeof(int));
+    assert(interleaved_bits != NULL);
+
+    frames = 0;
+
+    while(fread(packed_bits, sizeof(char), mpacked, fin) == mpacked) {
+       frames++;
+       
+       /* unpack bits, MSB first */
+
+       bit = 7; byte = 0;
+       for(i=0; i<m; i++) {
+           bits[i] = (packed_bits[byte] >> bit) & 0x1;
+           bit--;
+           if (bit < 0) {
+               bit = 7;
+               byte++;
+           }
+       }
+       assert(byte == mpacked);
+
+       /* (de) interleave */
+
+       for(i=0; i<m; i++)
+           interleaved_bits[i] = bits[interleaver[i]];
+
+       /* pack bits, MSB sent first  */
+
+       bit = 7; byte = 0;
+       memset(packed_bits, 0, mpacked);
+       for(i=0; i<m; i++) {
+           packed_bits[byte] |= (interleaved_bits[i] << bit);
+           bit--;
+           if (bit < 0) {
+               bit = 7;
+               byte++;
+           }
+       }
+       assert(byte == mpacked);
+
+       fwrite(packed_bits, sizeof(char), mpacked, fout);
+
+       /* if this is in a pipeline, we probably don't want the usual
+          buffering to occur */
+
+        if (fout == stdout) fflush(stdout);
+        if (fin == stdin) fflush(stdin);         
+    }
+
+    free(packed_bits);
+    free(bits);
+    free(interleaved_bits);
+
+    fclose(fin);
+    fclose(fout);
+
+    return 0;
+}
index 3358493d5ca118410b632cae01d164d2767c5517..70f81abd2069e9c256e860bcad97111f59418b28 100644 (file)
@@ -3,7 +3,7 @@ AUTOMAKE_OPTS = gnu
 NAME = libcodec2
 AM_CPPFLAGS = $(AM_CFLAGS)
 
-noinst_PROGRAMS = genres genlsp extract vqtrain vqtrainjnd tnlp tinterp tquant tcodec2 vq_train_jvm scalarlsptest tfdmdv t48_8 lspsync
+noinst_PROGRAMS = genres genlsp extract vqtrain vqtrainjnd tnlp tinterp tquant tcodec2 vq_train_jvm scalarlsptest tfdmdv t48_8 lspsync create_interleaver
 
 genres_SOURCES = genres.c ../src/lpc.c
 genres_LDADD = $(lib_LTLIBRARIES) 
@@ -65,3 +65,7 @@ lspsync_SOURCES = lspsync.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/d
 lspsync_LDADD = $(lib_LTLIBRARIES) 
 lspsync_LDFLAGS = $(LIBS)
 
+create_interleaver_SOURCES = create_interleaver.c 
+create_interleaver_LDADD = $(lib_LTLIBRARIES) 
+create_interleaver_LDFLAGS = $(LIBS)
+
index be85acccedb8e8ef22efbf813ab2639471b92eb9..979352bc92b1712fe19a598b6ba3fd28c00b2742 100644 (file)
@@ -40,7 +40,7 @@ noinst_PROGRAMS = genres$(EXEEXT) genlsp$(EXEEXT) extract$(EXEEXT) \
        vqtrain$(EXEEXT) vqtrainjnd$(EXEEXT) tnlp$(EXEEXT) \
        tinterp$(EXEEXT) tquant$(EXEEXT) tcodec2$(EXEEXT) \
        vq_train_jvm$(EXEEXT) scalarlsptest$(EXEEXT) tfdmdv$(EXEEXT) \
-       t48_8$(EXEEXT) lspsync$(EXEEXT)
+       t48_8$(EXEEXT) lspsync$(EXEEXT) create_interleaver$(EXEEXT)
 subdir = unittest
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -50,6 +50,9 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_CLEAN_FILES =
 PROGRAMS = $(noinst_PROGRAMS)
+am_create_interleaver_OBJECTS = create_interleaver.$(OBJEXT)
+create_interleaver_OBJECTS = $(am_create_interleaver_OBJECTS)
+create_interleaver_DEPENDENCIES =
 am_extract_OBJECTS = extract.$(OBJEXT)
 extract_OBJECTS = $(am_extract_OBJECTS)
 extract_DEPENDENCIES =
@@ -125,16 +128,18 @@ LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
 CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(extract_SOURCES) $(genlsp_SOURCES) $(genres_SOURCES) \
-       $(lspsync_SOURCES) $(scalarlsptest_SOURCES) $(t48_8_SOURCES) \
-       $(tcodec2_SOURCES) $(tfdmdv_SOURCES) $(tinterp_SOURCES) \
-       $(tnlp_SOURCES) $(tquant_SOURCES) $(vq_train_jvm_SOURCES) \
-       $(vqtrain_SOURCES) $(vqtrainjnd_SOURCES)
-DIST_SOURCES = $(extract_SOURCES) $(genlsp_SOURCES) $(genres_SOURCES) \
-       $(lspsync_SOURCES) $(scalarlsptest_SOURCES) $(t48_8_SOURCES) \
-       $(tcodec2_SOURCES) $(tfdmdv_SOURCES) $(tinterp_SOURCES) \
-       $(tnlp_SOURCES) $(tquant_SOURCES) $(vq_train_jvm_SOURCES) \
-       $(vqtrain_SOURCES) $(vqtrainjnd_SOURCES)
+SOURCES = $(create_interleaver_SOURCES) $(extract_SOURCES) \
+       $(genlsp_SOURCES) $(genres_SOURCES) $(lspsync_SOURCES) \
+       $(scalarlsptest_SOURCES) $(t48_8_SOURCES) $(tcodec2_SOURCES) \
+       $(tfdmdv_SOURCES) $(tinterp_SOURCES) $(tnlp_SOURCES) \
+       $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \
+       $(vqtrainjnd_SOURCES)
+DIST_SOURCES = $(create_interleaver_SOURCES) $(extract_SOURCES) \
+       $(genlsp_SOURCES) $(genres_SOURCES) $(lspsync_SOURCES) \
+       $(scalarlsptest_SOURCES) $(t48_8_SOURCES) $(tcodec2_SOURCES) \
+       $(tfdmdv_SOURCES) $(tinterp_SOURCES) $(tnlp_SOURCES) \
+       $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \
+       $(vqtrainjnd_SOURCES)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -293,6 +298,9 @@ lspsync_SOURCES = lspsync.c ../src/quantise.c ../src/lpc.c ../src/lsp.c ../src/d
 
 lspsync_LDADD = $(lib_LTLIBRARIES) 
 lspsync_LDFLAGS = $(LIBS)
+create_interleaver_SOURCES = create_interleaver.c 
+create_interleaver_LDADD = $(lib_LTLIBRARIES) 
+create_interleaver_LDFLAGS = $(LIBS)
 all: all-am
 
 .SUFFIXES:
@@ -333,6 +341,9 @@ clean-noinstPROGRAMS:
          echo " rm -f $$p $$f"; \
          rm -f $$p $$f ; \
        done
+create_interleaver$(EXEEXT): $(create_interleaver_OBJECTS) $(create_interleaver_DEPENDENCIES) 
+       @rm -f create_interleaver$(EXEEXT)
+       $(LINK) $(create_interleaver_LDFLAGS) $(create_interleaver_OBJECTS) $(create_interleaver_LDADD) $(LIBS)
 extract$(EXEEXT): $(extract_OBJECTS) $(extract_DEPENDENCIES) 
        @rm -f extract$(EXEEXT)
        $(LINK) $(extract_LDFLAGS) $(extract_OBJECTS) $(extract_LDADD) $(LIBS)
@@ -390,6 +401,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebookjvm.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebookvq.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codec2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/create_interleaver.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv.Po@am__quote@
diff --git a/codec2-dev/unittest/create_interleaver.c b/codec2-dev/unittest/create_interleaver.c
new file mode 100644 (file)
index 0000000..39ff99c
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+  create_interleaver.c
+  David Rowe
+  May 27 2012
+
+  Creates an interleaver for Codec 2.
+*/
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+int main(int argc, char * argv[]) {
+    int   m,i, src_bit, dest_bit;
+    FILE *f;
+    int  *interleaver;
+    
+    if (argc != 3) {
+       printf("usage: %s InterleaverBits InterleaverFile\n", argv[0]);
+       exit(1);
+    }
+
+    m = atoi(argv[1]);
+    f = fopen(argv[2],"wt");
+    assert(f != NULL);
+
+
+    interleaver = (int*)malloc(m*sizeof(int));
+    assert(interleaver != NULL);
+    for(i=0; i<m; i++)
+       interleaver[i] = -1;
+
+    src_bit = 0;
+    while(src_bit != m) {
+       dest_bit = ((float)rand()/RAND_MAX)*m;
+       if (interleaver[dest_bit] == -1) {
+           interleaver[dest_bit] = src_bit;
+           src_bit++;
+       }
+    }
+
+    for(i=0; i<m; i++) {
+       fprintf(f, "%d\n", interleaver[i]);
+    }
+
+    fclose(f);
+    return 0;
+}
index e476d986a2addb04154d00463dc872f5bf332450..3ff72777feac27823293accbb0ff00f918fde650 100644 (file)
@@ -17,6 +17,7 @@
   */
 
 #include <assert.h>
+#include <math.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include "fdmdv.h"