@@ -108,7 +108,7 @@ struct dongle_state
108
108
int dev_index ;
109
109
uint32_t freq ;
110
110
uint32_t rate ;
111
- uint32_t bandwidth ;
111
+ uint32_t bandwidth ;
112
112
int gain ;
113
113
int16_t buf16 [MAXIMUM_BUF_LENGTH ];
114
114
uint32_t buf_len ;
@@ -197,15 +197,15 @@ void usage(void)
197
197
"\t-f frequency_to_tune_to [Hz]\n"
198
198
"\t use multiple -f for scanning (requires squelch)\n"
199
199
"\t ranges supported, -f 118M:137M:25k\n"
200
- "\t[-v verbosity (default: 0)]\n"
200
+ "\t[-v increase verbosity (default: 0)]\n"
201
201
"\t[-M modulation (default: fm)]\n"
202
202
"\t fm or nbfm or nfm, wbfm or wfm, raw or iq, am, usb, lsb\n"
203
203
"\t wbfm == -M fm -s 170k -o 4 -A fast -r 32k -l 0 -E deemp\n"
204
204
"\t raw mode outputs 2x16 bit IQ pairs\n"
205
205
"\t[-s sample_rate (default: 24k)]\n"
206
206
"\t[-d device_index (default: 0)]\n"
207
- "\t[-g tuner_gain (default: automatic)]\n"
208
- "\t[-w tuner_bandwidth (default: automatic)]\n"
207
+ "\t[-g tuner_gain (default: automatic)]\n"
208
+ "\t[-w tuner_bandwidth (default: automatic. enables offset tuning )]\n"
209
209
"\t[-l squelch_level (default: 0/off)]\n"
210
210
"\t[-L N prints levels every N calculations]\n"
211
211
"\t output are comma separated values (csv):\n"
@@ -217,12 +217,14 @@ void usage(void)
217
217
"\t[-E enable_option (default: none)]\n"
218
218
"\t use multiple -E to enable multiple options\n"
219
219
"\t edge: enable lower edge tuning\n"
220
- "\t rdc: enable dc blocking filter on raw I/Q data at capture rate\n"
221
- "\t adc: enable dc blocking filter on demodulated audio\n"
222
- "\t dc: same as adc\n"
220
+ "\t rdc: enable dc blocking filter on raw I/Q data at capture rate\n"
221
+ "\t adc: enable dc blocking filter on demodulated audio\n"
222
+ "\t dc: same as adc\n"
223
+ "\t rtlagc: enable rtl2832's digital agc (default: off)\n"
224
+ "\t agc: same as rtlagc\n"
223
225
"\t deemp: enable de-emphasis filter\n"
224
- "\t direct: enable direct sampling\n"
225
- "\t offset: enable offset tuning\n"
226
+ "\t direct: enable direct sampling (bypasses tuner, uses rtl2832 xtal) \n"
227
+ "\t offset: enable offset tuning (only e4000 tuner) \n"
226
228
"\t[-q dc_avg_factor for option rdc (default: 9)]\n"
227
229
"\tfilename ('-' means stdout)\n"
228
230
"\t omitting the filename also uses stdout\n\n"
@@ -986,7 +988,7 @@ static void *controller_thread_fn(void *arg)
986
988
987
989
if (s -> wb_mode ) {
988
990
if (verbosity )
989
- fprintf (stderr , "wbfm: adding 16000 Hz to every intput frequency\n" );
991
+ fprintf (stderr , "wbfm: adding 16000 Hz to every input frequency\n" );
990
992
for (i = 0 ; i < s -> freq_len ; i ++ ) {
991
993
s -> freqs [i ] += 16000 ;}
992
994
}
@@ -1001,7 +1003,8 @@ static void *controller_thread_fn(void *arg)
1001
1003
/* Set the frequency */
1002
1004
if (verbosity ) {
1003
1005
fprintf (stderr , "verbose_set_frequency(%.0f Hz)\n" , (double )dongle .freq );
1004
- fprintf (stderr , " frequency is away from parametrized one, to avoid negative impact from dc\n" );
1006
+ if (!dongle .offset_tuning )
1007
+ fprintf (stderr , " frequency is away from parametrized one, to avoid negative impact from dc\n" );
1005
1008
}
1006
1009
verbose_set_frequency (dongle .dev , dongle .freq );
1007
1010
fprintf (stderr , "Oversampling input by: %ix.\n" , demod .downsample );
@@ -1158,12 +1161,13 @@ int main(int argc, char **argv)
1158
1161
int dev_given = 0 ;
1159
1162
int custom_ppm = 0 ;
1160
1163
int timeConstant = 75 ; /* default: U.S. 75 uS */
1164
+ int rtlagc = 0 ;
1161
1165
dongle_init (& dongle );
1162
1166
demod_init (& demod );
1163
1167
output_init (& output );
1164
1168
controller_init (& controller );
1165
1169
1166
- while ((opt = getopt (argc , argv , "d:f:g:s:b:l:L:o:t:r:p:E:q:F:A:M:c:v: h:w:" )) != -1 ) {
1170
+ while ((opt = getopt (argc , argv , "d:f:g:s:b:l:L:o:t:r:p:E:q:F:A:M:c:h:w:v " )) != -1 ) {
1167
1171
switch (opt ) {
1168
1172
case 'd' :
1169
1173
dongle .dev_index = verbose_device_search (optarg );
@@ -1227,6 +1231,8 @@ int main(int argc, char **argv)
1227
1231
dongle .direct_sampling = 1 ;}
1228
1232
if (strcmp ("offset" , optarg ) == 0 ) {
1229
1233
dongle .offset_tuning = 1 ;}
1234
+ if (strcmp ("rtlagc" , optarg ) == 0 || strcmp ("agc" , optarg ) == 0 ) {
1235
+ rtlagc = 1 ;}
1230
1236
break ;
1231
1237
case 'q' :
1232
1238
demod .rdc_block_const = atoi (optarg );
@@ -1275,18 +1281,24 @@ int main(int argc, char **argv)
1275
1281
timeConstant = (int )atof (optarg );
1276
1282
break ;
1277
1283
case 'v' :
1278
- verbosity = (int )atof (optarg );
1284
+ ++ verbosity ;
1285
+ break ;
1286
+ case 'w' :
1287
+ dongle .bandwidth = (uint32_t )atofs (optarg );
1288
+ if (dongle .bandwidth )
1289
+ dongle .offset_tuning = 1 ; /* automatically switch offset tuning, when using bandwidth filter */
1279
1290
break ;
1280
- case 'w' :
1281
- dongle .bandwidth = (uint32_t )atofs (optarg );
1282
- break ;
1283
1291
case 'h' :
1292
+ case '?' :
1284
1293
default :
1285
1294
usage ();
1286
1295
break ;
1287
1296
}
1288
1297
}
1289
1298
1299
+ if (verbosity )
1300
+ fprintf (stderr , "verbosity set to %d\n" , verbosity );
1301
+
1290
1302
/* quadruple sample_rate to limit to Δθ to ±π/2 */
1291
1303
demod .rate_in *= demod .post_downsample ;
1292
1304
@@ -1346,24 +1358,25 @@ int main(int argc, char **argv)
1346
1358
verbose_gain_set (dongle .dev , dongle .gain );
1347
1359
}
1348
1360
1361
+ rtlsdr_set_agc_mode (dongle .dev , rtlagc );
1362
+
1349
1363
verbose_ppm_set (dongle .dev , dongle .ppm_error );
1350
1364
1351
1365
verbose_set_bandwidth (dongle .dev , dongle .bandwidth );
1352
1366
1353
- verbose_set_bandwidth (dongle .dev , dongle .bandwidth );
1354
-
1355
1367
if (verbosity && dongle .bandwidth )
1356
1368
{
1357
- int r ;
1358
- uint32_t in_bw , out_bw , last_bw = 0 ;
1359
- for ( in_bw = 1 ; in_bw < 3200 ; ++ in_bw )
1360
- {
1361
- r = rtlsdr_set_and_get_tuner_bandwidth (dongle .dev , in_bw * 1000 , & out_bw , 0 /* =apply_bw */ );
1362
- if ( r == 0 && ( out_bw != last_bw || in_bw == 1 ) )
1363
- fprintf (stderr , "device sets bandwidth %u Hz for bw para >= %u kHz\n" , out_bw , in_bw );
1364
- last_bw = out_bw ;
1365
- }
1366
- fprintf (stderr ,"\n" );
1369
+ int r ;
1370
+ uint32_t in_bw , out_bw , last_bw = 0 ;
1371
+ fprintf (stderr , "Supported bandwidth values in kHz:\n" );
1372
+ for ( in_bw = 1 ; in_bw < 3200 ; ++ in_bw )
1373
+ {
1374
+ r = rtlsdr_set_and_get_tuner_bandwidth (dongle .dev , in_bw * 1000 , & out_bw , 0 /* =apply_bw */ );
1375
+ if ( r == 0 && out_bw != 0 && ( out_bw != last_bw || in_bw == 1 ) )
1376
+ fprintf (stderr , "%s%.1f" , (in_bw == 1 ? "" : ", " ), out_bw /1000.0 );
1377
+ last_bw = out_bw ;
1378
+ }
1379
+ fprintf (stderr ,"\n" );
1367
1380
}
1368
1381
1369
1382
if (strcmp (output .filename , "-" ) == 0 ) { /* Write samples to stdout */
0 commit comments