AD9857 IQ DDS Digital Up Converter Experiment using Nucleo F401
Digital Signal Processing for IQ Quadradure Modulation DDS AD9857 using Nucleo F401.
see http://ttrftech.tumblr.com/post/114310226891/
Diff: main.cpp
- 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 +} +