FreeDV tx & rx working in real time. Yayyyyyyyyy
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 21 Aug 2014 03:26:55 +0000 (03:26 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 21 Aug 2014 03:26:55 +0000 (03:26 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1813 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/stm32/Makefile
codec2-dev/stm32/src/freedv_rx_profile.c
codec2-dev/stm32/src/sm1000_main.c
codec2-dev/stm32/src/stm32f4_adc.c

index e33b8b9e2e0a236d60a0d92b1330dbea7f63e927..707c177b81dd5f120b84fc47e79f42c518862a20 100644 (file)
@@ -287,7 +287,7 @@ src/init.c
 FREEDV_RX_PROFILE_SRCS += $(CODEC2_SRCS)
 
 freedv_rx_profile.elf: $(FREEDV_RX_PROFILE_SRCS)
-       $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS)
+       $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS)
 
 clean:
        rm -f *.o
index c116c7ff81fc464b70a5389d2e2232bca8b301ba..5c0d216bfd236f2999b40cb0b85271d2d8c89d8a 100644 (file)
@@ -25,6 +25,9 @@
   along with this program; if not, see <http://www.gnu.org/licenses/>.\r
 */\r
 \r
+#define PROFILE\r
+\r
+#include <assert.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <stdint.h>\r
@@ -35,6 +38,7 @@
 #include "gdb_stdio.h"\r
 #include "freedv_api.h"\r
 #include "machdep.h"\r
+#include "codec2_fdmdv.h"\r
 \r
 #ifdef __EMBEDDED__\r
 #define printf gdb_stdio_printf\r
 #define fclose gdb_stdio_fclose\r
 #define fread gdb_stdio_fread\r
 #define fwrite gdb_stdio_fwrite\r
+#define fprintf gdb_stdio_fprintf\r
 #endif\r
 \r
+#define FREEDV_NSAMPLES_16K (2*FREEDV_NSAMPLES)\r
+\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, nin, nout = 0;\r
-    PROFILE_VAR(freedv_start);\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
+    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
 \r
-    // Transmit ---------------------------------------------------------------------\r
+    // Receive ---------------------------------------------------------------------\r
 \r
     frame = 0;\r
 \r
-    fin = fopen("mod.raw", "rb");\r
+    fin = fopen("mod_16k.raw", "rb");\r
     if (fin == NULL) {\r
         printf("Error opening input file\n");\r
         exit(1);\r
     }\r
 \r
-    fout = fopen("stm_out.raw", "wb");\r
+    fout = fopen("speechout_16k.raw", "wb");\r
     if (fout == NULL) {\r
         printf("Error opening output file\n");\r
         exit(1);\r
     }\r
 \r
+    ftotal = fopen("total.txt", "wt");\r
+    assert(ftotal != NULL);\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
     nin = freedv_nin(f);\r
-    while (fread(inbuf, sizeof(short), nin, fin) == nin) {\r
-        PROFILE_SAMPLE(freedv_start);\r
-        nout = freedv_rx(f, outbuf, inbuf);\r
-        nin = freedv_nin(f);\r
-        PROFILE_SAMPLE_AND_LOG2(freedv_start, "  demod");     \r
+    nin_16k = 2*nin;\r
+    nout = nin;\r
+    while (fread(&adc16k[FDMDV_OS_TAPS_16K], sizeof(short), nin_16k, fin) == nin_16k) {\r
+\r
+        PROFILE_SAMPLE(fdmdv_16_to_8_start);\r
+\r
+        fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], nin);\r
 \r
+        PROFILE_SAMPLE_AND_LOG(freedv_rx_start, fdmdv_16_to_8_start, "  fdmdv_16_to_8");\r
+\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
+        fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout);              \r
+\r
+        PROFILE_SAMPLE_AND_LOG2(fdmdv_8_to_16_start, "  fdmdv_8_to_16");\r
+\r
+        fprintf(ftotal, "%d\n", machdep_profile_sample() - fdmdv_16_to_8_start);\r
         machdep_profile_print_logged_samples();\r
-        fwrite(outbuf, sizeof(short), nout, fout);\r
-        printf("frame: %d\n", ++frame);\r
+\r
+        fwrite(dac16k, sizeof(short), 2*nout, fout);\r
+        fdmdv_get_demod_stats(f->fdmdv, &stats);\r
+        printf("frame: %d nin_16k: %d sync: %d SNR: %3.2f \n", \r
+               ++frame, nin_16k, stats.sync, (double)stats.snr_est);\r
     }\r
 \r
     fclose(fin);\r
     fclose(fout);\r
+    fclose(ftotal);\r
 \r
     return 0;\r
 }\r
index 5aaabe9b4a0780e3466b3f1c3c3e916b0eee2121..28694ece3919613438363115669cf55dd88ce069 100644 (file)
 \r
 int main(void) {\r
     struct freedv *f;\r
-    float  adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K];\r
-    float  adc8k[FREEDV_NSAMPLES];\r
-    float  dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES];\r
-    float  dac16k[FREEDV_NSAMPLES_16K];\r
-    short  buf[FREEDV_NSAMPLES_16K];\r
-\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;\r
 \r
     /* init all the drivers for various peripherals */\r
@@ -49,7 +48,7 @@ int main(void) {
     //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
+    f = freedv_open(FREEDV_MODE_1600);\r
 \r
     /* LEDs into a known state */\r
 \r
@@ -78,34 +77,29 @@ int main(void) {
        dac8k[i] = 0.0;\r
     \r
     while(1) {\r
-        if(1) {\r
+\r
+\r
+        if (0) {\r
 \r
             /* Transmit -------------------------------------------------------------------------*/\r
 \r
             /* ADC2 is the SM1000 microphone, DAC1 is the modulator signal we send to radio tx */\r
 \r
-            if (adc1_read(buf, FREEDV_NSAMPLES_16K) == 0) {\r
-\r
+            if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES_16K) == 0) {\r
                 GPIOE->ODR = (1 << 3);\r
-                for(i=0; i<FREEDV_NSAMPLES_16K; i++)\r
-                    adc16k[FDMDV_OS_TAPS_16K+i] = buf[i];\r
 \r
-                fdmdv_16_to_8(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES);\r
+                fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES);\r
 \r
-                for(i=0; i<FREEDV_NSAMPLES; i++)\r
-                    buf[i] = adc8k[i];\r
-                //freedv_tx(f, buf, buf);\r
-                for(i=0; i<FREEDV_NSAMPLES; i++)\r
-                    dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\r
+                freedv_tx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k);\r
+                //for(i=0; i<FREEDV_NSAMPLES; i++)\r
+                //    dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\r
 \r
-                fdmdv_8_to_16(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES);              \r
+                fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES);              \r
 \r
-                for(i=0; i<FREEDV_NSAMPLES_16K; i++)\r
-                    buf[i] = dac16k[i];          \r
-                dac2_write(buf, FREEDV_NSAMPLES_16K);\r
-                GPIOE->ODR &= ~(1 << 3);\r
+                dac2_write(dac16k, FREEDV_NSAMPLES_16K);\r
 \r
                 //led_ptt(1); led_rt(0); led_err(0);\r
+                GPIOE->ODR &= ~(1 << 3);\r
             }\r
 \r
         }\r
@@ -115,18 +109,24 @@ int main(void) {
 \r
             /* ADC1 is the demod in signal from the radio rx, DAC2 is the SM1000 speaker */\r
 \r
-            nin = freedv_nin(f);\r
+            nin = freedv_nin(f);   \r
+            nout = nin;\r
             f->total_bit_errors = 0;\r
-            \r
-            if (adc1_read(buf, nin) == 0) {\r
-                nout = freedv_rx(f, buf, buf);\r
-                dac2_write(buf, nout);\r
-                led_ptt(0); led_rt(f->fdmdv_stats.sync); led_err(f->total_bit_errors);\r
-                nin = freedv_nin(f);\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
+                //for(i=0; i<FREEDV_NSAMPLES; i++)\r
+                //   dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\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
 \r
         }\r
-        \r
+       \r
     } /* while(1) ... */\r
 }\r
 \r
index 7790a4c255214829ca76ccbee38a129b3bf8b3ce..73728ff693c487e0625a58d323b017b850c8587e 100644 (file)
@@ -137,7 +137,7 @@ void adc_configure(){
 
     // Select the channel to be read from
 
-    ADC_RegularChannelConfig(ADCx,ADC_Channel_2,1,ADC_SampleTime_144Cycles);
+    ADC_RegularChannelConfig(ADCx,ADC_Channel_1,1,ADC_SampleTime_144Cycles);
     //ADC_VBATCmd(ENABLE); 
 
     /* DMA  configuration **************************************/