#include<iostream>
#include<iomanip>
#include<cmath>
#include <cstdlib>
using namespace std;
#define mu 0.2f //convergence rate
#define M 5 //order of filter
#define I 1000 //number of samples
double Input[I] = { 0.0 };
double Desired[I] = { 0.0 };
//double H[M] = { 1, 0.5, 0.25, 0.125, 0.0625 }; //the main system
double H[M] = { 0.0625, 0.125, 0.25, 0.5, 1 }; //we need inverse of main system to convolution
void initialize()
{
for (int i = 0; i < I; i++)
Input[i] = rand() / (float)RAND_MAX;
for (int i = 0; i < I; i++)
for (int j = 0; j < M; j++)
if (i - j >= 0)
Desired[i] += Input[i - j] * H[j];
}
int main()
{
initialize();
long T, n = 0;
double D, Y, E;
double W[M] = { 0.0 };
double X[M] = { 0.0 };
FILE *Y_out=NULL, *error=NULL, *weights=NULL;
#define _CRT_NONSTDC_NO_WARNINGS Y_out = fopen("Y_OUT", "w++"); //file for output samples
#define _CRT_NONSTDC_NO_WARNINGS error = fopen("ERROR", "w++"); //file for error samples
#define _CRT_NONSTDC_NO_WARNINGS weights = fopen("WEIGHTS", "w++"); //file for weights samples
for (T = 0; T < I; T++)
{
for (int m = T; m > T - M; m--) {
if (m >= 0)
X[M + (m - T) - 1] = Input[m]; //X new input sample for
//LMS filter
else break;
}
D = Desired[T]; //desired signal
Y = 0; //filter’output set to zero
for (int i = 0; i < M; i++)
Y += (W[i] * X[i]); //calculate filter output
E = D - Y; //calculate error signal
for (int i = 0; i < M; i++)
W[i] = W[i] + (mu * E * X[i]); //update filter coefficients
fprintf(Y_out, "\n % 10g % 10f", (float)T, Y);
fprintf(error, "\n % 10g % 10f", (float)T, E);
}
for (int i = 0; i < M; i++)
fprintf(weights, "\n % 10d % 10f", i, W[i]);
fclose(Y_out);
fclose(error);
fclose(weights);
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGlvbWFuaXA+CiNpbmNsdWRlPGNtYXRoPgojaW5jbHVkZSA8Y3N0ZGxpYj4gCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKI2RlZmluZSBtdSAwLjJmCQkJCS8vY29udmVyZ2VuY2UgcmF0ZQojZGVmaW5lIE0gNQkJCQkJLy9vcmRlciBvZiBmaWx0ZXIKI2RlZmluZSBJIDEwMDAJCQkJLy9udW1iZXIgb2Ygc2FtcGxlcwoKZG91YmxlIElucHV0W0ldID0geyAwLjAgfTsKZG91YmxlIERlc2lyZWRbSV0gPSB7IDAuMCB9OwoKLy9kb3VibGUgSFtNXSA9IHsgMSwgMC41LCAwLjI1LCAwLjEyNSwgMC4wNjI1IH07CS8vdGhlIG1haW4gc3lzdGVtCgpkb3VibGUgSFtNXSA9IHsgMC4wNjI1LCAwLjEyNSwgMC4yNSwgMC41LCAxIH07CQkvL3dlIG5lZWQgaW52ZXJzZSBvZiBtYWluIHN5c3RlbSB0byBjb252b2x1dGlvbgoKCgp2b2lkIGluaXRpYWxpemUoKQp7Cglmb3IgKGludCBpID0gMDsgaSA8IEk7IGkrKykKCQlJbnB1dFtpXSA9IHJhbmQoKSAvIChmbG9hdClSQU5EX01BWDsKCglmb3IgKGludCBpID0gMDsgaSA8IEk7IGkrKykKCQlmb3IgKGludCBqID0gMDsgaiA8IE07IGorKykKCQkJaWYgKGkgLSBqID49IDApCgkJCQlEZXNpcmVkW2ldICs9IElucHV0W2kgLSBqXSAqIEhbal07Cn0KCmludCBtYWluKCkKewoJaW5pdGlhbGl6ZSgpOwoKCWxvbmcgVCwgbiA9IDA7Cglkb3VibGUgRCwgWSwgRTsKCWRvdWJsZSBXW01dID0geyAwLjAgfTsKCWRvdWJsZSBYW01dID0geyAwLjAgfTsKCglGSUxFCSpZX291dD1OVUxMLCAqZXJyb3I9TlVMTCwgKndlaWdodHM9TlVMTDsKCgojZGVmaW5lIF9DUlRfTk9OU1REQ19OT19XQVJOSU5HUwlZX291dCA9IGZvcGVuKCJZX09VVCIsICJ3KysiKTsJCQkJLy9maWxlIGZvciBvdXRwdXQgc2FtcGxlcwoJCQkJCQkJCQkJCQkKI2RlZmluZSBfQ1JUX05PTlNURENfTk9fV0FSTklOR1MJZXJyb3IgPSBmb3BlbigiRVJST1IiLCAidysrIik7CQkJCS8vZmlsZSBmb3IgZXJyb3Igc2FtcGxlcwoJCQkJCQkJCQkJCQkKI2RlZmluZSBfQ1JUX05PTlNURENfTk9fV0FSTklOR1MJd2VpZ2h0cyA9IGZvcGVuKCJXRUlHSFRTIiwgIncrKyIpOwkJCS8vZmlsZSBmb3Igd2VpZ2h0cyBzYW1wbGVzCgoKCglmb3IgKFQgPSAwOyBUIDwgSTsgVCsrKQoJewoJCWZvciAoaW50IG0gPSBUOyBtID4gVCAtIE07IG0tLSkgewoJCQlpZiAobSA+PSAwKQoJCQkJWFtNICsgKG0gLSBUKSAtIDFdID0gSW5wdXRbbV07CS8vWCBuZXcgaW5wdXQgc2FtcGxlIGZvciAKCgkJCQkJCQkJCQkJCS8vTE1TIGZpbHRlcgoKCQkJZWxzZSBicmVhazsKCQl9CgoJCUQgPSBEZXNpcmVkW1RdOwkJCQkJLy9kZXNpcmVkIHNpZ25hbAoKCQlZID0gMDsJCQkJCQkvL2ZpbHRlcuKAmW91dHB1dCBzZXQgdG8gemVybwoKCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspCgkJCVkgKz0gKFdbaV0gKiBYW2ldKTsJCQkvL2NhbGN1bGF0ZSBmaWx0ZXIgb3V0cHV0CgoKCQlFID0gRCAtIFk7CQkJCQkvL2NhbGN1bGF0ZSBlcnJvciBzaWduYWwKCgoJCWZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKQoJCQlXW2ldID0gV1tpXSArIChtdSAqIEUgKiBYW2ldKTsJCS8vdXBkYXRlIGZpbHRlciBjb2VmZmljaWVudHMKCgoJCWZwcmludGYoWV9vdXQsICJcbiAlIDEwZyAlIDEwZiIsIChmbG9hdClULCBZKTsKCQlmcHJpbnRmKGVycm9yLCAiXG4gJSAxMGcgJSAxMGYiLCAoZmxvYXQpVCwgRSk7Cgl9CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspCgkJZnByaW50Zih3ZWlnaHRzLCAiXG4gJSAxMGQgJSAxMGYiLCBpLCBXW2ldKTsKCglmY2xvc2UoWV9vdXQpOwoJZmNsb3NlKGVycm9yKTsKCWZjbG9zZSh3ZWlnaHRzKTsKfQ==