diff options
author | Andy Green <andy.green@linaro.org> | 2012-11-11 13:49:01 +0800 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2012-11-11 13:49:01 +0800 |
commit | 838a55e999b2e505d56eb9bd15b02e434d0718d5 (patch) | |
tree | f8f7c546b7a10a7486a814fcd14fabe745ff8460 | |
parent | a0c47cf4930fc7a275dbae51ed4aaa53d4f8c30f (diff) |
add ignore silent switch
Signed-off-by: Andy Green <andy.green@linaro.org>
-rw-r--r-- | lava-fft.c | 110 |
1 files changed, 75 insertions, 35 deletions
@@ -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; |