From: drowe67 Date: Mon, 28 May 2012 02:45:10 +0000 (+0000) Subject: first pass at an interleaver, for sizes larger thanone frame we need to workout a... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=c4f3ed21c9d19de537555aa4adf0e09f5d9d738f;p=freetel-svn-tracking.git first pass at an interleaver, for sizes larger thanone frame we need to workout a way of syncing it git-svn-id: https://svn.code.sf.net/p/freetel/code@506 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/src/Makefile.am b/codec2-dev/src/Makefile.am index 428daee7..6ba41367 100644 --- a/codec2-dev/src/Makefile.am +++ b/codec2-dev/src/Makefile.am @@ -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) + diff --git a/codec2-dev/src/Makefile.in b/codec2-dev/src/Makefile.in index d4591e74..1989a457 100644 --- a/codec2-dev/src/Makefile.in +++ b/codec2-dev/src/Makefile.in @@ -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@ diff --git a/codec2-dev/src/fdmdv.h b/codec2-dev/src/fdmdv.h index 66b9e573..733db21d 100644 --- a/codec2-dev/src/fdmdv.h +++ b/codec2-dev/src/fdmdv.h @@ -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 index 00000000..010aa1a7 --- /dev/null +++ b/codec2-dev/src/fdmdv_interleave.c @@ -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 . +*/ + +#include +#include +#include +#include +#include +#include + +#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> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + assert(byte == mpacked); + + /* (de) interleave */ + + for(i=0; i +#include +#include + +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 +#include #include #include #include "fdmdv.h"