working on getting stm32 dir building again, put conditional defines in src to preven...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 26 Aug 2015 03:34:54 +0000 (03:34 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 26 Aug 2015 03:34:54 +0000 (03:34 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2286 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/codec2.c
codec2-dev/src/freedv_api.c
codec2-dev/src/freedv_api.h
codec2-dev/src/quantise.c
codec2-dev/stm32/Makefile
codec2-dev/stm32/src/fdmdv_profile.c
codec2-dev/stm32/src/freedv_rx_profile.c
codec2-dev/stm32/src/freedv_tx_profile.c
codec2-dev/stm32/src/sm1000_main.c

index a41827e0c9248f943cea6d5bd00dec3fe97a098d..8f3f79ce413ab78dd4c07fa2457dfe6c31959a2d 100644 (file)
@@ -277,10 +277,12 @@ void codec2_encode(struct CODEC2 *c2, unsigned char *bits, short speech[])
        codec2_encode_1300(c2, bits, speech);
     if (c2->mode == CODEC2_MODE_1200)
        codec2_encode_1200(c2, bits, speech);
+#ifndef CORTEX_M4
     if (c2->mode == CODEC2_MODE_700)
        codec2_encode_700(c2, bits, speech);
     if (c2->mode == CODEC2_MODE_700B)
        codec2_encode_700b(c2, bits, speech);
+#endif
 }
 
 void codec2_decode(struct CODEC2 *c2, short speech[], const unsigned char *bits)
@@ -314,10 +316,12 @@ void codec2_decode_ber(struct CODEC2 *c2, short speech[], const unsigned char *b
        codec2_decode_1300(c2, speech, bits, ber_est);
     if (c2->mode == CODEC2_MODE_1200)
        codec2_decode_1200(c2, speech, bits);
+#ifndef CORTEX_M4
     if (c2->mode == CODEC2_MODE_700)
        codec2_decode_700(c2, speech, bits);
     if (c2->mode == CODEC2_MODE_700B)
        codec2_decode_700b(c2, speech, bits);
+#endif
 }
 
 
@@ -1334,6 +1338,7 @@ void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char *
 }
 
 
+#ifndef CORTEX_M4
 /*---------------------------------------------------------------------------*\
                                                        
   FUNCTION....: codec2_encode_700           
@@ -1741,7 +1746,7 @@ void codec2_decode_700b(struct CODEC2 *c2, short speech[], const unsigned char *
     for(i=0; i<LPC_ORD_LOW; i++)
        c2->prev_lsps_dec[i] = lsps[3][i];
 }
-
+#endif
 
 /*---------------------------------------------------------------------------*\
                                                        
index 0605860461ced1ebb2775ed72074a097e313edaf..ee500af4a56b6722702d07053cd352d089e963de 100644 (file)
@@ -107,6 +107,7 @@ struct freedv *freedv_open(int mode) {
         f->sz_error_pattern = fdmdv_error_pattern_size(f->fdmdv);
     }
 
+#ifndef CORTEX_M4
     if ((mode == FREEDV_MODE_700) || (mode == FREEDV_MODE_700B)) {
         f->snr_squelch_thresh = 0.0;
         f->squelch_en = 0;
@@ -126,6 +127,7 @@ struct freedv *freedv_open(int mode) {
             return NULL;
         f->sz_error_pattern = cohpsk_error_pattern_size();
     }
+#endif
 
     f->test_frame_sync_state = 0;
     f->total_bits = 0;
@@ -183,8 +185,10 @@ void freedv_close(struct freedv *freedv) {
     free(freedv->tx_bits);
     if (freedv->mode == FREEDV_MODE_1600)
         fdmdv_destroy(freedv->fdmdv);
+#ifndef CORTEX_M4
     if (freedv->mode == FREEDV_MODE_700)
         cohpsk_destroy(freedv->cohpsk);
+#endif
     codec2_destroy(freedv->codec2);
     free(freedv);
 }
@@ -335,6 +339,7 @@ void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) {
     }
 
 
+#ifndef CORTEX_M4
     if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) {
         bits_per_codec_frame = codec2_bits_per_frame(f->codec2);
         bits_per_modem_frame = COHPSK_BITS_PER_FRAME;
@@ -399,6 +404,7 @@ void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) {
         for(i=0; i<f->n_nom_modem_samples; i++)
             mod_out[i] = fcmult(FDMDV_SCALE*NORM_PWR, tx_fdm[i]);
     }
+#endif
 }
 
 int freedv_nin(struct freedv *f) {
@@ -653,6 +659,7 @@ int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) {
     }
 
 
+#ifndef CORTEX_M4
     if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) {
         float rx_bits[COHPSK_BITS_PER_FRAME];
         int   sync;
@@ -781,9 +788,9 @@ int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) {
                 //fprintf(stderr, "%d %d %d\n", f->n_speech_samples, speech_out[0], speech_out[nin_prev-1]);
             }
         }
-            
 
     }
+#endif            
      
     //fprintf(stderr,"f->stats.sync: %d reliable_sync_bit: %d evenframe: %d nout: %d\n", f->stats.sync, reliable_sync_bit, f->evenframe, nout);
     return nout;
@@ -845,8 +852,10 @@ void freedv_get_modem_stats(struct freedv *f, int *sync, float *snr_est)
 {
     if (f->mode == FREEDV_MODE_1600)
         fdmdv_get_demod_stats(f->fdmdv, &f->stats);
+#ifndef CORTEX_M4
     if (f->mode == FREEDV_MODE_700)
         cohpsk_get_demod_stats(f->cohpsk, &f->stats);
+#endif
     if (sync) *sync = f->stats.sync;
     if (snr_est) *snr_est = f->stats.snr_est;
 }
@@ -865,6 +874,7 @@ void freedv_get_modem_stats(struct freedv *f, int *sync, float *snr_est)
 // Set integers
 void freedv_set_test_frames                            (struct freedv *f, int val) {f->smooth_symbols = val;}
 void freedv_set_squelch_en                             (struct freedv *f, int val) {f->squelch_en = val;}
+void freedv_zero_total_bit_errors                      (struct freedv *f) {f->total_bit_errors = 0;}
 // Set floats
 void freedv_set_snr_squelch_thresh             (struct freedv *f, float val) {f->snr_squelch_thresh = val;}
 
@@ -886,5 +896,6 @@ int freedv_get_n_max_modem_samples          (struct freedv *f) {return f->n_max_modem_sa
 int freedv_get_n_nom_modem_samples             (struct freedv *f) {return f->n_nom_modem_samples;}
 int freedv_get_total_bits                              (struct freedv *f) {return f->total_bits;}
 int freedv_get_total_bit_errors                        (struct freedv *f) {return f->total_bit_errors;}
+int freedv_get_sync                            (struct freedv *f) {return  f->stats.sync;}
 // Get floats
 
index 7f1825c073c74526351b1ef4f5b8fc809f3728f0..0f1b0aea30865f2657b220bbf2d52abec81c6e3e 100644 (file)
@@ -73,6 +73,8 @@ int freedv_get_n_max_modem_samples    (struct freedv *freedv);
 int freedv_get_n_nom_modem_samples     (struct freedv *freedv);
 int freedv_get_total_bits                      (struct freedv *freedv);
 int freedv_get_total_bit_errors                (struct freedv *freedv);
+void freedv_zero_total_bit_errors      (struct freedv *freedv);
+int freedv_get_sync                    (struct freedv *freedv);
 #endif
 
 #ifdef __cplusplus
index c722280058b0677cdfe65148b49058e7c34313d1..fe1ebe789fa4c435af22e25064e101b66f30f7be 100644 (file)
@@ -65,6 +65,7 @@ int lspd_bits(int i) {
     return lsp_cbd[i].log2m;
 }
 
+#ifndef CORTEX_M4
 int mel_bits(int i) {
     return mel_cb[i].log2m;
 }
@@ -72,6 +73,7 @@ int mel_bits(int i) {
 int lspmelvq_cb_bits(int i) {
     return lspmelvq_cb[i].log2m;
 }
+#endif
 
 #ifdef __EXPERIMENTAL__
 int lspdt_bits(int i) {
@@ -539,6 +541,7 @@ void lspjvm_quantise(float *x, float *xq, int order)
 }
 
 
+#ifndef CORTEX_M4
 /* simple (non mbest) 6th order LSP MEL VQ quantiser.  Returns MSE of result */
 
 float lspmelvq_quantise(float *x, float *xq, int order)
@@ -781,6 +784,7 @@ void lspmelvq_decode(int *indexes, float *xq, int ndim)
       xq[i] = codebook1[ndim*n1+i] + codebook2[ndim*n2+i] + codebook3[ndim*n3+i];
   }
 }
+#endif
 
 
 int check_lsp_order(float lsp[], int order)
@@ -1366,6 +1370,8 @@ void decode_lsps_scalar(float lsp[], int indexes[], int order)
 }
 
 
+#ifndef CORTEX_M4
+
 /*---------------------------------------------------------------------------*\
                                                        
   FUNCTION....: encode_mels_scalar()        
@@ -1433,6 +1439,7 @@ void decode_mels_scalar(float mels[], int indexes[], int order)
 
 }
 
+#endif
 
 #ifdef __EXPERIMENTAL__
 
index 95b9316b81e4d9eca033f5de6dd66210a1f434e3..b70c2a213f00c0cc98a77624cd1bd2c432cdd2b6 100644 (file)
@@ -6,14 +6,14 @@ FLOAT_TYPE=hard
 
 ###################################################
 
-BINPATH=/opt/gcc-arm-none-eabi-4_7-2013q1/bin
-CC=$(BINPATH)/arm-none-eabi-gcc
-OBJCOPY=$(BINPATH)/arm-none-eabi-objcopy
-SIZE=$(BINPATH)/arm-none-eabi-size
+BINPATH=
+CC=$(BINPATH)arm-none-eabi-gcc
+OBJCOPY=$(BINPATH)arm-none-eabi-objcopy
+SIZE=$(BINPATH)arm-none-eabi-size
 
 ###################################################
 
-CFLAGS  = -std=gnu99 -O0 -g -Wall -Tstm32_flash.ld -DSTM32F4XX -DCORTEX_M4
+CFLAGS  = -std=gnu99 -O0 -g -Wall -Tstm32_flash.ld -DSTM32F40_41xxx -DCORTEX_M4
 CFLAGS += -mlittle-endian -mthumb -mthumb-interwork -nostartfiles -mcpu=cortex-m4
 
 ifeq ($(FLOAT_TYPE), hard)
@@ -30,7 +30,7 @@ endif
 
 PERIPHLIBURL    = http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/
 PERIPHLIBZIP    = stm32f4_dsp_stdperiph_lib.zip
-PERIPHLIBVER   = V1.5.0
+PERIPHLIBVER   = V1.4.0
 PERIPHLIBNAME  = STM32F4xx_DSP_StdPeriph_Lib
 PERIPHLIBDIR   = $(PERIPHLIBNAME)
 CMSIS          = $(PERIPHLIBDIR)/Libraries/CMSIS
@@ -79,7 +79,7 @@ CFLAGS += -I../unittest
 CFLAGS += -Iinc
 
 FFT_TEST_SRCS = \
-$(DSPLIB)/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c \
+$(DSPLIB)/Examples/arm_fft_bin_example/arm_fft_bin_data.c \
 fft_test.c \
 src/startup_stm32f4xx.s \
 stm32f4_machdep.c \
@@ -109,7 +109,7 @@ OBJS = $(SRCS:.c=.o)
 
 ###################################################
 
-all: libstm32f4.a codec2_profile.elf fft_test.elf dac_ut.elf dac_play.elf adc_rec.elf pwm_ut.elf fdmdv_profile.elf sm1000_leds_switches_ut.elf sm1000.elf adcdac_ut.elf freedv_tx_profile.elf freedv_rx_profile.elf adc_sd.elf usb_vcp_ut.elf fdmdv_dump_rt.elf tuner_ut.elf fast_dac_ut.elf
+all: libstm32f4.a codec2_profile.elf fft_test.elf dac_ut.elf dac_play.elf adc_rec.elf pwm_ut.elf fdmdv_profile.elf sm1000_leds_switches_ut.elf sm1000.elf adcdac_ut.elf freedv_tx_profile.elf freedv_rx_profile.elf adc_sd.elf usb_vcp_ut.elf tuner_ut.elf fast_dac_ut.elf
 
 dl/$(PERIPHLIBZIP):
        mkdir -p dl
@@ -117,7 +117,7 @@ dl/$(PERIPHLIBZIP):
 
 $(PERIPHLIBDIR): dl/$(PERIPHLIBZIP)
        cd dl; unzip $(PERIPHLIBZIP)
-       mv dl/$(PERIPHLIBDIR) $(PERIPHLIBDIR)
+       mv dl/$(PERIPHLIBDIR)_$(PERIPHLIBVER) $(PERIPHLIBDIR)
 
 libstm32f4.a: $(PERIPHLIBDIR)
        $(MAKE) $(STM32F4TEMPLATE)/system_stm32f4xx.o
index 06dc512912f05f5d1c403f9a7a77ea02228cb1bc..05b8d62389790841eb321c2fd60cb5121ba97176 100644 (file)
@@ -90,7 +90,7 @@ int main(int argc, char *argv[]) {
     COMP                rx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME];\r
     int                 i, j, nin, reliable_sync_bit[2], sync_bit, bit_errors, ntest_bits, test_frame_sync;\r
     short              *error_pattern;\r
-    struct FDMDV_STATS  stats;\r
+    struct MODEM_STATS  stats;\r
     PROFILE_VAR(mod_start, demod_start);\r
 \r
     machdep_profile_init ();\r
index 5c0d216bfd236f2999b40cb0b85271d2d8c89d8a..65b43ae1d51e865a493672314f47e8c7730ed832 100644 (file)
 \r
 int main(int argc, char *argv[]) {\r
     struct freedv *f;\r
-    short          adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K];\r
-    short          dac16k[FREEDV_NSAMPLES_16K];\r
-    short          adc8k[FREEDV_NSAMPLES];\r
-    short          dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES];\r
     FILE          *fin, *fout, *ftotal;\r
     int            frame, nin_16k, nin, i, nout = 0;\r
-    struct FDMDV_STATS  stats;\r
+    int            n_samples, n_samples_16k;\r
+    int            sync;\r
+    float          snr_est;\r
+\r
     PROFILE_VAR(fdmdv_16_to_8_start, freedv_rx_start, fdmdv_8_to_16_start);\r
 \r
     machdep_profile_init();\r
 \r
     f = freedv_open(FREEDV_MODE_1600);\r
+    n_samples = freedv_get_n_speech_samples(f);\r
+    n_samples_16k = 2*n_samples;\r
+\r
+    short          adc16k[FDMDV_OS_TAPS_16K+n_samples_16k];\r
+    short          dac16k[n_samples_16k];\r
+    short          adc8k[n_samples];\r
+    short          dac8k[FDMDV_OS_TAPS_8K+n_samples];\r
 \r
     // Receive ---------------------------------------------------------------------\r
 \r
@@ -105,7 +111,6 @@ int main(int argc, char *argv[]) {
 \r
         nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k);\r
         nin = freedv_nin(f); nin_16k = 2*nin;\r
-        fdmdv_get_demod_stats(f->fdmdv, &stats);\r
 \r
         PROFILE_SAMPLE_AND_LOG(fdmdv_8_to_16_start, freedv_rx_start, "  freedv_rx");     \r
 \r
@@ -117,9 +122,9 @@ int main(int argc, char *argv[]) {
         machdep_profile_print_logged_samples();\r
 \r
         fwrite(dac16k, sizeof(short), 2*nout, fout);\r
-        fdmdv_get_demod_stats(f->fdmdv, &stats);\r
+        freedv_get_modem_stats(f, &sync, &snr_est);\r
         printf("frame: %d nin_16k: %d sync: %d SNR: %3.2f \n", \r
-               ++frame, nin_16k, stats.sync, (double)stats.snr_est);\r
+               ++frame, nin_16k, sync, (double)snr_est);\r
     }\r
 \r
     fclose(fin);\r
index 7391c521a2ea3d38efc148638b3e21b282aba648..54b589150d8234c882579f0dcb284081b37049cd 100644 (file)
 \r
 int main(int argc, char *argv[]) {\r
     struct freedv *f;\r
-    short          inbuf[FREEDV_NSAMPLES], outbuf[FREEDV_NSAMPLES];\r
     FILE          *fin, *fout;\r
-    int            frame;\r
+    int            frame, n_samples;\r
     PROFILE_VAR(freedv_start);\r
 \r
     machdep_profile_init();\r
 \r
     f = freedv_open(FREEDV_MODE_1600);\r
+    n_samples = freedv_get_n_speech_samples(f);\r
+    short inbuf[n_samples], outbuf[n_samples];\r
 \r
     // Transmit ---------------------------------------------------------------------\r
 \r
@@ -71,12 +72,12 @@ int main(int argc, char *argv[]) {
 \r
     frame = 0;\r
 \r
-    while (fread(inbuf, sizeof(short), FREEDV_NSAMPLES, fin) == FREEDV_NSAMPLES) {\r
+    while (fread(inbuf, sizeof(short), n_samples, fin) == n_samples) {\r
         PROFILE_SAMPLE(freedv_start);\r
         freedv_tx(f, outbuf, inbuf);\r
         PROFILE_SAMPLE_AND_LOG2(freedv_start, "  freedv_tx");     \r
        \r
-        fwrite(outbuf, sizeof(short), FREEDV_NSAMPLES, fout);\r
+        fwrite(outbuf, sizeof(short), n_samples, fout);\r
         printf("frame: %d\n", ++frame);\r
         machdep_profile_print_logged_samples();\r
    }\r
index b40fa516b767c3bab6cb16b8a398a9eeded211e3..56a2b9510975f2ce9e1439672447298d23bbed3e 100644 (file)
@@ -75,12 +75,9 @@ short aSine[] = {
 \r
 int main(void) {\r
     struct freedv *f;\r
-    short          adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K];\r
-    short          dac16k[FREEDV_NSAMPLES_16K];\r
-    short          adc8k[FREEDV_NSAMPLES];\r
-    short          dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES];\r
     SWITCH_STATE   ss;\r
     int            nin, nout, i;\r
+    int            n_samples, n_samples_16k;\r
 \r
     /* init all the drivers for various peripherals */\r
 \r
@@ -89,6 +86,13 @@ int main(void) {
     dac_open(4*DAC_BUF_SZ);\r
     adc_open(4*ADC_BUF_SZ);\r
     f = freedv_open(FREEDV_MODE_1600);\r
+    n_samples = freedv_get_n_speech_samples(f);\r
+    n_samples_16k = 2*n_samples;\r
+\r
+    short          adc16k[FDMDV_OS_TAPS_16K+n_samples_16k];\r
+    short          dac16k[n_samples_16k];\r
+    short          adc8k[n_samples];\r
+    short          dac8k[FDMDV_OS_TAPS_8K+n_samples];\r
 \r
     /* put outputs into a known state */\r
 \r
@@ -114,35 +118,35 @@ int main(void) {
 \r
             /* ADC2 is the SM1000 microphone, DAC1 is the modulator signal we send to radio tx */\r
 \r
-            if (adc2_read(&adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES_16K) == 0) {\r
+            if (adc2_read(&adc16k[FDMDV_OS_TAPS_16K], n_samples_16k) == 0) {\r
                 GPIOE->ODR = (1 << 3);\r
 \r
                 /* clipping indicator */\r
 \r
                 led_err(0);\r
-                for (i=0; i<FREEDV_NSAMPLES_16K; i++) {\r
+                for (i=0; i<n_samples_16k; i++) {\r
                     if (abs(adc16k[FDMDV_OS_TAPS_16K+i]) > 28000)\r
                         led_err(1);\r
                 }\r
 \r
-                fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES);\r
+                fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples);\r
 \r
                 if (ss.mode == ANALOG) {\r
-                    for(i=0; i<FREEDV_NSAMPLES; i++)\r
+                    for(i=0; i<n_samples; i++)\r
                         dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\r
-                    fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES);              \r
-                    dac1_write(dac16k, FREEDV_NSAMPLES_16K);\r
+                    fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], n_samples);              \r
+                    dac1_write(dac16k, n_samples_16k);\r
                 }\r
                 if (ss.mode == DV) {\r
                     freedv_tx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k);\r
-                    for(i=0; i<FREEDV_NSAMPLES; i++)\r
+                    for(i=0; i<n_samples; i++)\r
                         dac8k[FDMDV_OS_TAPS_8K+i] *= 0.398; /* 8dB back off from peak */\r
-                    fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES);              \r
-                    dac1_write(dac16k, FREEDV_NSAMPLES_16K);\r
+                    fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], n_samples);              \r
+                    dac1_write(dac16k, n_samples_16k);\r
                 }\r
                 if (ss.mode == TONE) {\r
                     short buf[SINE_SAMPLES];\r
-                    for(i=0; i<FREEDV_NSAMPLES; i++)\r
+                    for(i=0; i<n_samples; i++)\r
                         buf[i] = aSine[i]*0.398; /* 8dB back off from peak */                   \r
                     while(dac1_write(buf, SINE_SAMPLES) == 0);\r
                 }\r
@@ -162,14 +166,12 @@ int main(void) {
 \r
             if (ss.mode == ANALOG) {\r
 \r
-                /* force analog bypass when select down */\r
-\r
-                if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES_16K) == 0) {\r
-                    fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES);\r
-                    for(i=0; i<FREEDV_NSAMPLES; i++)\r
+                if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], n_samples_16k) == 0) {\r
+                    fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples);\r
+                    for(i=0; i<n_samples; i++)\r
                         dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\r
-                    fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES);              \r
-                    dac2_write(dac16k, FREEDV_NSAMPLES_16K);\r
+                    fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], n_samples);              \r
+                    dac2_write(dac16k, n_samples_16k);\r
                     led_rt(0); led_err(0);\r
                }\r
             }\r
@@ -179,7 +181,7 @@ int main(void) {
 \r
                 nin = freedv_nin(f);   \r
                 nout = nin;\r
-                f->total_bit_errors = 0;\r
+                freedv_zero_total_bit_errors(f);\r
 \r
                 if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], 2*nin) == 0) {\r
                     GPIOE->ODR = (1 << 3);\r
@@ -187,7 +189,7 @@ int main(void) {
                     nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k);\r
                     fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout);              \r
                     dac2_write(dac16k, 2*nout);\r
-                    led_rt(f->fdmdv_stats.sync); led_err(f->total_bit_errors);\r
+                    led_rt(freedv_get_sync(f)); led_err(freedv_get_total_bit_errors(f));\r
                     GPIOE->ODR &= ~(1 << 3);\r
                 }\r
             }\r