VIANC/pw_plugin/dsp.lus

77 lines
1.7 KiB
Text

node FIR_proto(x : real; h : real)
returns (delay: real; val: real);
let
delay = 0.0 -> pre x;
val = x * h;
tel
node FIR<<const n : int>>(x : real; h : real^n)
returns (y : real);
var tmp : real^n;
var d : real;
let
(d, tmp) = fillred<<FIR_proto; n>>(x, h);
y = red<<+, n>>(0.0, tmp);
tel
node delay_chain(x : real)
returns (delay : real; val: real);
let
delay = 0.0 -> pre x;
val = x;
tel
node delayed_array<< const n : int>>(x : real)
returns (y : real^n);
var d : real;
let
(d, y) = fill<<delay_chain, n>>(x);
tel
function power_acc(p : real; s : real)
returns (pp : real);
let
pp = p + s*s;
tel
function scalar_mult(c : real; x : real)
returns (prop: real; y : real)
let
y = x * c;
prop = c;
tel
node NLMS_FIR<< const n : int>>(ref : real; x : real; mu : real)
returns (e : real; h : real^n);
var delayed : real^n;
--var h : real^n;
var stepsize : real;
var currstep : real^n;
var y : real;
let
h = (0. ^ n) -> map<<+, n>>(pre h, pre currstep);
y = FIR<<n>>(ref, h);
e = x - y;
delayed = delayed_array<<n>>(ref);
(stepsize, currstep) = fillred<<scalar_mult, n>>(mu * e / red<<power_acc, n>>(1e-9, delayed), delayed);
tel
node VD_wrapper<< const n : int >>(ref : real; x : real; mu : real; e : real; force : bool)
returns (y : real; h : real^n; count : int);
let
count = 0 -> if (pre count) > 0 then (pre count) - 1 else (
if( red<<power_acc, 10>>(0.0, delayed_array<<10>>(pre y)) >= 16.0 * e * 10.0)
then 3600 else 0);
y, h = NLMS_FIR<<n>>(ref,x, if (count > 0) and not force then 0.0 else mu);
tel
node EchoCancel = VD_wrapper<<256>>;
node pll<< const f0 : real >>(s : real)
returns (phi : real; freq : real)
let
freq = f0 -> 0.999 * (pre freq) + (1 - 0.999) * (s * sin(pre phi));
tel