TX changes
This commit is contained in:
		
							parent
							
								
									2825e5e49d
								
							
						
					
					
						commit
						8a6283c5ae
					
				
					 1 changed files with 43 additions and 38 deletions
				
			
		
							
								
								
									
										81
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								src/main.c
									
									
									
									
									
								
							|  | @ -96,6 +96,14 @@ static int agc = 0; | ||||||
| 
 | 
 | ||||||
| #define PSU_PIN 23 | #define PSU_PIN 23 | ||||||
| 
 | 
 | ||||||
|  | static uint32_t rnd = 0; | ||||||
|  | 
 | ||||||
|  | inline static uint32_t rnd_next() | ||||||
|  | { | ||||||
|  | 	rnd = rnd * 0x41c64e6d + 12345; | ||||||
|  | 	return rnd; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void bias_init(int in_pin, int out_pin) | static void bias_init(int in_pin, int out_pin) | ||||||
| { | { | ||||||
| 	gpio_disable_pulls(in_pin); | 	gpio_disable_pulls(in_pin); | ||||||
|  | @ -264,7 +272,7 @@ static void adder_init() | ||||||
| 	pio_sm_set_enabled(pio1, 3, true); | 	pio_sm_set_enabled(pio1, 3, true); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline static float lo_round_freq(size_t bits, float req_freq) | inline static double lo_round_freq(size_t bits, double req_freq) | ||||||
| { | { | ||||||
| 	const double step_hz = (double)CLK_SYS_HZ / bits; | 	const double step_hz = (double)CLK_SYS_HZ / bits; | ||||||
| 	return round(req_freq / step_hz) * step_hz; | 	return round(req_freq / step_hz) * step_hz; | ||||||
|  | @ -272,7 +280,7 @@ inline static float lo_round_freq(size_t bits, float req_freq) | ||||||
| 
 | 
 | ||||||
| static void lo_generate(uint32_t *buf, size_t len, double freq, unsigned phase) | static void lo_generate(uint32_t *buf, size_t len, double freq, unsigned phase) | ||||||
| { | { | ||||||
| 	unsigned step = ((double)UINT_MAX + 1.0) / (double)CLK_SYS_HZ * freq; | 	unsigned step = (UINT_MAX + 1.0) / CLK_SYS_HZ * freq; | ||||||
| 	unsigned accum = phase; | 	unsigned accum = phase; | ||||||
| 
 | 
 | ||||||
| 	for (size_t i = 0; i < len; i++) { | 	for (size_t i = 0; i < len; i++) { | ||||||
|  | @ -280,10 +288,7 @@ static void lo_generate(uint32_t *buf, size_t len, double freq, unsigned phase) | ||||||
| 
 | 
 | ||||||
| 		for (int j = 0; j < 32; j++) { | 		for (int j = 0; j < 32; j++) { | ||||||
| #if LO_DITHER | #if LO_DITHER | ||||||
| 			int n0 = rand() - RAND_MAX / 2; | 			int noise = (rnd_next() >> 3) - (rnd_next() >> 3); | ||||||
| 			int n1 = rand() - RAND_MAX / 2; |  | ||||||
| 			int noise = (n0 + n1) / 2; |  | ||||||
| 
 |  | ||||||
| 			bits |= (accum + noise) >> 31; | 			bits |= (accum + noise) >> 31; | ||||||
| #else | #else | ||||||
| 			bits |= accum >> 31; | 			bits |= accum >> 31; | ||||||
|  | @ -296,9 +301,9 @@ static void lo_generate(uint32_t *buf, size_t len, double freq, unsigned phase) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static float rx_lo_init(double req_freq) | static double rx_lo_init(double req_freq) | ||||||
| { | { | ||||||
| 	float freq = lo_round_freq(LO_WORDS * 32, req_freq); | 	double freq = lo_round_freq(LO_WORDS * 8, req_freq); | ||||||
| 
 | 
 | ||||||
| 	lo_generate(lo_cos, LO_WORDS, freq, COS_PHASE); | 	lo_generate(lo_cos, LO_WORDS, freq, COS_PHASE); | ||||||
| 	lo_generate(lo_sin, LO_WORDS, freq, SIN_PHASE); | 	lo_generate(lo_sin, LO_WORDS, freq, SIN_PHASE); | ||||||
|  | @ -306,10 +311,10 @@ static float rx_lo_init(double req_freq) | ||||||
| 	return freq; | 	return freq; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static float tx_fsk_lo_init(float req_freq, float separation) | static double tx_fsk_lo_init(double req_freq, double separation) | ||||||
| { | { | ||||||
| 	float hi = lo_round_freq(LO_WORDS * 32, req_freq + separation / 2); | 	double hi = lo_round_freq(LO_WORDS * 8, req_freq + separation / 2); | ||||||
| 	float lo = lo_round_freq(LO_WORDS * 32, hi - separation); | 	double lo = lo_round_freq(LO_WORDS * 8, hi - separation); | ||||||
| 
 | 
 | ||||||
| 	lo_generate(lo_cos, LO_WORDS, hi, COS_PHASE); | 	lo_generate(lo_cos, LO_WORDS, hi, COS_PHASE); | ||||||
| 	lo_generate(lo_sin, LO_WORDS, lo, SIN_PHASE); | 	lo_generate(lo_sin, LO_WORDS, lo, SIN_PHASE); | ||||||
|  | @ -364,7 +369,7 @@ static const uint32_t samp_insn[] __attribute__((__aligned__(16))) = { | ||||||
| 
 | 
 | ||||||
| static uint32_t null, one = 1; | static uint32_t null, one = 1; | ||||||
| 
 | 
 | ||||||
| static float rf_rx_start(int rx_pin, int bias_pin, float freq, int frac_num, int frac_denom) | static double rf_rx_start(int rx_pin, int bias_pin, double freq, int frac_num, int frac_denom) | ||||||
| { | { | ||||||
| 	dma_ch_rx = dma_claim_unused_channel(true); | 	dma_ch_rx = dma_claim_unused_channel(true); | ||||||
| 	dma_ch_cp = dma_claim_unused_channel(true); | 	dma_ch_cp = dma_claim_unused_channel(true); | ||||||
|  | @ -472,7 +477,7 @@ static float rf_rx_start(int rx_pin, int bias_pin, float freq, int frac_num, int | ||||||
| 	bias_init(rx_pin, bias_pin); | 	bias_init(rx_pin, bias_pin); | ||||||
| 	adder_init(); | 	adder_init(); | ||||||
| 
 | 
 | ||||||
| 	float actual = rx_lo_init(freq); | 	double actual = rx_lo_init(freq); | ||||||
| 
 | 
 | ||||||
| 	dma_channel_start(dma_ch_rx); | 	dma_channel_start(dma_ch_rx); | ||||||
| 	dma_channel_start(dma_ch_samp_trig); | 	dma_channel_start(dma_ch_samp_trig); | ||||||
|  | @ -782,9 +787,9 @@ static void __unused plot_IQ(int I, int Q) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void do_rx(int rx_pin, int bias_pin, float freq, char mode) | static void do_rx(int rx_pin, int bias_pin, double freq, char mode) | ||||||
| { | { | ||||||
| 	float actual = rf_rx_start(rx_pin, bias_pin, freq, 1, CLK_SYS_HZ / BANDWIDTH); | 	double actual = rf_rx_start(rx_pin, bias_pin, freq, 1, CLK_SYS_HZ / BANDWIDTH); | ||||||
| 	sleep_us(100); | 	sleep_us(100); | ||||||
| 
 | 
 | ||||||
| 	dma_ch_in_cos = dma_claim_unused_channel(true); | 	dma_ch_in_cos = dma_claim_unused_channel(true); | ||||||
|  | @ -837,8 +842,8 @@ static void do_rx(int rx_pin, int bias_pin, float freq, char mode) | ||||||
| 				fflush(stdout); | 				fflush(stdout); | ||||||
| 			} else { | 			} else { | ||||||
| 				/* Because AGC is kept 1 bit below to accomodate for jitter. */ | 				/* Because AGC is kept 1 bit below to accomodate for jitter. */ | ||||||
| 				float agc_frac = 2.0f * (float)agc / (float)INT_MAX; | 				double agc_frac = 2.0f * (double)agc / (double)INT_MAX; | ||||||
| 				float rssi = 10.0f * log10f(powf(agc_frac, 2)); | 				double rssi = 10.0f * log10f(powf(agc_frac, 2)); | ||||||
| 
 | 
 | ||||||
| 				for (int i = 0; i < IQ_BLOCK_LEN / 2; i += 2) { | 				for (int i = 0; i < IQ_BLOCK_LEN / 2; i += 2) { | ||||||
| 					int I = block[i] >> 8; | 					int I = block[i] >> 8; | ||||||
|  | @ -879,7 +884,7 @@ static void command(const char *cmd) | ||||||
| { | { | ||||||
| 	static char tmp[83]; | 	static char tmp[83]; | ||||||
| 	int n, x; | 	int n, x; | ||||||
| 	float f, g; | 	double f, g; | ||||||
| 
 | 
 | ||||||
| 	if (1 == sscanf(cmd, " help %[\a]", tmp)) { | 	if (1 == sscanf(cmd, " help %[\a]", tmp)) { | ||||||
| 		puts("help             - this help"); | 		puts("help             - this help"); | ||||||
|  | @ -912,25 +917,25 @@ static void command(const char *cmd) | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (4 == sscanf(cmd, " rx %i %i %f %[\a]", &n, &x, &f, tmp)) { | 	if (4 == sscanf(cmd, " rx %i %i %lf %[\a]", &n, &x, &f, tmp)) { | ||||||
| 		do_rx(n, x, f, 'a'); | 		do_rx(n, x, f, 'a'); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (4 == sscanf(cmd, " brx %i %i %f %[\a]", &n, &x, &f, tmp)) { | 	if (4 == sscanf(cmd, " brx %i %i %lf %[\a]", &n, &x, &f, tmp)) { | ||||||
| 		do_rx(n, x, f, 'b'); | 		do_rx(n, x, f, 'b'); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (3 == sscanf(cmd, " bpsk %i %f %[\a]", &n, &f, tmp)) { | 	if (3 == sscanf(cmd, " bpsk %i %lf %[\a]", &n, &f, tmp)) { | ||||||
| 		float actual = rx_lo_init(f); | 		double actual = rx_lo_init(f); | ||||||
| 		printf("Frequency: %.0f\n", actual); | 		printf("Frequency: %.0f\n", actual); | ||||||
| 
 | 
 | ||||||
| 		rf_tx_start(n); | 		rf_tx_start(n); | ||||||
| 		puts("Transmitting, press ENTER to stop."); | 		puts("Transmitting, press ENTER to stop."); | ||||||
| 
 | 
 | ||||||
| 		bool phase = false; | 		bool phase = false; | ||||||
| 		const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 32); | 		const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 8); | ||||||
| 
 | 
 | ||||||
| 		while (true) { | 		while (true) { | ||||||
| 			int c = getchar_timeout_us(10000); | 			int c = getchar_timeout_us(10000); | ||||||
|  | @ -972,8 +977,8 @@ static void command(const char *cmd) | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (4 == sscanf(cmd, " fsk %i %f %f %[\a]", &n, &f, &g, tmp)) { | 	if (4 == sscanf(cmd, " fsk %i %lf %lf %[\a]", &n, &f, &g, tmp)) { | ||||||
| 		g = lo_round_freq(LO_WORDS * 32, g); | 		g = lo_round_freq(LO_WORDS * 8, g); | ||||||
| 		f = tx_fsk_lo_init(f, g); | 		f = tx_fsk_lo_init(f, g); | ||||||
| 		printf("Frequency: %.0f +/- %.f\n", f, g / 2.0f); | 		printf("Frequency: %.0f +/- %.f\n", f, g / 2.0f); | ||||||
| 
 | 
 | ||||||
|  | @ -981,7 +986,7 @@ static void command(const char *cmd) | ||||||
| 		puts("Transmitting, press ENTER to stop."); | 		puts("Transmitting, press ENTER to stop."); | ||||||
| 
 | 
 | ||||||
| 		bool high = true; | 		bool high = true; | ||||||
| 		const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 32); | 		const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 8); | ||||||
| 
 | 
 | ||||||
| 		while (true) { | 		while (true) { | ||||||
| 			int c = getchar_timeout_us(10000); | 			int c = getchar_timeout_us(10000); | ||||||
|  | @ -1024,15 +1029,15 @@ static void command(const char *cmd) | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (3 == sscanf(cmd, " ook %i %f %[\a]", &n, &f, tmp)) { | 	if (3 == sscanf(cmd, " ook %i %lf %[\a]", &n, &f, tmp)) { | ||||||
| 		float actual = rx_lo_init(f); | 		double actual = rx_lo_init(f); | ||||||
| 		printf("Frequency: %.0f\n", actual); | 		printf("Frequency: %.0f\n", actual); | ||||||
| 
 | 
 | ||||||
| 		rf_tx_start(n); | 		rf_tx_start(n); | ||||||
| 		puts("Transmitting, press ENTER to stop."); | 		puts("Transmitting, press ENTER to stop."); | ||||||
| 
 | 
 | ||||||
| 		bool off = false; | 		bool off = false; | ||||||
| 		const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 32); | 		const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 8); | ||||||
| 
 | 
 | ||||||
| 		while (true) { | 		while (true) { | ||||||
| 			int c = getchar_timeout_us(10000); | 			int c = getchar_timeout_us(10000); | ||||||
|  | @ -1063,12 +1068,12 @@ static void command(const char *cmd) | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (5 == sscanf(cmd, " sweep %i %f %f %i %[\a]", &n, &f, &g, &x, tmp)) { | 	if (5 == sscanf(cmd, " sweep %i %lf %lf %i %[\a]", &n, &f, &g, &x, tmp)) { | ||||||
| 		const float step_hz = (float)CLK_SYS_HZ / (LO_WORDS * 32); | 		const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 8); | ||||||
| 		const float start = roundf(f / step_hz) * step_hz; | 		const double start = round(f / step_hz) * step_hz; | ||||||
| 		const float stop = roundf(g / step_hz) * step_hz; | 		const double stop = round(g / step_hz) * step_hz; | ||||||
| 
 | 
 | ||||||
| 		int steps = roundf((stop - start) / step_hz); | 		int steps = round((stop - start) / step_hz); | ||||||
| 
 | 
 | ||||||
| 		for (int i = 0; i < LO_WORDS; i++) | 		for (int i = 0; i < LO_WORDS; i++) | ||||||
| 			lo_cos[i] = 0; | 			lo_cos[i] = 0; | ||||||
|  | @ -1080,7 +1085,7 @@ static void command(const char *cmd) | ||||||
| 			if ('\r' == c) | 			if ('\r' == c) | ||||||
| 				break; | 				break; | ||||||
| 
 | 
 | ||||||
| 			float actual = rx_lo_init(start + i * step_hz); | 			double actual = rx_lo_init(start + i * step_hz); | ||||||
| 			printf("Frequency: %.0f\n", actual); | 			printf("Frequency: %.0f\n", actual); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -1091,7 +1096,7 @@ static void command(const char *cmd) | ||||||
| 
 | 
 | ||||||
| 	if (2 == sscanf(cmd, " noise %i %[\a]", &n, tmp)) { | 	if (2 == sscanf(cmd, " noise %i %[\a]", &n, tmp)) { | ||||||
| 		for (int i = 0; i < LO_WORDS; i++) | 		for (int i = 0; i < LO_WORDS; i++) | ||||||
| 			lo_cos[i] = rand(); | 			lo_cos[i] = rnd_next(); | ||||||
| 
 | 
 | ||||||
| 		rf_tx_start(n); | 		rf_tx_start(n); | ||||||
| 
 | 
 | ||||||
|  | @ -1103,7 +1108,7 @@ static void command(const char *cmd) | ||||||
| 				break; | 				break; | ||||||
| 
 | 
 | ||||||
| 			for (int i = 0; i < LO_WORDS; i++) | 			for (int i = 0; i < LO_WORDS; i++) | ||||||
| 				lo_cos[i] = rand(); | 				lo_cos[i] = rnd_next(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		rf_tx_stop(); | 		rf_tx_stop(); | ||||||
|  | @ -1138,7 +1143,7 @@ int main() | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	printf("\nPuppet Online!\n"); | 	printf("\nPuppet Online!\n"); | ||||||
| 	printf("clk_sys = %10.6f MHz\n", (float)clock_get_hz(clk_sys) / MHZ); | 	printf("clk_sys = %10.6f MHz\n", (double)clock_get_hz(clk_sys) / MHZ); | ||||||
| 
 | 
 | ||||||
| 	queue_init(&iq_queue, IQ_BLOCK_LEN * sizeof(int16_t), 256); | 	queue_init(&iq_queue, IQ_BLOCK_LEN * sizeof(int16_t), 256); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue