VIANC/pw_plugin/dsp.lus

60 lines
1.2 KiB
Text
Raw Normal View History

2025-01-27 09:58:36 +01:00
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 (y : real; h : real^n);
var delayed : real^n;
--var h : real^n;
var stepsize : real;
var currstep : real^n;
var e : 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>>(0.0, delayed), delayed);
tel
node EchoCancel = NLMS_FIR<<2>>;