diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a1f09b7a9..2415372b1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -348,7 +348,7 @@ else (LINGUAS STREQUAL "All") endif (LINGUAS STREQUAL "All") # Engines -set(GST_ENGINE_SRC engines/gstengine.cpp engines/gstequalizer.cpp engines/gstenginepipeline.cpp) +set(GST_ENGINE_SRC engines/gstengine.cpp engines/gstenginepipeline.cpp) set(GST_ENGINE_MOC engines/gstengine.h engines/gstenginepipeline.h) set(GST_ENGINE_LIB GSTREAMER GSTREAMER_BASE) set(XINE_ENGINE_SRC engines/xine-engine.cpp engines/xine-scope.c) diff --git a/src/engines/gstengine.cpp b/src/engines/gstengine.cpp index 043301fe5..befd325ec 100644 --- a/src/engines/gstengine.cpp +++ b/src/engines/gstengine.cpp @@ -22,7 +22,6 @@ #define DEBUG_PREFIX "Gst-Engine" #include "gstengine.h" -#include "gstequalizer.h" #include "gstenginepipeline.h" #include diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp index d7bce707e..0b0e3f553 100644 --- a/src/engines/gstenginepipeline.cpp +++ b/src/engines/gstenginepipeline.cpp @@ -15,7 +15,6 @@ */ #include "gstenginepipeline.h" -#include "gstequalizer.h" #include "gstengine.h" #include "bufferconsumer.h" @@ -24,6 +23,10 @@ const int GstEnginePipeline::kGstStateTimeoutNanosecs = 10000000; const int GstEnginePipeline::kFaderFudgeMsec = 2000; +const int GstEnginePipeline::kEqBandCount = 10; +const int GstEnginePipeline::kEqBandFrequencies[] = { + 60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000}; + GstEnginePipeline::GstEnginePipeline(GstEngine* engine) : QObject(NULL), engine_(engine), @@ -31,6 +34,8 @@ GstEnginePipeline::GstEnginePipeline(GstEngine* engine) sink_(GstEngine::kAutoSink), segment_start_(0), segment_start_received_(false), + eq_enabled_(false), + eq_preamp_(0), rg_enabled_(false), rg_mode_(0), rg_preamp_(0.0), @@ -50,6 +55,8 @@ GstEnginePipeline::GstEnginePipeline(GstEngine* engine) audioscale_(NULL), audiosink_(NULL) { + for (int i=0 ; i rgvolume -> rglimiter -> equalizer -> volume -> - // audioscale -> audioconvert -> audiosink + // audioconvert -> rgvolume -> rglimiter -> equalizer_preamp -> equalizer -> + // volume -> audioscale -> audioconvert -> audiosink // Decode bin if (!ReplaceDecodeBin(url)) return false; @@ -120,9 +127,8 @@ bool GstEnginePipeline::Init(const QUrl &url) { if (GstEngine::DoesThisSinkSupportChangingTheOutputDeviceToAUserEditableString(sink_) && !device_.isEmpty()) g_object_set(G_OBJECT(audiosink_), "device", device_.toUtf8().constData(), NULL); - equalizer_ = GST_ELEMENT(gst_equalizer_new()); - gst_bin_add(GST_BIN(audiobin_), equalizer_); - + if (!(equalizer_preamp_ = engine_->CreateElement("volume", audiobin_, "equalizer-preamp"))) { return false; } + if (!(equalizer_ = engine_->CreateElement("equalizer-nbands", audiobin_))) { return false; } if (!(audioconvert_ = engine_->CreateElement("audioconvert", audiobin_))) { return false; } if (!(volume_ = engine_->CreateElement("volume", audiobin_))) { return false; } if (!(audioscale_ = engine_->CreateElement("audioresample", audiobin_))) { return false; } @@ -152,6 +158,23 @@ bool GstEnginePipeline::Init(const QUrl &url) { gst_pad_add_event_probe(pad, G_CALLBACK(EventHandoffCallback), this); gst_object_unref (pad); + // Set the equalizer bands + g_object_set(G_OBJECT(equalizer_), "num-bands", 10, NULL); + + int last_band_frequency = 0; + for (int i=0 ; i& band_gains) { - // Preamp - g_object_set(G_OBJECT(equalizer_), "preamp", ( preamp + 100 ) / 2, NULL); + eq_preamp_ = preamp; + eq_band_gains_ = band_gains; + UpdateEqualizer(); +} - // Gains - std::vector gains_temp; - gains_temp.resize( band_gains.count() ); - for ( int i = 0; i < band_gains.count(); i++ ) - gains_temp[i] = band_gains.at( i ) + 100; +void GstEnginePipeline::UpdateEqualizer() { + // Update band gains + for (int i=0 ; i eq_band_gains_; + // ReplayGain bool rg_enabled_; int rg_mode_; @@ -155,12 +163,13 @@ class GstEnginePipeline : public QObject { GstElement* audiobin_; // Elements in the audiobin - // audioconvert ! rgvolume ! rglimiter ! audioconvert ! equalizer ! volume ! - // audioresample ! audioconvert ! audiosink + // audioconvert ! rgvolume ! rglimiter ! audioconvert ! equalizer_preamp ! + // equalizer ! volume ! audioresample ! audioconvert ! audiosink GstElement* audioconvert_; GstElement* rgvolume_; GstElement* rglimiter_; GstElement* audioconvert2_; + GstElement* equalizer_preamp_; GstElement* equalizer_; GstElement* volume_; GstElement* audioscale_; diff --git a/src/engines/gstequalizer.cpp b/src/engines/gstequalizer.cpp deleted file mode 100644 index 3fd61a3b9..000000000 --- a/src/engines/gstequalizer.cpp +++ /dev/null @@ -1,327 +0,0 @@ -// PCM time-domain equalizer -// (c) 2002 Felipe Rivera -// (c) 2004 Mark Kretschmann -// (c) 2006 Jakub Stachowski -// License: GPL V2 - - -#include "gstequalizer.h" -#include "iir_cf.h" // IIR filter coefficients - -#include -#include -#include - -#include - - -GST_DEBUG_CATEGORY_STATIC ( gst_equalizer_debug ); -#define GST_CAT_DEFAULT gst_equalizer_debug - -/* signals and args */ -enum { - LAST_SIGNAL -}; - -enum { - ARG_0, - ARG_ACTIVE, - ARG_PREAMP, - ARG_GAIN -}; - -static GstElementDetails gst_equalizer_details = { - const_cast("Equalizer"), - const_cast("Filter/Effect/Audio"), - const_cast("Parametric Equalizer"), - const_cast("Mark Kretschmann ") }; - -GstStaticPadTemplate sink_template = - GST_STATIC_PAD_TEMPLATE ( (gchar*) "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "audio/x-raw-int, " \ - "rate = (int) [ 1, MAX ], " \ - "channels = (int) [ 1, MAX ], " \ - "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ - "width = (int) 16, " \ - "depth = (int) 16, " \ - "signed = (bool) TRUE " - ) - ); - -GstStaticPadTemplate src_template = - GST_STATIC_PAD_TEMPLATE ( (gchar*) "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "audio/x-raw-int, " \ - "rate = (int) [ 1, MAX ], " \ - "channels = (int) [ 1, MAX ], " \ - "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ - "width = (int) 16, " \ - "depth = (int) 16, " \ - "signed = (bool) TRUE" - ) - ); - -// static guint gst_equalizer_signals[ LAST_SIGNAL ] = { 0 }; - -#define _do_init(bla) \ -GST_DEBUG_CATEGORY_INIT (gst_equalizer_debug, "equalizer", 0, "equalizer element"); - -GST_BOILERPLATE_FULL ( GstEqualizer, gst_equalizer, GstBaseTransform, GST_TYPE_BASE_TRANSFORM, _do_init ); - -static gboolean gst_equalizer_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps); -static GstFlowReturn gst_equalizer_transform_ip (GstBaseTransform * base, GstBuffer * outbuf); - -///////////////////////////////////////////////////////////////////////////////////// -// INIT -///////////////////////////////////////////////////////////////////////////////////// - -void gst_equalizer_base_init(gpointer g_class) { - GstElementClass * gstelement_class = GST_ELEMENT_CLASS ( g_class ); - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&src_template)); - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&sink_template)); - gst_element_class_set_details ( gstelement_class, &gst_equalizer_details ); -} - - -void gst_equalizer_class_init(GstEqualizerClass* klass) { - GObjectClass* gobject_class; - gobject_class = G_OBJECT_CLASS( klass ); - - gobject_class->set_property = gst_equalizer_set_property; - gobject_class->get_property = gst_equalizer_get_property; - - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ACTIVE, g_param_spec_boolean ("active", "active", "active", false, (GParamFlags)G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PREAMP, g_param_spec_int ("preamp", "preamp", "preamp", 0, 100, 0, (GParamFlags)G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_GAIN, g_param_spec_pointer ("gain", "gain", "gain", (GParamFlags)G_PARAM_WRITABLE)); - GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = - GST_DEBUG_FUNCPTR (gst_equalizer_transform_ip); - GST_BASE_TRANSFORM_CLASS (klass)->set_caps = - GST_DEBUG_FUNCPTR (gst_equalizer_set_caps); -} - - -void gst_equalizer_init(GstEqualizer* obj, GstEqualizerClass* klass) { - // Properties - obj->active = false; - obj->i = 0; - obj->j = 2; - obj->k = 1; -} - - -///////////////////////////////////////////////////////////////////////////////////// -// PUBLIC METHODS -///////////////////////////////////////////////////////////////////////////////////// - -static gboolean gst_equalizer_set_caps (GstBaseTransform* base, GstCaps* incaps, - GstCaps* outcaps) { - GstEqualizer* obj = GST_EQUALIZER (base); - GstStructure* structure = gst_caps_get_structure (incaps, 0); - - /* Since we're an audio filter, we want to handle raw audio - * and from that audio type, we need to get the samplerate and - * number of channels. */ - - gst_structure_get_int (structure, "rate", &obj->samplerate); - gst_structure_get_int (structure, "channels", &obj->channels); - // Load the correct filter table according to the sampling rate - set_filters( obj ); - /* Zero the history arrays */ - memset(obj->data_history, 0, sizeof(sXYData) * EQ_MAX_BANDS * EQ_CHANNELS); - qDebug() << "Samplerate " << obj->samplerate << ", channels: " << obj->channels; - return TRUE; -} - - - -void gst_equalizer_set_property(GObject* object, guint prop_id, - const GValue * value, GParamSpec* pspec) { - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail ( GST_IS_EQUALIZER ( object ) ); - - GstEqualizer* obj = GST_EQUALIZER ( object ); - std::vector* gains; - - switch (prop_id) { - case ARG_ACTIVE: - obj->active = g_value_get_boolean (value); - break; - - case ARG_PREAMP: - for ( int chan = 0; chan < EQ_CHANNELS; chan++ ) - obj->preamp[chan] = (float)g_value_get_int(value) * 0.01; - break; - - case ARG_GAIN: - gains = (std::vector*) g_value_get_pointer(value); - for ( int band = 0; band < BAND_NUM; band++ ) - for ( int chan = 0; chan < EQ_CHANNELS; chan++ ) - obj->gain[band][chan] = (float)(*gains)[band] * 0.012 - 0.2; - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID ( object, prop_id, pspec ); - break; - } -} - - -void gst_equalizer_get_property(GObject* object, guint prop_id, GValue* value, - GParamSpec* pspec) { - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail ( GST_IS_EQUALIZER ( object ) ); - - GstEqualizer* obj = GST_EQUALIZER ( object ); - - switch (prop_id) { - case ARG_ACTIVE: - g_value_set_boolean (value, obj->active); - break; - - case ARG_PREAMP: - g_value_set_int(value, obj->preamp[0] * 100); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID ( object, prop_id, pspec ); - break; - } -} - - -void set_filters(GstEqualizer* obj) { - Q_UNUSED(iir_cf10_44100); - Q_UNUSED(iir_cf10_48000); - Q_UNUSED(iir_cf15_44100); - Q_UNUSED(iir_cf15_48000); - Q_UNUSED(iir_cf25_44100); - Q_UNUSED(iir_cf25_48000); - Q_UNUSED(iir_cf31_44100); - Q_UNUSED(iir_cf31_48000); - - switch(obj->samplerate) { - case 11025: - obj->iir_cf = iir_cf10_11k_11025; - break; - - case 22050: - obj->iir_cf = iir_cf10_22k_22050; - break; - - case 48000: - obj->iir_cf = iir_cforiginal10_48000; - break; - - default: - obj->iir_cf = iir_cforiginal10_44100; - break; - } -} - -static GstFlowReturn gst_equalizer_transform_ip(GstBaseTransform* base, - GstBuffer * outbuf) { - GstEqualizer* obj = GST_EQUALIZER ( base ); - - if ( !obj->active ) return GST_FLOW_OK; - - gint16 *data = (gint16*)GST_BUFFER_DATA ( outbuf ); - gint length = GST_BUFFER_SIZE( outbuf ); - - /* Indexes for the history arrays - * These have to be kept between calls to this function - * hence they are members of the equalizer object */ - int& i = obj->i; - int& j = obj->j; - int& k = obj->k; - - gint index, band, channel; - gint halflength; - float out[EQ_CHANNELS], pcm[EQ_CHANNELS]; - float tempfloat; - - /** - * IIR filter equation is - * y[n] = 2 * (alpha*(x[n]-x[n-2]) + gamma*y[n-1] - beta*y[n-2]) - * - * NOTE: The 2 factor was introduced in the coefficients to save - * a multiplication - * - * This algorithm cascades two filters to get nice filtering - * at the expense of extra CPU cycles - */ - /* 16bit, 2 bytes per sample, so divide by two the length of - * the buffer (length is in bytes) - */ - halflength = (length >> 1); - for (index = 0; index < halflength; index+=2) { - /* For each channel */ - for (channel = 0; channel < obj->channels; channel++) { - pcm[channel] = data[index+channel]; - /* Preamp gain */ - pcm[channel] *= obj->preamp[channel]; - - out[channel] = 0.; - /* For each band */ - for (band = 0; band < BAND_NUM; band++) { - /* Store Xi(n) */ - obj->data_history[band][channel].x[i] = pcm[channel]; - /* Calculate and store Yi(n) */ - obj->data_history[band][channel].y[i] = - ( - /* = alpha * [x(n)-x(n-2)] */ - obj->iir_cf[band].alpha * ( obj->data_history[band][channel].x[i] - - obj->data_history[band][channel].x[k]) - /* + gamma * y(n-1) */ - + obj->iir_cf[band].gamma * obj->data_history[band][channel].y[j] - /* - beta * y(n-2) */ - - obj->iir_cf[band].beta * obj->data_history[band][channel].y[k] - ); - /* - * The multiplication by 2.0 was 'moved' into the coefficients to save - * CPU cycles here */ - /* Apply the gain */ - out[channel] += obj->data_history[band][channel].y[i]*obj->gain[band][channel]; // * 2.0; - } /* For each band */ - - /* Volume stuff - Scale down original PCM sample and add it to the filters - output. This substitutes the multiplication by 0.25 - Go back to use the floating point multiplication before the - conversion to give more dynamic range - */ - out[channel] += pcm[channel]*0.25; - - /* Round and convert to integer and limit the output */ - tempfloat = out[channel] < -32768.0 ? -32768.0 : out[channel]; - tempfloat = tempfloat > 32767.0 ? 32767.0 : tempfloat; - data[index+channel] = (gint)rintf(tempfloat); - - } /* For each channel */ - - i++; j++; k++; - - /* Wrap around the indexes */ - if (i == 3) i = 0; - else if (j == 3) j = 0; - else k = 0; - }/* For each pair of samples */ - - return GST_FLOW_OK; -} - - - -GstEqualizer* gst_equalizer_new() { - GstEqualizer* obj = GST_EQUALIZER ( g_object_new ( GST_TYPE_EQUALIZER, NULL ) ); - gst_object_set_name( (GstObject*) obj, "Equalizer" ); - - return obj; -} - diff --git a/src/engines/gstequalizer.h b/src/engines/gstequalizer.h deleted file mode 100644 index d2fc96412..000000000 --- a/src/engines/gstequalizer.h +++ /dev/null @@ -1,89 +0,0 @@ -// PCM time-domain equalizer -// (c) 2002 Felipe Rivera -// (c) 2004 Mark Kretschmann -// License: GPL V2 - -#ifndef AMAROK_GST_EQUALIZER_H -#define AMAROK_GST_EQUALIZER_H - -#include -#include - -G_BEGIN_DECLS - -#define BAND_NUM 10 -#define EQ_MAX_BANDS 10 -#define EQ_CHANNELS 2 - -#define GST_TYPE_EQUALIZER \ - (gst_equalizer_get_type()) -#define GST_EQUALIZER(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_EQUALIZER,GstEqualizer)) -#define GST_EQUALIZER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_EQUALIZER,GstEqualizerClass)) -#define GST_IS_EQUALIZER(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_EQUALIZER)) -#define GST_IS_EQUALIZER_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EQUALIZER)) - - typedef struct _GstEqualizer GstEqualizer; -typedef struct _GstEqualizerClass GstEqualizerClass; - -// Floating point -typedef struct { - float beta; - float alpha; - float gamma; -} sIIRCoefficients; - -/* Coefficient history for the IIR filter */ -typedef struct { - float x[3]; /* x[n], x[n-1], x[n-2] */ - float y[3]; /* y[n], y[n-1], y[n-2] */ -} sXYData; - - -struct _GstEqualizer { - // Do not remove - GstBaseTransform element; - - GstPad *srcpad; - GstPad *sinkpad; - - int samplerate; - int channels; - - // Properties - bool active; - // Gain for each band - // values should be between -0.2 and 1.0 - float gain[EQ_MAX_BANDS][EQ_CHANNELS] __attribute__((aligned)); - // Volume gain - // values should be between 0.0 and 1.0 - float preamp[EQ_CHANNELS] __attribute__((aligned)); - - // Coefficients - sIIRCoefficients* iir_cf; - - sXYData data_history[EQ_MAX_BANDS][EQ_CHANNELS] __attribute__((aligned)); - - int i, j, k; -}; - -struct _GstEqualizerClass { - GstBaseTransformClass parent_class; - - /* signals */ -}; - -void gst_equalizer_set_property( GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec ); -void gst_equalizer_get_property( GObject * object, guint prop_id, GValue * value, GParamSpec * pspec ); -void set_filters( GstEqualizer* obj ); -GType gst_equalizer_get_type( void ); -GstEqualizer* gst_equalizer_new(); - - -G_END_DECLS - - -#endif /* AMAROK_GST_EQUALIZER_H */ diff --git a/src/engines/iir_cf.h b/src/engines/iir_cf.h deleted file mode 100644 index ef3341e7b..000000000 --- a/src/engines/iir_cf.h +++ /dev/null @@ -1,433 +0,0 @@ -// IIR filter coefficient tables - - -/* BETA, ALPHA, GAMMA */ -static sIIRCoefficients iir_cf10_11k_11025[] __attribute__((aligned)) = { - /* 31 Hz*/ -{ 9.8758524689e-01, 6.2073765555e-03, 1.9872750693e+00 }, - /* 62 Hz*/ -{ 9.7532461998e-01, 1.2337690008e-02, 1.9740916593e+00 }, - /* 125 Hz*/ -{ 9.5087485437e-01, 2.4562572817e-02, 1.9459267562e+00 }, - /* 250 Hz*/ -{ 9.0416308662e-01, 4.7918456688e-02, 1.8848691023e+00 }, - /* 500 Hz*/ -{ 8.1751373987e-01, 9.1243130064e-02, 1.7442229115e+00 }, - /* 1k Hz*/ -{ 6.6840529852e-01, 1.6579735074e-01, 1.4047189863e+00 }, - /* 2k Hz*/ -{ 4.4858358977e-01, 2.7570820511e-01, 6.0517475334e-01 }, - /* 3k Hz*/ -{ 3.1012671838e-01, 3.4493664081e-01, -1.8141012760e-01 }, - /* 4k Hz*/ -{ 2.4198119087e-01, 3.7900940457e-01, -8.0845085113e-01 }, - /* 5.5k Hz*/ -{ 3.3453245058e-01, 3.3273377471e-01, -1.3344985880e+00 }, -}; -static sIIRCoefficients iir_cf10_22k_22050[] __attribute__((aligned)) = { - /* 31 Hz*/ -{ 9.9377323686e-01, 3.1133815717e-03, 1.9936954495e+00 }, - /* 62 Hz*/ -{ 9.8758524689e-01, 6.2073765555e-03, 1.9872750693e+00 }, - /* 125 Hz*/ -{ 9.7512812040e-01, 1.2435939802e-02, 1.9738753198e+00 }, - /* 250 Hz*/ -{ 9.5087485437e-01, 2.4562572817e-02, 1.9459267562e+00 }, - /* 500 Hz*/ -{ 9.0416308662e-01, 4.7918456688e-02, 1.8848691023e+00 }, - /* 1k Hz*/ -{ 8.1751373987e-01, 9.1243130064e-02, 1.7442229115e+00 }, - /* 2k Hz*/ -{ 6.6840529852e-01, 1.6579735074e-01, 1.4047189863e+00 }, - /* 4k Hz*/ -{ 4.4858358977e-01, 2.7570820511e-01, 6.0517475334e-01 }, - /* 8k Hz*/ -{ 2.4198119087e-01, 3.7900940457e-01, -8.0845085113e-01 }, - /* 11k Hz*/ -{ 3.3453245058e-01, 3.3273377471e-01, -1.3344985880e+00 }, -}; -static sIIRCoefficients iir_cforiginal10_44100[] __attribute__((aligned)) = { - /* 60 Hz*/ -{ 9.9397349481e-01, 3.0132525945e-03, 1.9939006377e+00 }, - /* 170 Hz*/ -{ 9.8301906957e-01, 8.4904652142e-03, 1.9824374272e+00 }, - /* 310 Hz*/ -{ 9.6925150511e-01, 1.5374247445e-02, 1.9673310395e+00 }, - /* 600 Hz*/ -{ 9.4134330314e-01, 2.9328348430e-02, 1.9342541736e+00 }, - /* 1k Hz*/ -{ 9.0416308662e-01, 4.7918456688e-02, 1.8848691023e+00 }, - /* 3k Hz*/ -{ 7.3918401009e-01, 1.3040799496e-01, 1.5827185140e+00 }, - /* 6k Hz*/ -{ 5.4688945509e-01, 2.2655527245e-01, 1.0152665639e+00 }, - /* 12k Hz*/ -{ 3.1012671838e-01, 3.4493664081e-01, -1.8141012760e-01 }, - /* 14k Hz*/ -{ 2.6712322292e-01, 3.6643838854e-01, -5.2115143966e-01 }, - /* 16k Hz*/ -{ 2.4198119087e-01, 3.7900940457e-01, -8.0845085113e-01 }, -}; -static sIIRCoefficients iir_cforiginal10_48000[] __attribute__((aligned)) = { - /* 60 Hz*/ -{ 9.9446178985e-01, 2.7691050731e-03, 1.9944002760e+00 }, - /* 170 Hz*/ -{ 9.8438794122e-01, 7.8060293913e-03, 1.9838966333e+00 }, - /* 310 Hz*/ -{ 9.7171413384e-01, 1.4142933081e-02, 1.9700909975e+00 }, - /* 600 Hz*/ -{ 9.4597793866e-01, 2.7011030668e-02, 1.9399791381e+00 }, - /* 1k Hz*/ -{ 9.1159452679e-01, 4.4202736607e-02, 1.8952405706e+00 }, - /* 3k Hz*/ -{ 7.5755317065e-01, 1.2122341468e-01, 1.6237674017e+00 }, - /* 6k Hz*/ -{ 5.7422402554e-01, 2.1288798723e-01, 1.1131444836e+00 }, - /* 12k Hz*/ -{ 3.3730698905e-01, 3.3134650547e-01, 8.1883731790e-17 }, - /* 14k Hz*/ -{ 2.8947322018e-01, 3.5526338991e-01, -3.3374022753e-01 }, - /* 16k Hz*/ -{ 2.5620076154e-01, 3.7189961923e-01, -6.2810038077e-01 }, -}; -static sIIRCoefficients iir_cf10_44100[] __attribute__((aligned)) = { - /* 31 Hz*/ -{ 9.9688176273e-01, 1.5591186337e-03, 1.9968622855e+00 }, - /* 62 Hz*/ -{ 9.9377323686e-01, 3.1133815717e-03, 1.9936954495e+00 }, - /* 125 Hz*/ -{ 9.8748575691e-01, 6.2571215431e-03, 1.9871705722e+00 }, - /* 250 Hz*/ -{ 9.7512812040e-01, 1.2435939802e-02, 1.9738753198e+00 }, - /* 500 Hz*/ -{ 9.5087485437e-01, 2.4562572817e-02, 1.9459267562e+00 }, - /* 1k Hz*/ -{ 9.0416308662e-01, 4.7918456688e-02, 1.8848691023e+00 }, - /* 2k Hz*/ -{ 8.1751373987e-01, 9.1243130064e-02, 1.7442229115e+00 }, - /* 4k Hz*/ -{ 6.6840529852e-01, 1.6579735074e-01, 1.4047189863e+00 }, - /* 8k Hz*/ -{ 4.4858358977e-01, 2.7570820511e-01, 6.0517475334e-01 }, - /* 16k Hz*/ -{ 2.4198119087e-01, 3.7900940457e-01, -8.0845085113e-01 }, -}; -static sIIRCoefficients iir_cf10_48000[] __attribute__((aligned)) = { - /* 31 Hz*/ -{ 9.9713475915e-01, 1.4326204244e-03, 1.9971183163e+00 }, - /* 62 Hz*/ -{ 9.9427771143e-01, 2.8611442874e-03, 1.9942120343e+00 }, - /* 125 Hz*/ -{ 9.8849666727e-01, 5.7516663664e-03, 1.9882304829e+00 }, - /* 250 Hz*/ -{ 9.7712566171e-01, 1.1437169144e-02, 1.9760670839e+00 }, - /* 500 Hz*/ -{ 9.5477456091e-01, 2.2612719547e-02, 1.9505892385e+00 }, - /* 1k Hz*/ -{ 9.1159452679e-01, 4.4202736607e-02, 1.8952405706e+00 }, - /* 2k Hz*/ -{ 8.3100647694e-01, 8.4496761532e-02, 1.7686164442e+00 }, - /* 4k Hz*/ -{ 6.9062328809e-01, 1.5468835596e-01, 1.4641227157e+00 }, - /* 8k Hz*/ -{ 4.7820368352e-01, 2.6089815824e-01, 7.3910184176e-01 }, - /* 16k Hz*/ -{ 2.5620076154e-01, 3.7189961923e-01, -6.2810038077e-01 }, -}; -static sIIRCoefficients iir_cf15_44100[] __attribute__((aligned)) = { - /* 25 Hz*/ -{ 9.9834072702e-01, 8.2963648917e-04, 1.9983280505e+00 }, - /* 40 Hz*/ -{ 9.9734652663e-01, 1.3267366865e-03, 1.9973140908e+00 }, - /* 63 Hz*/ -{ 9.9582396353e-01, 2.0880182333e-03, 1.9957435641e+00 }, - /* 100 Hz*/ -{ 9.9337951306e-01, 3.3102434709e-03, 1.9931771947e+00 }, - /* 160 Hz*/ -{ 9.8942832039e-01, 5.2858398053e-03, 1.9889114258e+00 }, - /* 250 Hz*/ -{ 9.8353109588e-01, 8.2344520610e-03, 1.9822729654e+00 }, - /* 400 Hz*/ -{ 9.7378088082e-01, 1.3109559588e-02, 1.9705764276e+00 }, - /* 630 Hz*/ -{ 9.5901979676e-01, 2.0490101620e-02, 1.9511333590e+00 }, - /* 1k Hz*/ -{ 9.3574903986e-01, 3.2125480071e-02, 1.9161350100e+00 }, - /* 1.6k Hz*/ -{ 8.9923630641e-01, 5.0381846793e-02, 1.8501014162e+00 }, - /* 2.5k Hz*/ -{ 8.4722457681e-01, 7.6387711593e-02, 1.7312785699e+00 }, - /* 4k Hz*/ -{ 7.6755471307e-01, 1.1622264346e-01, 1.4881981417e+00 }, - /* 6.3k Hz*/ -{ 6.6125377473e-01, 1.6937311263e-01, 1.0357747868e+00 }, - /* 10k Hz*/ -{ 5.2683267950e-01, 2.3658366025e-01, 2.2218349322e-01 }, - /* 16k Hz*/ -{ 4.0179628792e-01, 2.9910185604e-01, -9.1248032613e-01 }, -}; -static sIIRCoefficients iir_cf15_48000[] __attribute__((aligned)) = { - /* 25 Hz*/ -{ 9.9847546664e-01, 7.6226668143e-04, 1.9984647656e+00 }, - /* 40 Hz*/ -{ 9.9756184654e-01, 1.2190767289e-03, 1.9975344645e+00 }, - /* 63 Hz*/ -{ 9.9616261379e-01, 1.9186931041e-03, 1.9960947369e+00 }, - /* 100 Hz*/ -{ 9.9391578543e-01, 3.0421072865e-03, 1.9937449618e+00 }, - /* 160 Hz*/ -{ 9.9028307215e-01, 4.8584639242e-03, 1.9898465702e+00 }, - /* 250 Hz*/ -{ 9.8485897264e-01, 7.5705136795e-03, 1.9837962543e+00 }, - /* 400 Hz*/ -{ 9.7588512657e-01, 1.2057436715e-02, 1.9731772447e+00 }, - /* 630 Hz*/ -{ 9.6228521814e-01, 1.8857390928e-02, 1.9556164694e+00 }, - /* 1k Hz*/ -{ 9.4080933132e-01, 2.9595334338e-02, 1.9242054384e+00 }, - /* 1.6k Hz*/ -{ 9.0702059196e-01, 4.6489704022e-02, 1.8653476166e+00 }, - /* 2.5k Hz*/ -{ 8.5868004289e-01, 7.0659978553e-02, 1.7600401337e+00 }, - /* 4k Hz*/ -{ 7.8409610788e-01, 1.0795194606e-01, 1.5450725522e+00 }, - /* 6.3k Hz*/ -{ 6.8332861002e-01, 1.5833569499e-01, 1.1426447155e+00 }, - /* 10k Hz*/ -{ 5.5267518228e-01, 2.2366240886e-01, 4.0186190803e-01 }, - /* 16k Hz*/ -{ 4.1811888447e-01, 2.9094055777e-01, -7.0905944223e-01 }, -}; -static sIIRCoefficients iir_cf25_44100[] __attribute__((aligned)) = { - /* 20 Hz*/ -{ 9.9934037157e-01, 3.2981421662e-04, 1.9993322545e+00 }, - /* 31.5 Hz*/ -{ 9.9896129025e-01, 5.1935487310e-04, 1.9989411587e+00 }, - /* 40 Hz*/ -{ 9.9868118265e-01, 6.5940867495e-04, 1.9986487252e+00 }, - /* 50 Hz*/ -{ 9.9835175161e-01, 8.2412419683e-04, 1.9983010452e+00 }, - /* 80 Hz*/ -{ 9.9736411067e-01, 1.3179446674e-03, 1.9972343673e+00 }, - /* 100 Hz*/ -{ 9.9670622662e-01, 1.6468866919e-03, 1.9965035707e+00 }, - /* 125 Hz*/ -{ 9.9588448566e-01, 2.0577571681e-03, 1.9955679690e+00 }, - /* 160 Hz*/ -{ 9.9473519326e-01, 2.6324033689e-03, 1.9942169198e+00 }, - /* 250 Hz*/ -{ 9.9178600786e-01, 4.1069960678e-03, 1.9905226414e+00 }, - /* 315 Hz*/ -{ 9.8966154150e-01, 5.1692292513e-03, 1.9876580847e+00 }, - /* 400 Hz*/ -{ 9.8689036168e-01, 6.5548191616e-03, 1.9836646251e+00 }, - /* 500 Hz*/ -{ 9.8364027156e-01, 8.1798642207e-03, 1.9786090689e+00 }, - /* 800 Hz*/ -{ 9.7395577681e-01, 1.3022111597e-02, 1.9611472340e+00 }, - /* 1k Hz*/ -{ 9.6755437936e-01, 1.6222810321e-02, 1.9476180811e+00 }, - /* 1.25k Hz*/ -{ 9.5961458750e-01, 2.0192706249e-02, 1.9286193446e+00 }, - /* 1.6k Hz*/ -{ 9.4861481164e-01, 2.5692594182e-02, 1.8982024567e+00 }, - /* 2.5k Hz*/ -{ 9.2095325455e-01, 3.9523372724e-02, 1.8003794694e+00 }, - /* 3.15k Hz*/ -{ 9.0153642498e-01, 4.9231787512e-02, 1.7132251201e+00 }, - /* 4k Hz*/ -{ 8.7685876255e-01, 6.1570618727e-02, 1.5802270232e+00 }, - /* 5k Hz*/ -{ 8.4886734822e-01, 7.5566325889e-02, 1.3992391376e+00 }, - /* 8k Hz*/ -{ 7.7175298860e-01, 1.1412350570e-01, 7.4018523020e-01 }, - /* 10k Hz*/ -{ 7.2627049462e-01, 1.3686475269e-01, 2.5120552756e-01 }, - /* 12.5k Hz*/ -{ 6.7674787974e-01, 1.6162606013e-01, -3.4978377639e-01 }, - /* 16k Hz*/ -{ 6.2482197550e-01, 1.8758901225e-01, -1.0576558797e+00 }, - /* 20k Hz*/ -{ 6.1776148240e-01, 1.9111925880e-01, -1.5492465594e+00 }, -}; -static sIIRCoefficients iir_cf25_48000[] __attribute__((aligned)) = { - /* 20 Hz*/ -{ 9.9939388451e-01, 3.0305774630e-04, 1.9993870327e+00 }, - /* 31.5 Hz*/ -{ 9.9904564663e-01, 4.7717668529e-04, 1.9990286528e+00 }, - /* 40 Hz*/ -{ 9.9878827195e-01, 6.0586402557e-04, 1.9987608731e+00 }, - /* 50 Hz*/ -{ 9.9848556942e-01, 7.5721528829e-04, 1.9984427652e+00 }, - /* 80 Hz*/ -{ 9.9757801538e-01, 1.2109923088e-03, 1.9974684869e+00 }, - /* 100 Hz*/ -{ 9.9697343933e-01, 1.5132803374e-03, 1.9968023538e+00 }, - /* 125 Hz*/ -{ 9.9621823598e-01, 1.8908820086e-03, 1.9959510180e+00 }, - /* 160 Hz*/ -{ 9.9516191728e-01, 2.4190413595e-03, 1.9947243453e+00 }, - /* 250 Hz*/ -{ 9.9245085008e-01, 3.7745749576e-03, 1.9913840669e+00 }, - /* 315 Hz*/ -{ 9.9049749914e-01, 4.7512504310e-03, 1.9888056233e+00 }, - /* 400 Hz*/ -{ 9.8794899744e-01, 6.0255012789e-03, 1.9852245824e+00 }, - /* 500 Hz*/ -{ 9.8495930023e-01, 7.5203498850e-03, 1.9807093500e+00 }, - /* 800 Hz*/ -{ 9.7604570090e-01, 1.1977149551e-02, 1.9652207158e+00 }, - /* 1k Hz*/ -{ 9.7014963927e-01, 1.4925180364e-02, 1.9532947360e+00 }, - /* 1.25k Hz*/ -{ 9.6283181641e-01, 1.8584091793e-02, 1.9366149237e+00 }, - /* 1.6k Hz*/ -{ 9.5268463224e-01, 2.3657683878e-02, 1.9100137880e+00 }, - /* 2.5k Hz*/ -{ 9.2711765003e-01, 3.6441174983e-02, 1.8248457659e+00 }, - /* 3.15k Hz*/ -{ 9.0912548757e-01, 4.5437256213e-02, 1.7491177803e+00 }, - /* 4k Hz*/ -{ 8.8619860800e-01, 5.6900696000e-02, 1.6334959111e+00 }, - /* 5k Hz*/ -{ 8.6010264114e-01, 6.9948679430e-02, 1.4757186436e+00 }, - /* 8k Hz*/ -{ 7.8757448309e-01, 1.0621275845e-01, 8.9378724155e-01 }, - /* 10k Hz*/ -{ 7.4415362476e-01, 1.2792318762e-01, 4.5142017567e-01 }, - /* 12.5k Hz*/ -{ 6.9581428034e-01, 1.5209285983e-01, -1.1091156053e-01 }, - /* 16k Hz*/ -{ 6.4120506488e-01, 1.7939746756e-01, -8.2060253244e-01 }, - /* 20k Hz*/ -{ 6.0884213704e-01, 1.9557893148e-01, -1.3932981614e+00 }, -}; -static sIIRCoefficients iir_cf31_44100[] __attribute__((aligned)) = { - /* 20 Hz*/ -{ 9.9934037157e-01, 3.2981421662e-04, 1.9993322545e+00 }, - /* 25 Hz*/ -{ 9.9917555233e-01, 4.1222383516e-04, 1.9991628705e+00 }, - /* 31.5 Hz*/ -{ 9.9896129025e-01, 5.1935487310e-04, 1.9989411587e+00 }, - /* 40 Hz*/ -{ 9.9868118265e-01, 6.5940867495e-04, 1.9986487252e+00 }, - /* 50 Hz*/ -{ 9.9835175161e-01, 8.2412419683e-04, 1.9983010452e+00 }, - /* 63 Hz*/ -{ 9.9792365217e-01, 1.0381739160e-03, 1.9978431682e+00 }, - /* 80 Hz*/ -{ 9.9736411067e-01, 1.3179446674e-03, 1.9972343673e+00 }, - /* 100 Hz*/ -{ 9.9670622662e-01, 1.6468866919e-03, 1.9965035707e+00 }, - /* 125 Hz*/ -{ 9.9588448566e-01, 2.0577571681e-03, 1.9955679690e+00 }, - /* 160 Hz*/ -{ 9.9473519326e-01, 2.6324033689e-03, 1.9942169198e+00 }, - /* 200 Hz*/ -{ 9.9342335280e-01, 3.2883236020e-03, 1.9926141028e+00 }, - /* 250 Hz*/ -{ 9.9178600786e-01, 4.1069960678e-03, 1.9905226414e+00 }, - /* 315 Hz*/ -{ 9.8966154150e-01, 5.1692292513e-03, 1.9876580847e+00 }, - /* 400 Hz*/ -{ 9.8689036168e-01, 6.5548191616e-03, 1.9836646251e+00 }, - /* 500 Hz*/ -{ 9.8364027156e-01, 8.1798642207e-03, 1.9786090689e+00 }, - /* 630 Hz*/ -{ 9.7943153305e-01, 1.0284233476e-02, 1.9714629236e+00 }, - /* 800 Hz*/ -{ 9.7395577681e-01, 1.3022111597e-02, 1.9611472340e+00 }, - /* 1k Hz*/ -{ 9.6755437936e-01, 1.6222810321e-02, 1.9476180811e+00 }, - /* 1.25k Hz*/ -{ 9.5961458750e-01, 2.0192706249e-02, 1.9286193446e+00 }, - /* 1.6k Hz*/ -{ 9.4861481164e-01, 2.5692594182e-02, 1.8982024567e+00 }, - /* 2k Hz*/ -{ 9.3620971896e-01, 3.1895140519e-02, 1.8581325022e+00 }, - /* 2.5k Hz*/ -{ 9.2095325455e-01, 3.9523372724e-02, 1.8003794694e+00 }, - /* 3.15k Hz*/ -{ 9.0153642498e-01, 4.9231787512e-02, 1.7132251201e+00 }, - /* 4k Hz*/ -{ 8.7685876255e-01, 6.1570618727e-02, 1.5802270232e+00 }, - /* 5k Hz*/ -{ 8.4886734822e-01, 7.5566325889e-02, 1.3992391376e+00 }, - /* 6.3k Hz*/ -{ 8.1417575446e-01, 9.2912122771e-02, 1.1311200817e+00 }, - /* 8k Hz*/ -{ 7.7175298860e-01, 1.1412350570e-01, 7.4018523020e-01 }, - /* 10k Hz*/ -{ 7.2627049462e-01, 1.3686475269e-01, 2.5120552756e-01 }, - /* 12.5k Hz*/ -{ 6.7674787974e-01, 1.6162606013e-01, -3.4978377639e-01 }, - /* 16k Hz*/ -{ 6.2482197550e-01, 1.8758901225e-01, -1.0576558797e+00 }, - /* 20k Hz*/ -{ 6.1776148240e-01, 1.9111925880e-01, -1.5492465594e+00 }, -}; -static sIIRCoefficients iir_cf31_48000[] __attribute__((aligned)) = { - /* 20 Hz*/ -{ 9.9939388451e-01, 3.0305774630e-04, 1.9993870327e+00 }, - /* 25 Hz*/ -{ 9.9924247917e-01, 3.7876041632e-04, 1.9992317740e+00 }, - /* 31.5 Hz*/ -{ 9.9904564663e-01, 4.7717668529e-04, 1.9990286528e+00 }, - /* 40 Hz*/ -{ 9.9878827195e-01, 6.0586402557e-04, 1.9987608731e+00 }, - /* 50 Hz*/ -{ 9.9848556942e-01, 7.5721528829e-04, 1.9984427652e+00 }, - /* 63 Hz*/ -{ 9.9809219264e-01, 9.5390367779e-04, 1.9980242502e+00 }, - /* 80 Hz*/ -{ 9.9757801538e-01, 1.2109923088e-03, 1.9974684869e+00 }, - /* 100 Hz*/ -{ 9.9697343933e-01, 1.5132803374e-03, 1.9968023538e+00 }, - /* 125 Hz*/ -{ 9.9621823598e-01, 1.8908820086e-03, 1.9959510180e+00 }, - /* 160 Hz*/ -{ 9.9516191728e-01, 2.4190413595e-03, 1.9947243453e+00 }, - /* 200 Hz*/ -{ 9.9395607757e-01, 3.0219612131e-03, 1.9932727986e+00 }, - /* 250 Hz*/ -{ 9.9245085008e-01, 3.7745749576e-03, 1.9913840669e+00 }, - /* 315 Hz*/ -{ 9.9049749914e-01, 4.7512504310e-03, 1.9888056233e+00 }, - /* 400 Hz*/ -{ 9.8794899744e-01, 6.0255012789e-03, 1.9852245824e+00 }, - /* 500 Hz*/ -{ 9.8495930023e-01, 7.5203498850e-03, 1.9807093500e+00 }, - /* 630 Hz*/ -{ 9.8108651246e-01, 9.4567437704e-03, 1.9743538683e+00 }, - /* 800 Hz*/ -{ 9.7604570090e-01, 1.1977149551e-02, 1.9652207158e+00 }, - /* 1k Hz*/ -{ 9.7014963927e-01, 1.4925180364e-02, 1.9532947360e+00 }, - /* 1.25k Hz*/ -{ 9.6283181641e-01, 1.8584091793e-02, 1.9366149237e+00 }, - /* 1.6k Hz*/ -{ 9.5268463224e-01, 2.3657683878e-02, 1.9100137880e+00 }, - /* 2k Hz*/ -{ 9.4122788957e-01, 2.9386055213e-02, 1.8750821533e+00 }, - /* 2.5k Hz*/ -{ 9.2711765003e-01, 3.6441174983e-02, 1.8248457659e+00 }, - /* 3.15k Hz*/ -{ 9.0912548757e-01, 4.5437256213e-02, 1.7491177803e+00 }, - /* 4k Hz*/ -{ 8.8619860800e-01, 5.6900696000e-02, 1.6334959111e+00 }, - /* 5k Hz*/ -{ 8.6010264114e-01, 6.9948679430e-02, 1.4757186436e+00 }, - /* 6.3k Hz*/ -{ 8.2760520925e-01, 8.6197395374e-02, 1.2405797786e+00 }, - /* 8k Hz*/ -{ 7.8757448309e-01, 1.0621275845e-01, 8.9378724155e-01 }, - /* 10k Hz*/ -{ 7.4415362476e-01, 1.2792318762e-01, 4.5142017567e-01 }, - /* 12.5k Hz*/ -{ 6.9581428034e-01, 1.5209285983e-01, -1.1091156053e-01 }, - /* 16k Hz*/ -{ 6.4120506488e-01, 1.7939746756e-01, -8.2060253244e-01 }, - /* 20k Hz*/ -{ 6.0884213704e-01, 1.9557893148e-01, -1.3932981614e+00 }, -}; -