blob: d0f49c9e1ba905dd681b5c4b58ea3d09f1336936 [file] [log] [blame]
/* //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