60 lines
1.2 KiB
Text
60 lines
1.2 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 (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>>;
|