summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Green <andy.green@linaro.org>2012-11-11 13:49:01 +0800
committerAndy Green <andy.green@linaro.org>2012-11-11 13:49:01 +0800
commit838a55e999b2e505d56eb9bd15b02e434d0718d5 (patch)
treef8f7c546b7a10a7486a814fcd14fabe745ff8460
parenta0c47cf4930fc7a275dbae51ed4aaa53d4f8c30f (diff)
add ignore silent switch
Signed-off-by: Andy Green <andy.green@linaro.org>
-rw-r--r--lava-fft.c110
1 files changed, 75 insertions, 35 deletions
diff --git a/lava-fft.c b/lava-fft.c
index 6936996..44eca00 100644
--- a/lava-fft.c
+++ b/lava-fft.c
@@ -65,6 +65,7 @@ struct wav_header {
#define MAX_SUPPORTED_CHANNELS 8
#define MIN_TEST_AMPLITUDE 0x800
#define SILENCE_FFT_LIMIT 200000
+#define IGNORE_FOR_SILENCE_DETECT 0.05
#define SIN_MODULATION_HZ (RATE / 67)
#define SIN_CHAN_STEP_HZ 133
@@ -130,6 +131,7 @@ static struct option options[] = {
{ "gnuplot", required_argument, NULL, 'g' },
{ "fault", required_argument, NULL, 'f' },
{ "waveform", required_argument, NULL, 'w' },
+ { "ignore-silence", no_argument, NULL, 'i' },
{ NULL, 0, 0, 0 }
};
@@ -153,7 +155,7 @@ int main( int argc, char** argv )
int head = 0;
int pos = 0;
int compare = 0;
- int test = 1;
+ int test = 3;
double noise = 0.0;
int n = 1;
double r;
@@ -176,6 +178,7 @@ int main( int argc, char** argv )
double m;
int fault = 0;
int waveform = 0;
+ int ignore_silence = 0;
if (sizeof(struct wav_header) != 44) {
fprintf(stderr, "Packing problem with struct wav_header\n");
@@ -183,12 +186,16 @@ int main( int argc, char** argv )
}
while (n >= 0) {
- n = getopt_long(argc, argv, "hvr:t:n:a:o:c:s:g:f:w:",
+ n = getopt_long(argc, argv, "hvr:t:n:a:o:c:s:g:f:w:i",
options, NULL);
if (n < 0)
continue;
switch (n) {
+ case 'i':
+ ignore_silence = 1;
+ break;
+
case 's':
snip = atof(optarg);
break;
@@ -252,8 +259,8 @@ int main( int argc, char** argv )
default:
case 'h':
fprintf(stderr,
- "Usage: either... fft > wav_file or\n"
- " cat capture | fft\n"
+ "Usage: either... lava-fft > wav_file or\n"
+ " cat capture | lava-fft\n"
" [--verbose -v] Increase debug on stderr\n"
" [--rate -r <sample rate>] set sample rate "
"(default 48000)\n"
@@ -269,13 +276,18 @@ int main( int argc, char** argv )
" [ --gnuplot -g <channel index> issue graph "
"data on stdout suitable for gnuplot, "
"for channel <channel index>"
- " [ --fault -f <index> inject fault... "
- "1 = random sample every 16\n"
- "2 = random sample every 32\n"
- "3 = random sample every 64\n"
- "4 = random sample every 128\n...\n"
- "13 = random sample every 65536\n"
- "|16 = swap channel pairs\n"
+ " [ --fault -f <index> inject fault...\n"
+ " 1 = random sample every 16\n"
+ " 2 = random sample every 32\n"
+ " 3 = random sample every 64\n"
+ " 4 = random sample every 128\n"
+ " ...\n"
+ " 13 = random sample every 65536\n"
+ " |16 = swap channel pairs\n"
+ " [--ignore-silence -i] Do not check channels"
+ " that are disabled in --test "
+ "bitfield... normally they get "
+ "checked to have been silent\n"
);
return 1;
@@ -365,31 +377,48 @@ int main( int argc, char** argv )
switch (waveform) {
case 0:
default:
- m0 = (double)wav.samples_per_second / (SQUARE_MODULATION_HZ + (SQUARE_CHAN_STEP_HZ * n));
+ m0 = (double)wav.samples_per_second /
+ (SQUARE_MODULATION_HZ +
+ (SQUARE_CHAN_STEP_HZ * n));
m1 = ((double)i / m0);
m1 -= (long)m1;
- l = (peak_amplitude * 32767.0 * SQUARE_MODULATION_FACTOR);
+ l = (peak_amplitude * 32767.0 *
+ SQUARE_MODULATION_FACTOR);
if (m1 >= 0.5)
l = -l;
- l += (peak_amplitude * 32767.0 * SIN_MODULATION_FACTOR *
- sin((double)i * ((2 * M_PI) /
- ((double)wav.samples_per_second / (SIN_MODULATION_HZ + (SIN_CHAN_STEP_HZ * n))))));
+ l += (peak_amplitude * 32767.0 *
+ SIN_MODULATION_FACTOR *
+ sin((double)i * ((2 * M_PI) /
+ ((double)wav.samples_per_second /
+ (SIN_MODULATION_HZ +
+ (SIN_CHAN_STEP_HZ * n))))));
break;
case 1: /* TRI_HZ = eg, 1297 ^v*/
- m0 = (double)wav.samples_per_second / (TRI_HZ + (SIN_CHAN_STEP_HZ * n));
- m1 = ((double)i / m0) + 0.25; /* start at 90 degree phase offset to get a good starting detect */
+ m0 = (double)wav.samples_per_second /
+ (TRI_HZ + (SIN_CHAN_STEP_HZ * n));
+ /*
+ * start at 90 degree phase offset to get a
+ * good starting detect
+ */
+ m1 = ((double)i / m0) + 0.25;
m1 -= (long)m1;
- // fprintf(stderr, "%f %f\n", m0, m1);
if (m1 >= 0.5)
if (m1 >= 0.75)
- m1 = (-peak_amplitude * 32767.0) * (0.25 - (m1 - 0.75)) * 4;
+ m1 = (-peak_amplitude *
+ 32767.0) *
+ (0.25 - (m1 - 0.75)) * 4;
else
- m1 = (-peak_amplitude * 32767.0) * (m1 - 0.5) * 4;
+ m1 = (-peak_amplitude *
+ 32767.0) *
+ (m1 - 0.5) * 4;
else
if (m1 >= 0.25)
- m1 = (peak_amplitude * 32767.0) * (0.25 - (m1 - 0.25)) * 4;
+ m1 = (peak_amplitude *
+ 32767.0) *
+ (0.25 - (m1 - 0.25)) * 4;
else
- m1 = (peak_amplitude * 32767.0) * (m1) * 4;
+ m1 = (peak_amplitude *
+ 32767.0) * (m1) * 4;
l = m1;
break;
}
@@ -409,7 +438,8 @@ int main( int argc, char** argv )
case 12: /* 32768 */
case 13: /* 65536 */
if ((i & ((1 << (fault + 3)) - 1)) == 7)
- l = (((double)rand() / (RAND_MAX / 2)) - 1.0) * 32767;
+ l = (((double)rand() /
+ (RAND_MAX / 2)) - 1.0) * 32767;
break;
case 0:
default:
@@ -456,7 +486,8 @@ int main( int argc, char** argv )
buf[n] = 0;
- for (i = 0; i < (leadin * wav.samples_per_second); i++)
+ for (i = 0; i < ((leadin + IGNORE_FOR_SILENCE_DETECT) *
+ wav.samples_per_second); i++)
if (write(fd, &buf[0],
sizeof buf[0] * wav.count_channels) !=
sizeof buf[0] * wav.count_channels) {
@@ -564,7 +595,8 @@ int main( int argc, char** argv )
}
if (l > MIN_TEST_AMPLITUDE ||
l < -MIN_TEST_AMPLITUDE)
- if (skip > (0.05 * (double)wav.samples_per_second))
+ if (skip > (IGNORE_FOR_SILENCE_DETECT *
+ (double)wav.samples_per_second))
n = 0;
}
@@ -590,7 +622,8 @@ int main( int argc, char** argv )
}
if (skip < SIZE) {
- fprintf(stderr, "Failed to see enough leadin silence %d %ld\n", skip, l);
+ fprintf(stderr, "Failed to see enough leadin silence %d %ld\n",
+ skip, l);
return 50;
}
@@ -652,13 +685,12 @@ int main( int argc, char** argv )
break;
case 32:
l = (noise * r) + ((1.0 - noise) *
- (((double)(buf_32[i] >> 16)) * attenuate));
+ (((double)(buf_32[i] >> 16)) *
+ attenuate));
break;
}
-//fprintf(stderr, "%ld\n", l);
-
data[i][n][0] = l;
data[i][n][1] = 0.0;
}
@@ -681,6 +713,9 @@ int main( int argc, char** argv )
for (i = 0; i < cap_wav.count_channels; i++) {
+ if (!(test & (1 << i)) && ignore_silence)
+ continue;
+
if (fault & 16)
j = i ^ 1;
else
@@ -695,8 +730,10 @@ int main( int argc, char** argv )
ref_largest_ac_mag = 0;
ref_largest_ac_index = 0;
for (n = 1; n < SIZE / 2; n++) {
- d = sqrt((ref_fft_result[i][n][0] * ref_fft_result[i][n][0]) +
- (ref_fft_result[i][n][1] * ref_fft_result[i][n][1]));
+ d = sqrt((ref_fft_result[i][n][0] *
+ ref_fft_result[i][n][0]) +
+ (ref_fft_result[i][n][1] *
+ ref_fft_result[i][n][1]));
if (d > ref_largest_ac_mag) {
ref_largest_ac_mag = d;
ref_largest_ac_index = n;
@@ -716,8 +753,6 @@ int main( int argc, char** argv )
fft_result[ref_largest_ac_index][1]));
fdomain_scale = ref_largest_ac_mag / d;
-// fprintf(stderr, "fdomain_scale = %f (%f vs %f) idx %d\n", fdomain_scale, ref_largest_ac_mag, d, ref_largest_ac_index);
-
/* see how well it compares to template in frequency domain */
delta = 0;
@@ -742,12 +777,17 @@ int main( int argc, char** argv )
((fft_result[n][1] * fdomain_scale) *
(fft_result[n][1] * fdomain_scale)));
+ /*
+ * compare incoming to either sent template, or
+ * silence if test disabled
+ */
+
if (test & (1 << i))
m2 = derate *
sqrt((ref_fft_result[j][n][0] *
ref_fft_result[j][n][0]) +
(ref_fft_result[j][n][1] *
- ref_fft_result[j][n][1]));
+ ref_fft_result[j][n][1]));
else
m2 = 0;