test program to run rx for a while then dump scatter diagram data for plotting. ...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 9 Sep 2014 05:34:59 +0000 (05:34 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 9 Sep 2014 05:34:59 +0000 (05:34 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1836 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/stm32/Makefile
codec2-dev/stm32/src/fdmdv_dump_rt.c [new file with mode: 0644]

index b6f52e671a62d4908372dd01b71cf082eab0c3dc..9fc660b230e4cfd71f1c763c421e0244579e871e 100644 (file)
@@ -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
+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
 
 dl/$(PERIPHLIBZIP):
        mkdir -p dl
@@ -331,6 +331,21 @@ FREEDV_RX_PROFILE_SRCS += $(CODEC2_SRCS)
 freedv_rx_profile.elf: $(FREEDV_RX_PROFILE_SRCS)
        $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS)
 
+FDMDV_DUMP_RT_SRCS=\
+src/fdmdv_dump_rt.c \
+src/sm1000_leds_switches.c \
+../src/fifo.c \
+src/debugblinky.c \
+gdb_stdio.c \
+src/system_stm32f4xx.c \
+src/startup_stm32f4xx.s \
+src/init.c 
+
+FDMDV_DUMP_RT_SRCS += $(CODEC2_SRCS)
+
+fdmdv_dump_rt.elf: $(FDMDV_DUMP_RT_SRCS) src/stm32f4_dac.o src/stm32f4_adc.o
+       $(CC) $(CFLAGS) -O3 $^ -o $@ $(LIBPATHS) $(LIBS)
+
 clean:
        rm -f *.o
        rm -f *.elf
diff --git a/codec2-dev/stm32/src/fdmdv_dump_rt.c b/codec2-dev/stm32/src/fdmdv_dump_rt.c
new file mode 100644 (file)
index 0000000..00cdcca
--- /dev/null
@@ -0,0 +1,154 @@
+/*---------------------------------------------------------------------------*\\r
+\r
+  FILE........: fdmdv_dump_rt.c\r
+  AUTHOR......: David Rowe\r
+  DATE CREATED: 9 Sep 2014\r
+\r
+ Runs the fdmdv demod in real time for a few seconds then dumps some\r
+ modem info to a text file for plotting in Octave.  Way to verify the\r
+ "from radio" SM1000 hardware, ADC, and demod on the SM1000.\r
+\r
+ Requires FreeDV signal to be sent to CN6 of SM1000.\r
+\r
+ Octave:\r
+\r
+   load scatter.txt\r
+   l=length(scatter)\r
+   plot(scatter(:,1:2:l),scatter(:,2:2:l),'+')\r
+\r
+\*---------------------------------------------------------------------------*/\r
+\r
+/*\r
+  Copyright (C) 2014 David Rowe\r
+\r
+  All rights reserved.\r
+\r
+  This program is free software; you can redistribute it and/or modify\r
+  it under the terms of the GNU Lesser General Public License version 2.1, as\r
+  published by the Free Software Foundation.  This program is\r
+  distributed in the hope that it will be useful, but WITHOUT ANY\r
+  WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\r
+  License for more details.\r
+\r
+  You should have received a copy of the GNU Lesser General Public License\r
+  along with this program; if not, see <http://www.gnu.org/licenses/>.\r
+*/\r
+\r
+#include <assert.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <stdint.h>\r
+#include <math.h>\r
+\r
+#include <stm32f4xx_gpio.h>\r
+#include "stm32f4_adc.h"\r
+#include "stm32f4_dac.h"\r
+#include "freedv_api.h"\r
+#include "codec2_fdmdv.h"\r
+#include "sm1000_leds_switches.h"\r
+#include "gdb_stdio.h"\r
+\r
+#ifdef __EMBEDDED__\r
+#define printf gdb_stdio_printf\r
+#define fprintf gdb_stdio_fprintf\r
+#define fopen gdb_stdio_fopen\r
+#define fclose gdb_stdio_fclose\r
+#define fread gdb_stdio_fread\r
+#define fwrite gdb_stdio_fwrite\r
+#endif\r
+\r
+#define FREEDV_NSAMPLES_16K (2*FREEDV_NSAMPLES)\r
+#define START_LOG_FRAMES 100\r
+#define LOG_FRAMES       10\r
+#define STOP_LOG_FRAMES  (START_LOG_FRAMES+LOG_FRAMES)\r
+#define NC  16\r
+\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
\r
+    int            nin, nout, i, j, frames, lines;\r
+\r
+    COMP          *symb, *psymb;\r
+\r
+    /* init all the drivers for various peripherals */\r
+\r
+    sm1000_leds_switches_init();\r
+    dac_open(4*DAC_BUF_SZ);\r
+    adc_open(4*ADC_BUF_SZ);\r
+    f = freedv_open(FREEDV_MODE_1600);\r
+\r
+    /* clear filter memories */\r
+\r
+    for(i=0; i<FDMDV_OS_TAPS_16K; i++)\r
+       adc16k[i] = 0.0;\r
+    for(i=0; i<FDMDV_OS_TAPS_8K; i++)\r
+       dac8k[i] = 0.0;\r
+\r
+    /* allocate storage for the symbols */\r
+\r
+#define TMP\r
+#ifdef TMP\r
+    symb = (COMP*)malloc(sizeof(COMP)*(NC+1)*(STOP_LOG_FRAMES - START_LOG_FRAMES));\r
+    assert(symb != NULL);\r
+    psymb = symb;\r
+    frames = 0;\r
+    lines = 0;\r
+#endif\r
+    while(1)  {\r
+\r
+        /* Receive --------------------------------------------------------------------------*/\r
+\r
+        /* ADC1 is the demod in signal from the radio rx, DAC2 is the SM1000 speaker */\r
+\r
+        nin = freedv_nin(f);   \r
+        nout = nin;\r
+        f->total_bit_errors = 0;\r
+\r
+        if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], 2*nin) == 0) {\r
+            GPIOE->ODR = (1 << 3);\r
+            fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], nin);\r
+            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_ptt(0); led_rt(f->fdmdv_stats.sync); led_err(f->total_bit_errors);\r
+            GPIOE->ODR &= ~(1 << 3);\r
+\r
+#define TMP1\r
+#ifdef TMP1\r
+            if (f->fdmdv_stats.sync)\r
+                frames++;\r
+            if ((frames >= START_LOG_FRAMES) && (lines < LOG_FRAMES)) {\r
+                for(i=0; i<=f->fdmdv_stats.Nc; i++)\r
+                    psymb[i] = f->fdmdv_stats.rx_symbols[i];\r
+                psymb += (f->fdmdv_stats.Nc+1);\r
+                lines++;\r
+            }\r
\r
+            if (frames >= STOP_LOG_FRAMES) {\r
+                FILE *ft = fopen("scatter.txt", "wt");\r
+                assert(ft != NULL);\r
+                printf("Writing scatter file....\n");\r
+                for(j=0; j<LOG_FRAMES; j++) {\r
+                    for(i=0; i<=f->fdmdv_stats.Nc; i++) {\r
+                        fprintf(ft, "%f\t%f\t", \r
+                                (double)symb[j*(f->fdmdv_stats.Nc+1)+i].real,\r
+                                (double)symb[j*(f->fdmdv_stats.Nc+1)+i].imag);\r
+                        printf("line: %d\n", j);\r
+                    }\r
+                    fprintf(ft, "\n");\r
+                }\r
+                fclose(ft);\r
+                printf("SNR = %3.2f dB\nfinished!\n", (double)f->fdmdv_stats.snr_est);\r
+                while(1);\r
+            }\r
+#endif\r
+        }\r
+      \r
+    } /* while(1) ... */\r
+}\r
+\r