67
67
#include "convenience/convenience.h"
68
68
69
69
#define MAX (x , y ) (((x) > (y)) ? (x) : (y))
70
+ #define MIN (x , y ) (((x) < (y)) ? (x) : (y))
70
71
71
72
#define DEFAULT_BUF_LENGTH (1 * 16384)
72
73
#define AUTO_GAIN -100
@@ -104,7 +105,7 @@ struct tuning_state
104
105
int downsample ;
105
106
int downsample_passes ; /* for the recursive filter */
106
107
int comp_fir_size ;
107
- int peak_hold ;
108
+ int peak_hold ; /* 1 = peak, 0 = off, -1 = trough */
108
109
int linear ;
109
110
int bin_spec ;
110
111
double crop ;
@@ -188,6 +189,7 @@ void usage(void)
188
189
"\t possible values are 2M to 3.2M\n"
189
190
"\t[-E enables epoch timestamps (default: off/verbose)]\n"
190
191
"\t[-P enables peak hold (default: off/averaging)]\n"
192
+ "\t[-T enables trough hold (default: off/averaging)]\n"
191
193
"\t[-L enable linear output (default: off/dB)]\n"
192
194
"\t[-D direct_sampling_mode, 0 (default/off), 1 (I), 2 (Q), 3 (no-mod)]\n"
193
195
"\t[-O enable offset tuning (default: off)]\n"
@@ -479,10 +481,12 @@ void rms_power(struct tuning_state *ts)
479
481
err = t * 2 * dc - dc * dc * buf_len ;
480
482
p -= (int64_t )round (err );
481
483
482
- if (! ts -> peak_hold ) {
484
+ if (ts -> peak_hold == 0 ) {
483
485
ts -> avg [0 ] += p ;
484
- } else {
486
+ } else if ( ts -> peak_hold == 1 ) {
485
487
ts -> avg [0 ] = MAX (ts -> avg [0 ], p );
488
+ } else if (ts -> peak_hold == -1 ) {
489
+ ts -> avg [0 ] = MIN (ts -> avg [0 ], p );
486
490
}
487
491
ts -> samples += 1 ;
488
492
}
@@ -685,7 +689,10 @@ void frequency_range(char *arg, struct misc_settings *ms)
685
689
exit (1 );
686
690
}
687
691
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 ;}
689
696
}
690
697
ts -> buf8 = (uint8_t * )malloc (buf_len * sizeof (uint8_t ));
691
698
if (!ts -> buf8 ) {
@@ -933,14 +940,18 @@ void scanner(void)
933
940
fft_buf [offset + j * 2 + 1 ] = (int16_t )w ;
934
941
}
935
942
fix_fft (fft_buf + offset , bin_e , ts -> sine );
936
- if (! ts -> peak_hold ) {
943
+ if (ts -> peak_hold == 0 ) {
937
944
for (j = 0 ; j < bin_len ; j ++ ) {
938
945
ts -> avg [j ] += real_conj (fft_buf [offset + j * 2 ], fft_buf [offset + j * 2 + 1 ]);
939
946
}
940
- } else {
947
+ } else if ( ts -> peak_hold == 1 ) {
941
948
for (j = 0 ; j < bin_len ; j ++ ) {
942
949
ts -> avg [j ] = MAX (real_conj (fft_buf [offset + j * 2 ], fft_buf [offset + j * 2 + 1 ]), ts -> avg [j ]);
943
950
}
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
+ }
944
955
}
945
956
ts -> samples += ds ;
946
957
}
@@ -975,7 +986,7 @@ void csv_dbm(struct tuning_state *ts)
975
986
}
976
987
dbm = (double )ts -> avg [i ];
977
988
dbm /= (double )ts -> rate ;
978
- if (! ts -> peak_hold ) {
989
+ if (ts -> peak_hold == 0 ) {
979
990
dbm /= (double )ts -> samples ;
980
991
}
981
992
if (ts -> linear ) {
@@ -986,7 +997,10 @@ void csv_dbm(struct tuning_state *ts)
986
997
}
987
998
}
988
999
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 ;}
990
1004
}
991
1005
ts -> samples = 0 ;
992
1006
}
@@ -1034,7 +1048,7 @@ int main(int argc, char **argv)
1034
1048
init_misc (& ms );
1035
1049
strcpy (dev_label , "DEFAULT" );
1036
1050
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 ) {
1038
1052
switch (opt ) {
1039
1053
case 'f' : // lower:upper:bin_size
1040
1054
if (f_set ) {
@@ -1102,6 +1116,9 @@ int main(int argc, char **argv)
1102
1116
case 'P' :
1103
1117
ms .peak_hold = 1 ;
1104
1118
break ;
1119
+ case 'T' :
1120
+ ms .peak_hold = -1 ;
1121
+ break ;
1105
1122
case 'L' :
1106
1123
ms .linear = 1 ;
1107
1124
break ;
0 commit comments