rtl_fm: add -E for optional lower edge tuning

Signed-off-by: Steve Markgraf <steve@steve-m.de>
master
Kyle Keen 13 years ago committed by Steve Markgraf
parent 37f5559d1c
commit 6a9f5c14c2
  1. 14
      src/rtl_fm.c

@ -83,6 +83,7 @@ void usage(void)
"\t[-d device_index (default: 0)]\n" "\t[-d device_index (default: 0)]\n"
"\t[-g tuner_gain (default: -1dB)]\n" "\t[-g tuner_gain (default: -1dB)]\n"
"\t[-l squelch_level (default: 150)]\n" "\t[-l squelch_level (default: 150)]\n"
"\t[-E freq sets lower edge (default: center)]\n"
"\tfilename (a '-' dumps samples to stdout)\n\n" "\tfilename (a '-' dumps samples to stdout)\n\n"
"Produces signed 16 bit ints, use sox to hear them.\n" "Produces signed 16 bit ints, use sox to hear them.\n"
"\trtl_fm ... | play -t raw -r 24k -e signed-integer -b 16 -c 1 -\n\n"); "\trtl_fm ... | play -t raw -r 24k -e signed-integer -b 16 -c 1 -\n\n");
@ -234,13 +235,13 @@ static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx)
fwrite(fm2->signal2, 2, fm2->signal_len/2, fm2->file); fwrite(fm2->signal2, 2, fm2->signal_len/2, fm2->file);
} }
static void optimal_settings(struct fm_state *fm, int freq, int rate) static void optimal_settings(struct fm_state *fm, int freq, int rate, int edge)
{ {
int r, capture_freq, capture_rate; int r, capture_freq, capture_rate;
fm->downsample = (1000000 / rate) + 1; fm->downsample = (1000000 / rate) + 1;
fprintf(stderr, "Oversampling by: %ix.\n", fm->downsample); fprintf(stderr, "Oversampling by: %ix.\n", fm->downsample);
capture_rate = fm->downsample * rate; capture_rate = fm->downsample * rate;
capture_freq = freq + capture_rate/4; capture_freq = (freq + (edge*rate/2)) + capture_rate/4;
fm->output_scale = (1<<15) / (128 * fm->downsample); fm->output_scale = (1<<15) / (128 * fm->downsample);
if (fm->output_scale < 1) { if (fm->output_scale < 1) {
fm->output_scale = 1; fm->output_scale = 1;
@ -268,7 +269,7 @@ int main(int argc, char **argv)
char *filename = NULL; char *filename = NULL;
int n_read; int n_read;
int r, opt; int r, opt;
int i, gain = -10; // tenths of a dB int i, edge = 0, gain = -10; // tenths of a dB
uint8_t *buffer; uint8_t *buffer;
uint32_t dev_index = 0; uint32_t dev_index = 0;
uint32_t frequency = 100000000; uint32_t frequency = 100000000;
@ -278,7 +279,7 @@ int main(int argc, char **argv)
char vendor[256], product[256], serial[256]; char vendor[256], product[256], serial[256];
fm.squelch_level = 150; fm.squelch_level = 150;
#ifndef _WIN32 #ifndef _WIN32
while ((opt = getopt(argc, argv, "d:f:g:s:b:l:S::")) != -1) { while ((opt = getopt(argc, argv, "d:f:g:s:b:l:E::")) != -1) {
switch (opt) { switch (opt) {
case 'd': case 'd':
dev_index = atoi(optarg); dev_index = atoi(optarg);
@ -295,6 +296,9 @@ int main(int argc, char **argv)
case 's': case 's':
samp_rate = (uint32_t)atof(optarg); samp_rate = (uint32_t)atof(optarg);
break; break;
case 'E':
edge = 1;
break;
default: default:
usage(); usage();
break; break;
@ -352,7 +356,7 @@ int main(int argc, char **argv)
SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE );
#endif #endif
optimal_settings(&fm, frequency, samp_rate); optimal_settings(&fm, frequency, samp_rate, edge);
/* Set the tuner gain */ /* Set the tuner gain */
r = rtlsdr_set_tuner_gain(dev, gain); r = rtlsdr_set_tuner_gain(dev, gain);

Loading…
Cancel
Save