rtl_power: trough hold

master
Kyle Keen 2015-12-31 19:22:39 -05:00
rodzic 86f950389a
commit 0d825fe08e
1 zmienionych plików z 26 dodań i 9 usunięć

Wyświetl plik

@ -67,6 +67,7 @@
#include "convenience/convenience.h"
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define DEFAULT_BUF_LENGTH (1 * 16384)
#define AUTO_GAIN -100
@ -104,7 +105,7 @@ struct tuning_state
int downsample;
int downsample_passes; /* for the recursive filter */
int comp_fir_size;
int peak_hold;
int peak_hold; /* 1 = peak, 0 = off, -1 = trough */
int linear;
int bin_spec;
double crop;
@ -188,6 +189,7 @@ void usage(void)
"\t possible values are 2M to 3.2M\n"
"\t[-E enables epoch timestamps (default: off/verbose)]\n"
"\t[-P enables peak hold (default: off/averaging)]\n"
"\t[-T enables trough hold (default: off/averaging)]\n"
"\t[-L enable linear output (default: off/dB)]\n"
"\t[-D direct_sampling_mode, 0 (default/off), 1 (I), 2 (Q), 3 (no-mod)]\n"
"\t[-O enable offset tuning (default: off)]\n"
@ -479,10 +481,12 @@ void rms_power(struct tuning_state *ts)
err = t * 2 * dc - dc * dc * buf_len;
p -= (int64_t)round(err);
if (!ts->peak_hold) {
if (ts->peak_hold == 0) {
ts->avg[0] += p;
} else {
} else if (ts->peak_hold == 1) {
ts->avg[0] = MAX(ts->avg[0], p);
} else if (ts->peak_hold == -1) {
ts->avg[0] = MIN(ts->avg[0], p);
}
ts->samples += 1;
}
@ -685,7 +689,10 @@ void frequency_range(char *arg, struct misc_settings *ms)
exit(1);
}
for (j=0; j<(1<<c.bin_e); j++) {
ts->avg[j] = 0L;
if (ts->peak_hold == -1) {
ts->avg[j] = 1e6;
} else {
ts->avg[j] = 0L;}
}
ts->buf8 = (uint8_t*)malloc(buf_len * sizeof(uint8_t));
if (!ts->buf8) {
@ -933,14 +940,18 @@ void scanner(void)
fft_buf[offset+j*2+1] = (int16_t)w;
}
fix_fft(fft_buf+offset, bin_e, ts->sine);
if (!ts->peak_hold) {
if (ts->peak_hold == 0) {
for (j=0; j<bin_len; j++) {
ts->avg[j] += real_conj(fft_buf[offset+j*2], fft_buf[offset+j*2+1]);
}
} else {
} else if (ts->peak_hold == 1){
for (j=0; j<bin_len; j++) {
ts->avg[j] = MAX(real_conj(fft_buf[offset+j*2], fft_buf[offset+j*2+1]), ts->avg[j]);
}
} else if (ts->peak_hold == -1){
for (j=0; j<bin_len; j++) {
ts->avg[j] = MIN(real_conj(fft_buf[offset+j*2], fft_buf[offset+j*2+1]), ts->avg[j]);
}
}
ts->samples += ds;
}
@ -975,7 +986,7 @@ void csv_dbm(struct tuning_state *ts)
}
dbm = (double)ts->avg[i];
dbm /= (double)ts->rate;
if (!ts->peak_hold) {
if (ts->peak_hold == 0) {
dbm /= (double)ts->samples;
}
if (ts->linear) {
@ -986,7 +997,10 @@ void csv_dbm(struct tuning_state *ts)
}
}
for (i=0; i<len; i++) {
ts->avg[i] = 0L;
if (ts->peak_hold == -1) {
ts->avg[i] = 1e6;
} else {
ts->avg[i] = 0L;}
}
ts->samples = 0;
}
@ -1034,7 +1048,7 @@ int main(int argc, char **argv)
init_misc(&ms);
strcpy(dev_label, "DEFAULT");
while ((opt = getopt(argc, argv, "f:i:s:r:t:d:g:p:e:w:c:F:1EPLD:Oh")) != -1) {
while ((opt = getopt(argc, argv, "f:i:s:r:t:d:g:p:e:w:c:F:1EPTLD:Oh")) != -1) {
switch (opt) {
case 'f': // lower:upper:bin_size
if (f_set) {
@ -1102,6 +1116,9 @@ int main(int argc, char **argv)
case 'P':
ms.peak_hold = 1;
break;
case 'T':
ms.peak_hold = -1;
break;
case 'L':
ms.linear = 1;
break;