| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| |
| #ifndef GLITCH_TEST_H |
| #define GLITCH_TEST_H |
| |
| class Fft; |
| class Window; |
| |
| class GlitchTest { |
| public: |
| GlitchTest(void); |
| |
| virtual ~GlitchTest(void) { |
| cleanup(); |
| } |
| |
| /* Set up the instance to operate on input test signals sampled at |
| sample_rate that contain a stimulis tone of stim_freq frequency. |
| The signal will be considered on during the interval it exceeds |
| onset_thresh (dB re 1.0). Any frames containing a tone that have |
| a signal energy to out-of-band energy ratio less than |
| db_snr_thresh are counted as bad frames. Init must be called |
| before CheckToneSnr. */ |
| void init(float sample_rate, float stim_freq, float onset_thresh, |
| float db_snr_thresh); |
| |
| /* Analyze the n_samples of the lin16 signal in pcm. This signal is |
| assumed sampled at sample_rate, and to contain a sinusoid with |
| center frequency stim_freq, embedded somewhere in time, with |
| "silence" intervals before and after. The contiguous duration of |
| the tone that exceeds onset_thresh (in dB re 1.0) is returned as |
| seconds in duration. The number of frames for which the ratio of |
| the energy at the tone frequency to the energy in the rest of the |
| spectrum is less than db_snr_thresh is returned in n_bad_frames. |
| If the test succeed, the method returns 1, else it returns a |
| negative number that reflects the cause of failure as follows: |
| -1 The instance is not initialized. |
| -2 There are not enough samples to do a reasonable check. |
| -3 The tone signal onset was not found. |
| -4 The tone signal end was not found. */ |
| int checkToneSnr(short* pcm, int n_samples, float* duration, |
| int* n_bad_frames); |
| |
| private: |
| // Free memory, etc. |
| void cleanup(void); |
| |
| /* Do a real FFT on the n_input samples in data, and return n_output |
| power spectral density points in output. The output points include |
| DC through the Nyquist frequency (i.e. 1 + fft_size/2). output |
| must be large enough to accommodate this size. If n_input==0 or |
| n_input > fft_size, return 0; else return 1. */ |
| int realMagSqSpectrum(float* data, int n_input, |
| float* output, int* n_output); |
| |
| /* Find the largest value in data starting at start_search and ending |
| at end_search-1. The values in data are assumed to be magnitude |
| squared values from a spectrum computation based on window_size |
| sample points. Return the index where the largest value was found, |
| and return the dB (re 1.0) equivalent of the highest magnitude. */ |
| void findPeak(float* data, int start_search, int end_search, |
| int* max_loc, float* max_value); |
| |
| // Real and Imaginary analysis arrays. |
| float* mRe; |
| float* mIm; |
| // Fourier transform and window. |
| Fft* mFt; |
| Window* mWind; |
| // Derived parameters and other variables. |
| float mSampleRate; |
| int mFrameStep; |
| int mWindowSize; |
| int mFftSize; |
| float mOnsetThresh; |
| float mDbSnrThresh; |
| int mLowestSpectrumBin; |
| int mLowToneBin; |
| int mHighToneBin; |
| }; |
| |
| #endif // GLITCH_TEST_H |