--- /dev/null
+/*---------------------------------------------------------------------------*\\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