Along these lines, we could have a more efficient impulse as well.  We
presently use this all over the place:

process = 1-1';
=>
for (int i = 0; (i < count); i = (i + 1)) {
  iVec0[0] = 1;
  output0[i] = FAUSTFLOAT((1 - iVec0[1]));
  iVec0[1] = iVec0[0];
}

On Fri, Feb 15, 2019 at 3:30 AM Oleg Nesterov <o...@redhat.com> wrote:
>
> On 02/01, Romain Michon wrote:
> >
> > We're working on a better solution,
>
> Yes, it would be nice to have the ability to initialize delay lines.
> And reset/re-initialize too, think of goertzel() from analyzers.lib.
>
> > initState((init)) = R(0,init)
> > with{
> >   R(n,(initn,init)) = +(initn : ba.impulsify@n) : R(n+1,init);
> >   R(n,initn) = +(initn : ba.impulsify@n);
> > };
> >
> > osc(m,k,z,x0,x1) = equation
> > with{
> >   A = 2 - (k + z)/m;
> >   B = z/m - 1;
> >   C = 1/m;
> >   equation = x
> > letrec{
> >     'x = A*(x : initState(x0)) + B*(x' : initState(x1)) + *(C);
>
> Hmm. I don't understand ...
>
> Consider osc(m,k,z, 100, 200). At the first "tick" everything looks correct,
>
>         (x : initState(x0))     == 100
>         (x' : initState(x1))    == 200
>
> but at the 2nd tick (x' : initState(x1)) will be zero, not 100?
>
> Shouldn't osc() use B*(x' : initState((x1,x0))) instead ?
>
> -------------------------------------------------------------------------------
> can't resist... this could be trivially implemented in fpp. But since attach()
> is broken, zinit() below has some nasty limitations.
>
> So,
>         zinit(z) = _ <: +(zinit(z)) with {
>                 zinit = FPP(z{}, x[outputs(z)]) eval int {
>                 init:   $z.for(i, v, $x[i + 1] = v);
>                 exec:   0;
>                 };
>         };
>
> simply initializes the signal's delay line. Now, osc() can be implemented as
>
>         osc(m,k,z,x0,x1) = equation : zinit((x0,x1)) with {
>                 A = 2-(k+z)/m;
>                 B = z/m-1;
>                 C = 1/m;
>                 equation = x letrec {
>                         'x = A*x + B*x' + *(C);
>                 };
>         };
>
> Say,
>
>         process = osc(10,3,2, 100,200);
>
> compiles to
>
>         virtual void instanceConstants(int samplingFreq) {
>                 fSamplingFreq = samplingFreq;
>
>                 fRec0[1] = 100; fRec0[2] = 200;
>         }
>
>         virtual void compute(int count, FAUSTFLOAT** inputs, FAUSTFLOAT** 
> outputs) {
>                 FAUSTFLOAT* input0 = inputs[0];
>                 FAUSTFLOAT* output0 = outputs[0];
>                 for (int i = 0; (i < count); i = (i + 1)) {
>                         fRec0[0] = (((1.5f * fRec0[1]) + (0.100000001f * 
> float(input0[i]))) - (0.800000012f * fRec0[2]));
>                         output0[i] = FAUSTFLOAT((fRec0[0] + 0));
>                         fRec0[2] = fRec0[1];
>                         fRec0[1] = fRec0[0];
>                 }
>         }
>
> as you can see the run-time code is not penalized, zinit() does
>
>                 fRec0[1] = 100; fRec0[2] = 200;
>
> at startup time.
>
> Oleg.
>
>
>
> _______________________________________________
> Faudiostream-users mailing list
> Faudiostream-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/faudiostream-users



-- 

Julius O. Smith III <j...@ccrma.stanford.edu>
Professor of Music and, by courtesy, Electrical Engineering
CCRMA, Stanford University
http://ccrma.stanford.edu/~jos/


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

Reply via email to