FBFXLMS Algorithm - Random Noise Cancellation
#define taps 8
#define Hz 0.763
#define mu 8e-3
#define Pz 0.817
#define Fz 0.137
void main()
{
float c[taps], d[taps], y[taps], x1[taps],
x[taps], w[taps];
float xn, un, fn, yn=0, rn, sn, en, e_n, j,
val;
int reg[14] = { 0,1, 0,0,0,0, 0,1,0,0, 0,1,0,1
};
int i, k, shift, value=0;
clrscr();
for( i=0; i<taps; i++ )
x1[i] = w[i]
= x[i] = c[i] = y[i] = d[i] = 0;
for( i=0; i<200; i++ )
{
shift = (reg[0]
^ reg[2]) ^ (reg[9] ^ reg[11]);
for( k=13; k>0;
k-- )
reg[k] = reg[k-1];
reg[0] = shift;
for( k=13; k>=0;
k-- )
value += reg[k] * pow( 2, k );
value = value
- 8192;
yn = 5.0/8192
* value;
value = 0;
en = Hz * yn;
xn = Fz * yn;
for( k=taps-1;
k>0; k-- )
y[k] = y[k-1];
y[0] = yn;
rn = 0;
for( k=0; k<taps;
k++ )
rn += c[k] * y[k];
e_n = en - rn;
for( k=0; k<taps;
k++ )
c[k] = c[k] + ( mu * e_n * y[k] );
sn=0;
for( k=0; k<taps;
k++ )
sn += d[k] * y[k];
fn = xn - sn;
for( k=0; k<taps; k++ )
d[k] = d[k] + ( mu * fn * y[k] );
}
for( i=0; i<taps; i++ )
y[i] = 0;
for( i=0; i<300; i++ )
{
shift = (reg[1]
^ reg[3]) ^ (reg[10] ^ reg[12]);
for( k=13; k>0;
k-- )
reg[k] = reg[k-1];
reg[0] = shift;
for( k=13; k>=0;
k-- )
value += reg[k] * pow( 2, k );
value = value
- 8192;
un = (5.0/8192 * value) + (yn * Fz);
for( k=taps-1;
k>0; k-- )
x[k] = x[k-1];
sn=0;
for( k=0; k<taps;
k++ )
sn += d[k] * y[k];
x[0] = un - sn;
en = Hz*Pz*x[0];
for( k=taps-1;
k>0; k-- )
x1[k] = x1[k-1];
x1[0] = 0;
for( k=0; k<taps;
k++ )
x1[0] += c[k] * x[k];
yn = 0;
for( k=0; k<taps;
k++ )
yn += w[k] * x[k];
rn = yn*Hz;
for( k=taps-1;
k>0; k-- )
y[k] = y[k-1];
y[0] = yn;
e_n = en + rn;
for( k=0; k<taps;
k++ )
w[k] = w[k] - ( mu * e_n * x1[k] );
printf( "%.2f\n", e_n );
value = 0;
}
}