// adaptive filter : identification
//
//            +---+ d
//       +--->| h +---+
//       |    +---+   |
//       |            v +
//  x ---+      ^    (+)---+---> e
//       |      |     ^ -  |
//       |    +---+   |    |
//       +--->| w +---+    |
//            +---+ y      |
//              |          |
//              +----------+

clear;
stacksize('max');

DATLEN=100000;                     // simulation data length
FLTLEN=100;                        // filter length
MU=0.001;                          // step size parameter

rand('normal');                    // Gaussian noise mode
indata=rand(1:DATLEN)/5;           // generate noise
//indata=loadwave('male.wav');     // male voice
//indata=loadwave('female.wav');   // female voice
if length(indata)<DATLEN 
  DATLEN=length(indata);
end
outdata=zeros(1:DATLEN);

h=rand(1:FLTLEN).*(0.97^(1:FLTLEN));
scf(0);
clf;
plot2d(h, style=2);

xbuf=zeros(1:FLTLEN);
w=zeros(1:FLTLEN);

for i=1:DATLEN
    
  x=indata(i);
  
  xbuf=[x, xbuf(1:FLTLEN-1)];
  d=xbuf*h';
  y=xbuf*w';
  e=d-y;
  w=w+2*MU*e*xbuf;
  
  outdata(i)=e;
    
end

scf(0);
plot2d(w, style=5);

scf(1);
clf;
plot2d(outdata);

scf(2);
clf;
plot2d(10*log10(outdata^2+1e-9));



