77 lines
1.7 KiB
Text
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
|
|
|