AD9857 IQ DDS Digital Up Converter Experiment using Nucleo F401

Dependencies:   mbed

Digital Signal Processing for IQ Quadradure Modulation DDS AD9857 using Nucleo F401.

see http://ttrftech.tumblr.com/post/114310226891/

Revision:
1:457ef59cce95
Parent:
0:55201637d936
Child:
2:57e603a26534
--- a/main.cpp	Sat Mar 21 08:31:20 2015 +0000
+++ b/main.cpp	Sat Mar 21 16:38:08 2015 +0000
@@ -412,61 +412,6 @@
 
 static int first = true;
 
-
-void
-hilbert_transform_test()
-{
-#if 1
-    int freq = 800;
-    int ampl = 3000;
-    int rate = 48000;
-    for (int i = 0; i < CAPTURE_LEN; i++){
-        cap_buf[0][i*2] = sin(2*3.141592 * i * freq / rate) * ampl; // Lch
-        cap_buf[0][i*2+1] = 0;//sin(2*3.141592 * i * freq / rate) * ampl; // Rch 
-    }
-#endif
-    int cic_len = sizeof(cic_buf)/sizeof(uint32_t);
-    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
-    hilbert_transform((uint32_t*)cap_buf[0], (uint32_t*)fir_buf, sizeof fir_buf / sizeof(uint32_t), 1);
-    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
-    fir_resample_x4((uint32_t*)fir_state, (uint32_t*)cic_buf, cic_len);
-    cic_interpolate_x10(&cic, (uint32_t*)cic_buf, cic_len, (uint32_t*)dma_buf[0]);
-    
-    hilbert_transform((uint32_t*)cap_buf[0], (uint32_t*)fir_buf, sizeof fir_buf / sizeof(uint32_t), 1);
-    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
-    fir_resample_x4((uint32_t*)fir_state, (uint32_t*)cic_buf, cic_len);
-    cic_interpolate_x10(&cic, (uint32_t*)cic_buf, cic_len, (uint32_t*)dma_buf[1]);
-
-    hilbert_transform((uint32_t*)cap_buf[0], (uint32_t*)fir_buf, sizeof fir_buf / sizeof(uint32_t), 1);
-    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
-    fir_resample_x4((uint32_t*)fir_state, (uint32_t*)cic_buf, cic_len);
-    cic_interpolate_x10(&cic, (uint32_t*)cic_buf, cic_len, (uint32_t*)dma_buf[0]);
-    
-    hilbert_transform((uint32_t*)cap_buf[0], (uint32_t*)fir_buf, sizeof fir_buf / sizeof(uint32_t), 1);
-    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
-    fir_resample_x4((uint32_t*)fir_state, (uint32_t*)cic_buf, cic_len);
-    cic_interpolate_x10(&cic, (uint32_t*)cic_buf, cic_len, (uint32_t*)dma_buf[1]);
-#if 0
-    for (int i = 0; i < 20; i++){
-        pc.printf("%d, ", cic_buf[i*2]);
-    }
-    pc.printf("\n\r");
-#endif
-#if 1
-    for (int i = 0; i < 30; i += 2) {
-        pc.printf("%d:%d ", dma_buf[0][i], dma_buf[0][i+1]);
-    }
-    pc.printf("\n\r");
-    int acc_i = 0;
-    int acc_q = 0;
-    for (int i = 0; i < DMA_DATALEN; i += 2){
-        acc_i += dma_buf[0][i  ];
-        acc_q += dma_buf[0][i+1];
-    }
-    pc.printf("dma acc %d %d\n\r", acc_i, acc_q);
-#endif
-}
-
 uint32_t capbuf_average(int buf)
 {
     int32_t acc_i = 0;
@@ -543,6 +488,11 @@
     "NFM", "AM", "USB", "LSB", "IQ"
 };
 
+
+void hilbert_transform_test();
+void pseudo_noise_test();
+
+
 int main()
 { 
     pc.baud(9600);
@@ -550,15 +500,6 @@
     pc.printf("SystemCoreClock: %dHz\r\n", SystemCoreClock);
     pc.printf("%s\r\n", mode_names[mode]);        
     //i2c.frequency(20000);
-#if 0
-    pc.printf("%08x\r\n", cos_sin(0x8000));
-    pc.printf("%08x\r\n", cos_sin(0xC000));
-    pc.printf("%08x\r\n", cos_sin(0xFF7F));
-    pc.printf("%08x\r\n", cos_sin(0x0));
-    pc.printf("%08x\r\n", cos_sin(0x0080));
-    pc.printf("%08x\r\n", cos_sin(0x4000));
-    pc.printf("%08x\r\n", cos_sin(0x7fff));
-#endif
     // pullup I2C bus     
     pin_mode(PB_8, PullUp);
     pin_mode(PB_9, PullUp);
@@ -570,7 +511,8 @@
     fmmod_init(&fmmod);
     
     cic.s0 = __PKHBT(3, 3, 16); // adjust offset
-    interpolate_test();
+    //pseudo_noise_test();
+    //interpolate_test();
     //hilbert_transform_test();
     //ddsdma_start();   
 
@@ -706,7 +648,83 @@
 
 void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
 {
-    capbuf_ave = capbuf_average(0);
+    capbuf_ave = capbuf_average(1);
     decay_average(capbuf_ave);
     modulate_buffer_half(1);
 }
+
+void
+pseudo_noise_test()
+{
+#define RAND(N)     ((((float)rand() / RAND_MAX) * 2 * N) - N)
+    int ampl = 10000;
+    for (int i = 0; i < CAPTURE_LEN/2; i++){
+        cap_buf[0][i*2] = RAND(ampl);
+        cap_buf[0][i*2+1] = RAND(ampl); // Rch
+        cap_buf[1][i*2] = RAND(ampl); // Lch
+        cap_buf[1][i*2+1] = RAND(ampl); // Rch
+    }
+    modulate_buffer_half(0);
+    modulate_buffer_half(1);
+    modulate_buffer_half(0);
+    modulate_buffer_half(1);
+    ddsdma_start();
+    pc.printf("Pseudo noise test\r\n");
+    while(1);
+    /* no reach */
+}
+
+void
+hilbert_transform_test()
+{
+#if 1
+    int freq = 800;
+    int ampl = 3000;
+    int rate = 48000;
+    for (int i = 0; i < CAPTURE_LEN; i++){
+        cap_buf[0][i*2] = sin(2*3.141592 * i * freq / rate) * ampl; // Lch
+        cap_buf[0][i*2+1] = 0;//sin(2*3.141592 * i * freq / rate) * ampl; // Rch 
+    }
+#endif
+    int cic_len = sizeof(cic_buf)/sizeof(uint32_t);
+    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
+    hilbert_transform((uint32_t*)cap_buf[0], (uint32_t*)fir_buf, sizeof fir_buf / sizeof(uint32_t), 1);
+    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
+    fir_resample_x4((uint32_t*)fir_state, (uint32_t*)cic_buf, cic_len);
+    cic_interpolate_x10(&cic, (uint32_t*)cic_buf, cic_len, (uint32_t*)dma_buf[0]);
+    
+    hilbert_transform((uint32_t*)cap_buf[0], (uint32_t*)fir_buf, sizeof fir_buf / sizeof(uint32_t), 1);
+    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
+    fir_resample_x4((uint32_t*)fir_state, (uint32_t*)cic_buf, cic_len);
+    cic_interpolate_x10(&cic, (uint32_t*)cic_buf, cic_len, (uint32_t*)dma_buf[1]);
+
+    hilbert_transform((uint32_t*)cap_buf[0], (uint32_t*)fir_buf, sizeof fir_buf / sizeof(uint32_t), 1);
+    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
+    fir_resample_x4((uint32_t*)fir_state, (uint32_t*)cic_buf, cic_len);
+    cic_interpolate_x10(&cic, (uint32_t*)cic_buf, cic_len, (uint32_t*)dma_buf[0]);
+    
+    hilbert_transform((uint32_t*)cap_buf[0], (uint32_t*)fir_buf, sizeof fir_buf / sizeof(uint32_t), 1);
+    hilbert_transform_save_fir_state((uint32_t*)cap_buf[1]);
+    fir_resample_x4((uint32_t*)fir_state, (uint32_t*)cic_buf, cic_len);
+    cic_interpolate_x10(&cic, (uint32_t*)cic_buf, cic_len, (uint32_t*)dma_buf[1]);
+#if 0
+    for (int i = 0; i < 20; i++){
+        pc.printf("%d, ", cic_buf[i*2]);
+    }
+    pc.printf("\n\r");
+#endif
+#if 1
+    for (int i = 0; i < 30; i += 2) {
+        pc.printf("%d:%d ", dma_buf[0][i], dma_buf[0][i+1]);
+    }
+    pc.printf("\n\r");
+    int acc_i = 0;
+    int acc_q = 0;
+    for (int i = 0; i < DMA_DATALEN; i += 2){
+        acc_i += dma_buf[0][i  ];
+        acc_q += dma_buf[0][i+1];
+    }
+    pc.printf("dma acc %d %d\n\r", acc_i, acc_q);
+#endif
+}
+