Hello,

This is not a bug-report or something like this, just I am curios.
Yesterday I was playing with fi.fb_fcomb() and I'm a bit puzzled.
Let's talk about fb_comb() first, they both have the same pattern.
Two questions:

---------------------------------------------------------------------
Why does it have ": mem" at the end? This makes sense sometimes but

        - its purpose is not documented.

        - the comment refers to ~jos/paspFeedback_Comb_Filters.html
          but with this "mem" the difference equation doesn't match
          that of mentioned in the link above.

        - user can easily add ": mem" himself if needed.

---------------------------------------------------------------------
But the main question is that the part before ": mem"

        (+ <: de.delay(maxdel,N-1),_) ~ *(-aN) : !,*(b0)

looks suboptimal and overcomplicated to me. I mean,

        + ~ -aN * de.delay(maxdel,N-1) : *(b0);
or
        *(-aN) + *(b0) ~ de.delay(maxdel,N-1);

should do the same but

        - look more simple/understandable

        - do not create the extra delay line

---------------------------------------------------------------------
Let's compare the generated code just in case.

        f1(maxdel,N,b0,aN) = (+ <: de.delay(maxdel,N-1),_) ~ *(-aN) : !,*(b0);
        f2(maxdel,N,b0,aN) = + ~ -aN * de.delay(maxdel,N-1) : *(b0);

Current implementation:

        process = f1(10,10, .3, .7);

compiles to

        float fVec0[10];
        float fRec0[2];
        int fSampleRate;

        void compute(int count, FAUSTFLOAT** inputs, FAUSTFLOAT** outputs)
        {
                FAUSTFLOAT* input0 = inputs[0];
                FAUSTFLOAT* output0 = outputs[0];
                for (int i0 = 0; i0 < count; i0 = i0 + 1) {
                        float fTemp0 = float(input0[i0]) - 0.7f * fRec0[1];
                        fVec0[0] = fTemp0;
                        fRec0[0] = fVec0[9];
                        float fRec1 = fTemp0;
                        output0[i0] = FAUSTFLOAT(0.3f * fRec1);
                        for (int j0 = 9; j0 > 0; j0 = j0 - 1) {
                                fVec0[j0] = fVec0[j0 - 1];
                        }
                        fRec0[1] = fRec0[0];
                }
        }

while

        process = f2(10,10, .3, .7);

compiles to

        float fRec0[11];
        int fSampleRate;

        void compute(int count, FAUSTFLOAT** inputs, FAUSTFLOAT** outputs)
        {
                FAUSTFLOAT* input0 = inputs[0];
                FAUSTFLOAT* output0 = outputs[0];
                for (int i0 = 0; i0 < count; i0 = i0 + 1) {
                        fRec0[0] = float(input0[i0]) - 0.7f * fRec0[10];
                        output0[i0] = FAUSTFLOAT(0.3f * fRec0[0]);
                        for (int j0 = 10; j0 > 0; j0 = j0 - 1) {
                                fRec0[j0] = fRec0[j0 - 1];
                        }
                }
        }

and to me f2() certainly looks more readable than f1().

Thanks,

Oleg.



_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to