Fixed performance issue with IIR filter
Passing samples with zero value (0.0) causes very slow processing of IIR filter on my test machine 'nuedel'. I don't know why. To solve this, I add a very small number to each input sample.
This commit is contained in:
parent
f86adf4bb5
commit
31fca59294
|
@ -126,7 +126,8 @@ void iir_process(iir_filter_t *filter, sample_t *samples, int length)
|
||||||
|
|
||||||
/* process filter */
|
/* process filter */
|
||||||
for (i = 0; i < length; i++) {
|
for (i = 0; i < length; i++) {
|
||||||
in = *samples;
|
/* add a small value, otherwise this loop will perform really bad on my 'nuedel' machine!!! */
|
||||||
|
in = *samples + 0.000000001;
|
||||||
for (j = 0; j < iterations; j++) {
|
for (j = 0; j < iterations; j++) {
|
||||||
out = in * a0 + z1[j];
|
out = in * a0 + z1[j];
|
||||||
z1[j] = in * a1 + z2[j] - b1 * out;
|
z1[j] = in * a1 + z2[j] - b1 * out;
|
||||||
|
@ -163,7 +164,8 @@ void iir_process_baseband(iir_filter_t *filter, float *baseband, int length)
|
||||||
|
|
||||||
/* process filter */
|
/* process filter */
|
||||||
for (i = 0; i < length; i++) {
|
for (i = 0; i < length; i++) {
|
||||||
in = *baseband;
|
/* add a small value, otherwise this loop will perform really bad on my 'nuedel' machine!!! */
|
||||||
|
in = *baseband + 0.000000001;
|
||||||
for (j = 0; j < iterations; j++) {
|
for (j = 0; j < iterations; j++) {
|
||||||
out = in * a0 + z1[j];
|
out = in * a0 + z1[j];
|
||||||
#ifdef DEBUG_NAN
|
#ifdef DEBUG_NAN
|
||||||
|
|
|
@ -92,7 +92,6 @@ int fm_mod_init(fm_mod_t *mod, double samplerate, double offset, double amplitud
|
||||||
/* generate ramp up with ramp_length */
|
/* generate ramp up with ramp_length */
|
||||||
for (i = 0; i < mod->ramp_length; i++)
|
for (i = 0; i < mod->ramp_length; i++)
|
||||||
mod->ramp_tab[i] = 0.5 - cos(M_PI * i / mod->ramp_length) / 2.0;
|
mod->ramp_tab[i] = 0.5 - cos(M_PI * i / mod->ramp_length) / 2.0;
|
||||||
mod->ramp_tab[0] = mod->ramp_tab[1] / 2.0; /* never be 0 */
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -199,10 +198,6 @@ again:
|
||||||
dev = offset + *frequency++;
|
dev = offset + *frequency++;
|
||||||
power++;
|
power++;
|
||||||
length--;
|
length--;
|
||||||
/* somehow we need to have some value, otherwise IIR filter will be very slow!
|
|
||||||
* we still continue with a carrier, but it has very low amplitude.
|
|
||||||
* the low amplitude is set in ramp_tab[0]
|
|
||||||
*/
|
|
||||||
if (fast_math) {
|
if (fast_math) {
|
||||||
phase += 65536.0 * dev / rate;
|
phase += 65536.0 * dev / rate;
|
||||||
if (phase < 0.0)
|
if (phase < 0.0)
|
||||||
|
|
Loading…
Reference in New Issue