瀏覽代碼

add commandline option for setting the sample rate

Signed-off-by: Steve Markgraf <steve@steve-m.de>
Steve Markgraf 13 年之前
父節點
當前提交
8dc13ea3ea
共有 1 個文件被更改,包括 23 次插入11 次删除
  1. 23 11
      src/main.c

+ 23 - 11
src/main.c

@@ -21,6 +21,7 @@
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <math.h>
 #include <unistd.h>
 
 #include <libusb.h>
@@ -40,6 +41,8 @@
 #define NOXON_VID	0x0ccd
 #define NOXON_PID	0x00b3
 
+#define CRYSTAL_FREQ	28800000
+
 static struct libusb_device_handle *devh = NULL;
 static int do_exit = 0;
 
@@ -214,12 +217,20 @@ void demod_write_reg(uint8_t page, uint16_t addr, uint16_t val, uint8_t len)
 	demod_read_reg(0x0a, 0x01, 1);
 }
 
-void set_resampler(uint32_t rsamp_ratio)
+void set_samp_rate(uint32_t samp_rate)
 {
 	uint16_t tmp;
-	rsamp_ratio <<= 2;
+	uint32_t rsamp_ratio;
+
+	/* check for the maximum rate the resampler supports */
+	if (samp_rate > 3200000)
+		samp_rate = 3200000;
+
+	printf("Setting sample rate: %i Hz\n", samp_rate);
+	rsamp_ratio = (CRYSTAL_FREQ * pow(2, 22)) / samp_rate;
 
-	tmp = (rsamp_ratio >> 16) & 0xffff;
+	rsamp_ratio &= ~3;
+	tmp = (rsamp_ratio >> 16);
 	demod_write_reg(1, 0x9f, tmp, 2);
 	tmp = rsamp_ratio & 0xffff;
 	demod_write_reg(1, 0xa1, tmp, 2);
@@ -265,10 +276,6 @@ void rtl_init(void)
 	for (i = 0; i < sizeof (fir_coeff); i++)
 		demod_write_reg(1, 0x1c + i, fir_coeff[i], 1);
 
-	/* TODO setting resampler test value, max value is 0xC99999,
-	 * value for DAB/FM is 0xE10000*/
-	set_resampler(1 << 24);
-
 	demod_write_reg(0, 0x19, 0x25, 1);
 
 	/* init FSM state-holding register */
@@ -295,7 +302,7 @@ void tuner_init(int frequency)
 	switch (tuner_type) {
 	case TUNER_E4000:
 		e4000_Initialize(1);
-		e4000_SetBandwidthHz(1, 80000);
+		e4000_SetBandwidthHz(1, 8000000);
 		e4000_SetRfFreqHz(1, frequency);
 		break;
 	case TUNER_FC0013:
@@ -314,7 +321,8 @@ void tuner_init(int frequency)
 void usage(void)
 {
 	printf("rtl-sdr, an I/Q recorder for RTL2832 based USB-sticks\n\n"
-		"Usage:\t-f frequency to tune to [Hz]\n"
+		"Usage:\t -f frequency to tune to [Hz]\n"
+		"\t[-s samplerate (default: 2048000 Hz)]\n"
 		"\toutput filename\n");
 	exit(1);
 }
@@ -329,16 +337,19 @@ int main(int argc, char **argv)
 	struct sigaction sigact;
 	int r, opt;
 	char *filename;
-	unsigned int frequency = 0;
+	uint32_t frequency = 0, samp_rate = 2048000;
 	uint8_t buffer[READLEN];
 	int n_read;
 	FILE *file;
 
-	while ((opt = getopt(argc, argv, "f:")) != -1) {
+	while ((opt = getopt(argc, argv, "f:s:")) != -1) {
 		switch (opt) {
 		case 'f':
 			frequency = atoi(optarg);
 			break;
+		case 's':
+			samp_rate = atoi(optarg);
+			break;
 		default:
 			usage();
 			break;
@@ -378,6 +389,7 @@ int main(int argc, char **argv)
 
 	/* Initialize the RTL2832 */
 	rtl_init();
+	set_samp_rate(samp_rate);
 
 	/* Initialize tuner & set frequency */
 	tuner_init(frequency);