[SCM] calf/master: Un-inline most of biquad_filter_module implementation.
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:40:02 UTC 2013
The following commit has been merged in the master branch:
commit 1d7a92764a5efc97cbba0afb93ac7d7e2c0d0c5d
Author: Krzysztof Foltman <wdev at foltman.com>
Date: Mon Apr 5 17:14:25 2010 +0100
Un-inline most of biquad_filter_module implementation.
I mostly did it to make the code more readable - there should be no difference
either way in build time, and a slight performance loss in runtime. But this
is well within acceptable range.
diff --git a/src/audio_fx.cpp b/src/audio_fx.cpp
index 88f6764..dcba08f 100644
--- a/src/audio_fx.cpp
+++ b/src/audio_fx.cpp
@@ -117,3 +117,114 @@ float simple_phaser::freq_gain(float freq, float sr) const
p = p / (cfloat(1.0) - cfloat(fb) * p);
return std::abs(cfloat(gs_dry.get_last()) + cfloat(gs_wet.get_last()) * p);
}
+
+///////////////////////////////////////////////////////////////////////////////////
+
+void biquad_filter_module::calculate_filter(float freq, float q, int mode, float gain)
+{
+ if (mode <= mode_36db_lp) {
+ order = mode + 1;
+ left[0].set_lp_rbj(freq, pow(q, 1.0 / order), srate, gain);
+ } else if ( mode_12db_hp <= mode && mode <= mode_36db_hp ) {
+ order = mode - mode_12db_hp + 1;
+ left[0].set_hp_rbj(freq, pow(q, 1.0 / order), srate, gain);
+ } else if ( mode_6db_bp <= mode && mode <= mode_18db_bp ) {
+ order = mode - mode_6db_bp + 1;
+ left[0].set_bp_rbj(freq, pow(q, 1.0 / order), srate, gain);
+ } else { // mode_6db_br <= mode <= mode_18db_br
+ order = mode - mode_6db_br + 1;
+ left[0].set_br_rbj(freq, order * 0.1 * q, srate, gain);
+ }
+
+ right[0].copy_coeffs(left[0]);
+ for (int i = 1; i < order; i++) {
+ left[i].copy_coeffs(left[0]);
+ right[i].copy_coeffs(left[0]);
+ }
+}
+
+void biquad_filter_module::filter_activate()
+{
+ for (int i=0; i < order; i++) {
+ left[i].reset();
+ right[i].reset();
+ }
+}
+
+void biquad_filter_module::sanitize()
+{
+ for (int i=0; i < order; i++) {
+ left[i].sanitize();
+ right[i].sanitize();
+ }
+}
+
+int biquad_filter_module::process_channel(uint16_t channel_no, const float *in, float *out, uint32_t numsamples, int inmask) {
+ dsp::biquad_d1<float> *filter;
+ switch (channel_no) {
+ case 0:
+ filter = left;
+ break;
+
+ case 1:
+ filter = right;
+ break;
+
+ default:
+ assert(false);
+ return 0;
+ }
+
+ if (inmask) {
+ switch(order) {
+ case 1:
+ for (uint32_t i = 0; i < numsamples; i++)
+ out[i] = filter[0].process(in[i]);
+ break;
+ case 2:
+ for (uint32_t i = 0; i < numsamples; i++)
+ out[i] = filter[1].process(filter[0].process(in[i]));
+ break;
+ case 3:
+ for (uint32_t i = 0; i < numsamples; i++)
+ out[i] = filter[2].process(filter[1].process(filter[0].process(in[i])));
+ break;
+ }
+ } else {
+ if (filter[order - 1].empty())
+ return 0;
+ switch(order) {
+ case 1:
+ for (uint32_t i = 0; i < numsamples; i++)
+ out[i] = filter[0].process_zeroin();
+ break;
+ case 2:
+ if (filter[0].empty())
+ for (uint32_t i = 0; i < numsamples; i++)
+ out[i] = filter[1].process_zeroin();
+ else
+ for (uint32_t i = 0; i < numsamples; i++)
+ out[i] = filter[1].process(filter[0].process_zeroin());
+ break;
+ case 3:
+ if (filter[1].empty())
+ for (uint32_t i = 0; i < numsamples; i++)
+ out[i] = filter[2].process_zeroin();
+ else
+ for (uint32_t i = 0; i < numsamples; i++)
+ out[i] = filter[2].process(filter[1].process(filter[0].process_zeroin()));
+ break;
+ }
+ }
+ for (int i = 0; i < order; i++)
+ filter[i].sanitize();
+ return filter[order - 1].empty() ? 0 : inmask;
+}
+
+float biquad_filter_module::freq_gain(int subindex, float freq, float srate) const
+{
+ float level = 1.0;
+ for (int j = 0; j < order; j++)
+ level *= left[j].freq_gain(freq, srate);
+ return level;
+}
diff --git a/src/calf/audio_fx.h b/src/calf/audio_fx.h
index 7d61035..9c204ce 100644
--- a/src/calf/audio_fx.h
+++ b/src/calf/audio_fx.h
@@ -531,7 +531,7 @@ public:
virtual void calculate_filter(float freq, float q, int mode, float gain = 1.0) = 0;
virtual void filter_activate() = 0;
virtual void sanitize() = 0;
- virtual int process_channel(uint16_t channel_no, float *in, float *out, uint32_t numsamples, int inmask) = 0;
+ virtual int process_channel(uint16_t channel_no, const float *in, float *out, uint32_t numsamples, int inmask) = 0;
virtual float freq_gain(int subindex, float freq, float srate) const = 0;
virtual ~filter_module_iface() {}
@@ -556,115 +556,16 @@ public:
public:
biquad_filter_module() : order(0) {}
-
- void calculate_filter(float freq, float q, int mode, float gain = 1.0)
- {
- if (mode <= mode_36db_lp) {
- order = mode + 1;
- left[0].set_lp_rbj(freq, pow(q, 1.0 / order), srate, gain);
- } else if ( mode_12db_hp <= mode && mode <= mode_36db_hp ) {
- order = mode - mode_12db_hp + 1;
- left[0].set_hp_rbj(freq, pow(q, 1.0 / order), srate, gain);
- } else if ( mode_6db_bp <= mode && mode <= mode_18db_bp ) {
- order = mode - mode_6db_bp + 1;
- left[0].set_bp_rbj(freq, pow(q, 1.0 / order), srate, gain);
- } else { // mode_6db_br <= mode <= mode_18db_br
- order = mode - mode_6db_br + 1;
- left[0].set_br_rbj(freq, order * 0.1 * q, srate, gain);
- }
-
- right[0].copy_coeffs(left[0]);
- for (int i = 1; i < order; i++) {
- left[i].copy_coeffs(left[0]);
- right[i].copy_coeffs(left[0]);
- }
- }
-
- void filter_activate()
- {
- for (int i=0; i < order; i++) {
- left[i].reset();
- right[i].reset();
- }
- }
-
- void sanitize()
- {
- for (int i=0; i < order; i++) {
- left[i].sanitize();
- right[i].sanitize();
- }
- }
-
- inline int process_channel(uint16_t channel_no, float *in, float *out, uint32_t numsamples, int inmask) {
- dsp::biquad_d1<float> *filter;
- switch (channel_no) {
- case 0:
- filter = left;
- break;
-
- case 1:
- filter = right;
- break;
-
- default:
- assert(false);
- return 0;
- }
-
- if (inmask) {
- switch(order) {
- case 1:
- for (uint32_t i = 0; i < numsamples; i++)
- out[i] = filter[0].process(in[i]);
- break;
- case 2:
- for (uint32_t i = 0; i < numsamples; i++)
- out[i] = filter[1].process(filter[0].process(in[i]));
- break;
- case 3:
- for (uint32_t i = 0; i < numsamples; i++)
- out[i] = filter[2].process(filter[1].process(filter[0].process(in[i])));
- break;
- }
- } else {
- if (filter[order - 1].empty())
- return 0;
- switch(order) {
- case 1:
- for (uint32_t i = 0; i < numsamples; i++)
- out[i] = filter[0].process_zeroin();
- break;
- case 2:
- if (filter[0].empty())
- for (uint32_t i = 0; i < numsamples; i++)
- out[i] = filter[1].process_zeroin();
- else
- for (uint32_t i = 0; i < numsamples; i++)
- out[i] = filter[1].process(filter[0].process_zeroin());
- break;
- case 3:
- if (filter[1].empty())
- for (uint32_t i = 0; i < numsamples; i++)
- out[i] = filter[2].process_zeroin();
- else
- for (uint32_t i = 0; i < numsamples; i++)
- out[i] = filter[2].process(filter[1].process(filter[0].process_zeroin()));
- break;
- }
- }
- for (int i = 0; i < order; i++)
- filter[i].sanitize();
- return filter[order - 1].empty() ? 0 : inmask;
- }
-
- float freq_gain(int subindex, float freq, float srate) const
- {
- float level = 1.0;
- for (int j = 0; j < order; j++)
- level *= left[j].freq_gain(freq, srate);
- return level;
- }
+ /// Calculate filter coefficients based on parameters - cutoff/center frequency, q, filter type, output gain
+ void calculate_filter(float freq, float q, int mode, float gain = 1.0);
+ /// Reset filter state
+ void filter_activate();
+ /// Remove denormals
+ void sanitize();
+ /// Process a single channel (float buffer) of data
+ int process_channel(uint16_t channel_no, const float *in, float *out, uint32_t numsamples, int inmask);
+ /// Determine gain (|H(z)|) for a given frequency
+ float freq_gain(int subindex, float freq, float srate) const;
};
class two_band_eq
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list