Remove LO dithering for better SNR
This commit is contained in:
		
							parent
							
								
									eaad670abb
								
							
						
					
					
						commit
						0e1fc91279
					
				
					 1 changed files with 4 additions and 45 deletions
				
			
		
							
								
								
									
										49
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								src/main.c
									
									
									
									
									
								
							|  | @ -82,14 +82,6 @@ static queue_t iq_queue; | |||
| static uint8_t iq_queue_buffer[IQ_QUEUE_LEN][IQ_BLOCK_LEN]; | ||||
| static size_t iq_queue_pos = 0; | ||||
| 
 | ||||
| static uint32_t rnd = 0; | ||||
| 
 | ||||
| inline static uint32_t rnd_next() | ||||
| { | ||||
| 	rnd = rnd * 0x41c64e6d + 12345; | ||||
| 	return rnd; | ||||
| } | ||||
| 
 | ||||
| static void init_lo() | ||||
| { | ||||
| 	gpio_disable_pulls(LO_PIN); | ||||
|  | @ -176,7 +168,7 @@ static void init_rx() | |||
| 	pio_gpio_init(PIO, RX_PIN); | ||||
| 
 | ||||
| 	const uint16_t insn[] = { | ||||
| 		pio_encode_in(pio_pins, 1), | ||||
| 		pio_encode_in(pio_pins, 1) | pio_encode_delay(1), | ||||
| 	}; | ||||
| 
 | ||||
| 	pio_program_t prog = { | ||||
|  | @ -251,14 +243,11 @@ static void lo_generate(uint32_t *buf, double freq, uint32_t phase) | |||
| { | ||||
| 	freq_step = STEP_BASE * freq; | ||||
| 
 | ||||
| 	unsigned down = 2 + __builtin_clz(freq_step); | ||||
| 
 | ||||
| 	for (size_t i = 0; i < LO_WORDS; i++) { | ||||
| 		uint32_t bits = 0; | ||||
| 		int shift = (rnd_next() >> down) - (rnd_next() >> down); | ||||
| 
 | ||||
| 		for (int j = 0; j < 32; j++) { | ||||
| 			bits |= (phase + shift) >> 31; | ||||
| 			bits |= phase >> 31; | ||||
| 			bits <<= 1; | ||||
| 			phase += freq_step; | ||||
| 		} | ||||
|  | @ -267,25 +256,6 @@ static void lo_generate(uint32_t *buf, double freq, uint32_t phase) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void lo_tweak(uint32_t *buf, uint32_t phase) | ||||
| { | ||||
| 	static size_t i = 0; | ||||
| 	uint32_t bits = 0; | ||||
| 	unsigned down = 2 + __builtin_clz(freq_step); | ||||
| 
 | ||||
| 	phase += freq_step * i * 32; | ||||
| 
 | ||||
| 	for (int j = 0; j < 32; j++) { | ||||
| 		int shift = (rnd_next() >> down) - (rnd_next() >> down); | ||||
| 		bits |= (phase + shift) >> 31; | ||||
| 		bits <<= 1; | ||||
| 		phase += freq_step; | ||||
| 	} | ||||
| 
 | ||||
| 	buf[i] = bits; | ||||
| 	i = (i + 1) & (LO_WORDS - 1); | ||||
| } | ||||
| 
 | ||||
| static void rx_lo_init(double req_freq, bool align) | ||||
| { | ||||
| 	const double step_hz = (double)CLK_SYS_HZ / (8 << LO_BITS_DEPTH); | ||||
|  | @ -374,18 +344,12 @@ static void rf_rx_start() | |||
| 	dma_channel_start(dma_ch_mix1); | ||||
| 	dma_channel_start(dma_ch_samp_cos); | ||||
| 
 | ||||
| 	pio_sm_set_enabled(PIO, LO_SM, true); | ||||
| 	pio_sm_set_enabled(PIO, FB_SM, true); | ||||
| 	pio_sm_set_enabled(PIO, RX_SM, true); | ||||
| 	pio_sm_set_enabled(PIO, AD_SM, true); | ||||
| 	pio_set_sm_mask_enabled(PIO, 0x0f, true); | ||||
| } | ||||
| 
 | ||||
| static void rf_rx_stop(void) | ||||
| { | ||||
| 	pio_sm_set_enabled(PIO, LO_SM, false); | ||||
| 	pio_sm_set_enabled(PIO, FB_SM, false); | ||||
| 	pio_sm_set_enabled(PIO, RX_SM, false); | ||||
| 	pio_sm_set_enabled(PIO, AD_SM, false); | ||||
| 	pio_set_sm_mask_enabled(PIO, 0x0f, false); | ||||
| 
 | ||||
| 	sleep_us(10); | ||||
| 
 | ||||
|  | @ -519,11 +483,6 @@ static void rf_rx(void) | |||
| 		if (queue_try_add(&iq_queue, &block)) { | ||||
| 			iq_queue_pos = (iq_queue_pos + 1) & (IQ_QUEUE_LEN - 1); | ||||
| 		} | ||||
| 
 | ||||
| 		/* Randomize LO phase in the next word. */ | ||||
| 		for (int i = 0; i < 8; i++) { | ||||
| 			lo_tweak(lo_cos, COS_PHASE); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue