Skip to content

Commit 0d825fe

Browse files
committed
rtl_power: trough hold
1 parent 86f9503 commit 0d825fe

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

src/rtl_power.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
#include "convenience/convenience.h"
6868

6969
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
70+
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
7071

7172
#define DEFAULT_BUF_LENGTH (1 * 16384)
7273
#define AUTO_GAIN -100
@@ -104,7 +105,7 @@ struct tuning_state
104105
int downsample;
105106
int downsample_passes; /* for the recursive filter */
106107
int comp_fir_size;
107-
int peak_hold;
108+
int peak_hold; /* 1 = peak, 0 = off, -1 = trough */
108109
int linear;
109110
int bin_spec;
110111
double crop;
@@ -188,6 +189,7 @@ void usage(void)
188189
"\t possible values are 2M to 3.2M\n"
189190
"\t[-E enables epoch timestamps (default: off/verbose)]\n"
190191
"\t[-P enables peak hold (default: off/averaging)]\n"
192+
"\t[-T enables trough hold (default: off/averaging)]\n"
191193
"\t[-L enable linear output (default: off/dB)]\n"
192194
"\t[-D direct_sampling_mode, 0 (default/off), 1 (I), 2 (Q), 3 (no-mod)]\n"
193195
"\t[-O enable offset tuning (default: off)]\n"
@@ -479,10 +481,12 @@ void rms_power(struct tuning_state *ts)
479481
err = t * 2 * dc - dc * dc * buf_len;
480482
p -= (int64_t)round(err);
481483

482-
if (!ts->peak_hold) {
484+
if (ts->peak_hold == 0) {
483485
ts->avg[0] += p;
484-
} else {
486+
} else if (ts->peak_hold == 1) {
485487
ts->avg[0] = MAX(ts->avg[0], p);
488+
} else if (ts->peak_hold == -1) {
489+
ts->avg[0] = MIN(ts->avg[0], p);
486490
}
487491
ts->samples += 1;
488492
}
@@ -685,7 +689,10 @@ void frequency_range(char *arg, struct misc_settings *ms)
685689
exit(1);
686690
}
687691
for (j=0; j<(1<<c.bin_e); j++) {
688-
ts->avg[j] = 0L;
692+
if (ts->peak_hold == -1) {
693+
ts->avg[j] = 1e6;
694+
} else {
695+
ts->avg[j] = 0L;}
689696
}
690697
ts->buf8 = (uint8_t*)malloc(buf_len * sizeof(uint8_t));
691698
if (!ts->buf8) {
@@ -933,14 +940,18 @@ void scanner(void)
933940
fft_buf[offset+j*2+1] = (int16_t)w;
934941
}
935942
fix_fft(fft_buf+offset, bin_e, ts->sine);
936-
if (!ts->peak_hold) {
943+
if (ts->peak_hold == 0) {
937944
for (j=0; j<bin_len; j++) {
938945
ts->avg[j] += real_conj(fft_buf[offset+j*2], fft_buf[offset+j*2+1]);
939946
}
940-
} else {
947+
} else if (ts->peak_hold == 1){
941948
for (j=0; j<bin_len; j++) {
942949
ts->avg[j] = MAX(real_conj(fft_buf[offset+j*2], fft_buf[offset+j*2+1]), ts->avg[j]);
943950
}
951+
} else if (ts->peak_hold == -1){
952+
for (j=0; j<bin_len; j++) {
953+
ts->avg[j] = MIN(real_conj(fft_buf[offset+j*2], fft_buf[offset+j*2+1]), ts->avg[j]);
954+
}
944955
}
945956
ts->samples += ds;
946957
}
@@ -975,7 +986,7 @@ void csv_dbm(struct tuning_state *ts)
975986
}
976987
dbm = (double)ts->avg[i];
977988
dbm /= (double)ts->rate;
978-
if (!ts->peak_hold) {
989+
if (ts->peak_hold == 0) {
979990
dbm /= (double)ts->samples;
980991
}
981992
if (ts->linear) {
@@ -986,7 +997,10 @@ void csv_dbm(struct tuning_state *ts)
986997
}
987998
}
988999
for (i=0; i<len; i++) {
989-
ts->avg[i] = 0L;
1000+
if (ts->peak_hold == -1) {
1001+
ts->avg[i] = 1e6;
1002+
} else {
1003+
ts->avg[i] = 0L;}
9901004
}
9911005
ts->samples = 0;
9921006
}
@@ -1034,7 +1048,7 @@ int main(int argc, char **argv)
10341048
init_misc(&ms);
10351049
strcpy(dev_label, "DEFAULT");
10361050

1037-
while ((opt = getopt(argc, argv, "f:i:s:r:t:d:g:p:e:w:c:F:1EPLD:Oh")) != -1) {
1051+
while ((opt = getopt(argc, argv, "f:i:s:r:t:d:g:p:e:w:c:F:1EPTLD:Oh")) != -1) {
10381052
switch (opt) {
10391053
case 'f': // lower:upper:bin_size
10401054
if (f_set) {
@@ -1102,6 +1116,9 @@ int main(int argc, char **argv)
11021116
case 'P':
11031117
ms.peak_hold = 1;
11041118
break;
1119+
case 'T':
1120+
ms.peak_hold = -1;
1121+
break;
11051122
case 'L':
11061123
ms.linear = 1;
11071124
break;

0 commit comments

Comments
 (0)