$ ./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...
% 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
--- /dev/null
+% 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
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)
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)
+
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
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)
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
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:
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)
@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@
\*---------------------------------------------------------------------------*/
-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;
\*---------------------------------------------------------------------------*/
-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;
+
}
/*---------------------------------------------------------------------------*\
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 */
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 */
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];
+ }
}
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);
#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;
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];
/* 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);
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 */
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
--- /dev/null
+/*---------------------------------------------------------------------------*\
+
+ 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;
+}
+
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) \
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
@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@
@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
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;
octave_save_int(fout, "coarse_fine_log_c", coarse_fine_log, 1, FRAMES);
fclose(fout);
- codec2_destroy(fdmdv);
+ fdmdv_destroy(fdmdv);
return 0;
}