diff options
| -rw-r--r-- | src/fl2k_garage.c | 92 | 
1 files changed, 57 insertions, 35 deletions
| diff --git a/src/fl2k_garage.c b/src/fl2k_garage.c index 6eb0057..575c3ad 100644 --- a/src/fl2k_garage.c +++ b/src/fl2k_garage.c @@ -54,7 +54,7 @@  #define BUFFER_SAMPLES		(1 << BUFFER_SAMPLES_SHIFT)  #define BUFFER_SAMPLES_MASK	((1 << BUFFER_SAMPLES_SHIFT)-1) -#define AUDIO_BUF_SIZE		1024 +#define AUDIO_BUF_SIZE		4096  #define BASEBAND_SAMPLES_PER_CHIP 3  #define BASEBAND_WORD_BITS 12 @@ -63,6 +63,7 @@  #define BASEBAND_CHIPS_PER_SPACE BASEBAND_CHIPS_PER_WORD  #define BASEBAND_SPACE_HIGH_CHIPS 1  #define BASEBAND_SPACE_LOW_CHIPS (BASEBAND_CHIPS_PER_SPACE - BASEBAND_SPACE_HIGH_CHIPS) +#define BASEBAND_CHIPS_TOTAL (BASEBAND_CHIPS_PER_SPACE + BASEBAND_CHIPS_PER_WORD)  fl2k_dev_t *dev = NULL;  int do_exit = 0; @@ -76,7 +77,9 @@ pthread_cond_t cb_cond;  pthread_cond_t fm_cond;  pthread_cond_t am_cond; -FILE *file; +int16_t *sample_buf; +int sample_buf_size; +  int8_t *txbuf = NULL;  int8_t *ambuf = NULL;  int8_t *buf1 = NULL; @@ -313,6 +316,7 @@ void am_modulator(const int code_input)  	int32_t lastamp = 0;  	uint32_t lastwritepos = writepos;  	int16_t sample = 0; +	int samplebuf_pos = 0;  	/*  	 *  3*640 us = 1,92 ms pro Symbol @@ -329,36 +333,11 @@ void am_modulator(const int code_input)  				do_exit = 1;  			for (i = 0; i < len; i++) { -				if( ++b >= BASEBAND_SAMPLES_PER_CHIP ){ -					b = 0; -					if(counter < (BASEBAND_SPACE_LOW_CHIPS)){ -						sample = 0; -					} -					else if(counter < (BASEBAND_CHIPS_PER_SPACE)){ -						// synch symbol -						sample = 1; -						// reload code -						code = code_input; -					} -					else{ -						int m; -						m = counter % BASEBAND_CHIPS_PER_BIT; -						if(m == 0){ -							sample = 0; -						} -						else if(m == 1){ -							sample = (code & 1) ^ 1; -						} -						else{ -							sample = 1; -							code >>= 1; -						} -					} -					if(++counter >= (BASEBAND_CHIPS_PER_SPACE + BASEBAND_CHIPS_PER_WORD)){ -						counter = 0; -					} -				}  				/* Modulate and buffer the sample */ +				sample = sample_buf[samplebuf_pos++]; +				if(samplebuf_pos >= BASEBAND_SAMPLES_PER_CHIP * BASEBAND_CHIPS_TOTAL){ +					samplebuf_pos = 0; +				}  				lastamp = modulate_sample_am(lastwritepos, lastamp, sample);  				lastwritepos = writepos++;  				writepos %= BUFFER_SAMPLES; @@ -369,6 +348,49 @@ void am_modulator(const int code_input)  	}  } +void prepare_baseband(const int code_input, int16_t * sbuf){ +	int counter; +	int b; +	int sample_no; +	int16_t sample; +	int msb_first_code; + +	msb_first_code = 0; +	// change to msb first and invert +	for(b = 0;b<12;b++){ +		msb_first_code |= code_input & (1<<b) ? 0 : 1; +		msb_first_code <<= 1; +	} + +	sample_no = 0; +	for(counter=0;counter < (BASEBAND_CHIPS_PER_SPACE + BASEBAND_CHIPS_PER_WORD) ; counter++){ +		for(b=0 ; b<BASEBAND_SAMPLES_PER_CHIP ; b++){ +			if(counter < (BASEBAND_SPACE_LOW_CHIPS)){ +				sample = 0; +			} +			else if(counter < (BASEBAND_CHIPS_PER_SPACE)){ +				// synch symbol +				sample = 1; +			} +			else{ +				int m; +				m = counter % BASEBAND_CHIPS_PER_BIT; +				if(m == 0){ +					sample = 0; +				} +				else if(m == 1){ +					sample = (msb_first_code & 1); +				} +				else{ +					sample = 1; +					msb_first_code >>= 1; +				} +			} +			sbuf[counter * BASEBAND_SAMPLES_PER_CHIP + b] = sample; +		} +	} +} +  void fl2k_callback(fl2k_data_info_t *data_info)  {  	if (data_info->device_error) { @@ -453,6 +475,7 @@ int main(int argc, char **argv)  	slopebuf 	= malloc(BUFFER_SAMPLES * sizeof(double));  	ampbuf  	= malloc(BUFFER_SAMPLES * sizeof(double));  	slopebuf    = malloc(BUFFER_SAMPLES * sizeof(double)); +	sample_buf  = malloc(BASEBAND_SAMPLES_PER_CHIP * BASEBAND_CHIPS_TOTAL);  	readpos 	= 0;  	writepos 	= 1; @@ -470,6 +493,8 @@ int main(int argc, char **argv)  	pthread_cond_init(&am_cond, NULL);  	pthread_attr_init(&attr); +	prepare_baseband(code, sample_buf); +  	fl2k_open(&dev, (uint32_t)dev_index);  	if (NULL == dev) {  		fprintf(stderr, "Failed to open fl2k device #%d.\n", dev_index); @@ -495,7 +520,7 @@ int main(int argc, char **argv)  	/* Calculate needed constants */  	carrier_per_signal = (int)((double) samp_rate * chiptime_us/(1000000*BASEBAND_SAMPLES_PER_CHIP) + 0.5); -	printf("Cps : %d\n", carrier_per_signal); +	printf("Cps :\t%d\n", carrier_per_signal);  #ifndef _WIN32  	sigact.sa_handler = sighandler;  	sigemptyset(&sigact.sa_mask); @@ -514,9 +539,6 @@ int main(int argc, char **argv)  out:  	fl2k_close(dev); -	if (file != stdin) -		fclose(file); -  	free(ampbuf);  	free(slopebuf);  	free(buf1); | 
