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)
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)
+
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
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)
$(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
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:
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)
@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@
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
--- /dev/null
+/*---------------------------------------------------------------------------*\
+
+ 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;
+}
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)
lspsync_LDADD = $(lib_LTLIBRARIES)
lspsync_LDFLAGS = $(LIBS)
+create_interleaver_SOURCES = create_interleaver.c
+create_interleaver_LDADD = $(lib_LTLIBRARIES)
+create_interleaver_LDFLAGS = $(LIBS)
+
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
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 =
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)
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:
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)
@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@
--- /dev/null
+/*
+ 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;
+}
*/
#include <assert.h>
+#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "fdmdv.h"