/* //device/include/server/AudioFlinger/AudioPeakingFilter.h ** ** Copyright 2009, 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 ANDROID_AUDIO_PEAKING_FILTER_H #define ANDROID_AUDIO_PEAKING_FILTER_H #include "AudioBiquadFilter.h" #include "AudioCoefInterpolator.h" namespace android { // A peaking audio filter, with unity skirt gain, and controllable peak // frequency, gain and bandwidth. // This filter is able to suppress introduce discontinuities and other artifacts // in the output, even when changing parameters abruptly. // Parameters can be set to any value - this class will make sure to clip them // when they are out of supported range. // // Implementation notes: // This class uses an underlying biquad filter whose parameters are determined // using a linear interpolation from a coefficient table, using a // AudioCoefInterpolator. // All is left for this class to do is mapping between high-level parameters to // fractional indices into the coefficient table. class AudioPeakingFilter { public: // Constructor. Resets the filter (see reset()). // nChannels Number of input/output channels (interlaced). // sampleRate The input/output sample rate, in Hz. AudioPeakingFilter(int nChannels, int sampleRate); // Reconfiguration of the filter. Changes input/output format, but does not // alter current parameter values. Clears delay lines. // nChannels Number of input/output channels (interlaced). // sampleRate The input/output sample rate, in Hz. void configure(int nChannels, int sampleRate); // Resets the filter parameters to the following values: // frequency: 0 // gain: 0 // bandwidth: 1200 cents. // It also disables the filter. Does not clear the delay lines. void reset(); // Clears delay lines. Does not alter parameter values. void clear() { mBiquad.clear(); } // Sets gain value. Actual change will only take place upon commit(). // This value will be remembered even if the filter is in disabled() state. // millibel Gain value in millibel (1/100 of decibel). void setGain(int32_t millibel); // Gets the gain, in millibel, as set. int32_t getGain() const { return mGain - 9600; } // Sets bandwidth value. Actual change will only take place upon commit(). // This value will be remembered even if the filter is in disabled() state. // cents Bandwidth value in cents (1/1200 octave). void setBandwidth(uint32_t cents); // Gets the gain, in cents, as set. uint32_t getBandwidth() const { return mBandwidth + 1; } // Sets frequency value. Actual change will only take place upon commit(). // This value will be remembered even if the filter is in disabled() state. // millihertz Frequency value in mHz. void setFrequency(uint32_t millihertz); // Gets the frequency, in mHz, as set. uint32_t getFrequency() const { return mNominalFrequency; } // Gets gain[dB]/2 points. // Results in mHz, and are computed based on the nominal values set, not on // possibly rounded or truncated actual values. void getBandRange(uint32_t & low, uint32_t & high) const; // Applies all parameter changes done to this point in time. // If the filter is disabled, the new parameters will take place when it is // enabled again. Does not introduce artifacts, unless immediate is set. // immediate Whether to apply change abruptly (ignored if filter is // disabled). void commit(bool immediate = false); // Process a buffer of input data. The input and output should contain // frameCount * nChannels interlaced samples. Processing can be done // in-place, by passing the same buffer as both arguments. // in Input buffer. // out Output buffer. // frameCount Number of frames to produce. void process(const audio_sample_t in[], audio_sample_t out[], int frameCount) { mBiquad.process(in, out, frameCount); } // Enables the filter, so it would start processing input. Does not // introduce artifacts, unless immediate is set. // immediate Whether to apply change abruptly. void enable(bool immediate = false) { mBiquad.enable(immediate); } // Disabled (bypasses) the filter. Does not introduce artifacts, unless // immediate is set. // immediate Whether to apply change abruptly. void disable(bool immediate = false) { mBiquad.disable(immediate); } private: // Precision for the mFrequency member. static const int FREQ_PRECISION_BITS = 26; // Precision for the mGain member. static const int GAIN_PRECISION_BITS = 10; // Precision for the mBandwidth member. static const int BANDWIDTH_PRECISION_BITS = 10; // Nyquist, in mHz. uint32_t mNiquistFreq; // Fractional index into the gain dimension of the coef table in // GAIN_PRECISION_BITS precision. int32_t mGain; // Fractional index into the bandwidth dimension of the coef table in // BANDWIDTH_PRECISION_BITS precision. uint32_t mBandwidth; // Fractional index into the frequency dimension of the coef table in // FREQ_PRECISION_BITS precision. uint32_t mFrequency; // Nominal value of frequency, as set. uint32_t mNominalFrequency; // 1/Nyquist[mHz], in 42-bit precision (very small). // Used for scaling the frequency. uint32_t mFrequencyFactor; // A biquad filter, used for the actual processing. AudioBiquadFilter mBiquad; // A coefficient interpolator, used for mapping the high level parameters to // the low-level biquad coefficients. static AudioCoefInterpolator mCoefInterp; }; } #endif // ANDROID_AUDIO_PEAKING_FILTER_H