• An easy Adaptative Filter for our projects

    06/10/2020 at 14:59 0 comments


    Well when you are reading a sensor, but that sensor, has some kind of craziness, We can built a Adaptative Filter like the next program. The proyect and the source code are on that, but you remember this equiation:

    The famous linear regression equation that is, i know so beautiful, because it's amazing, but for our proposes are good that you know it. I let the link if you want to play with that equitation and understand the principal points.

    https://www.geogebra.org/calculator/gwhbzrrz

    So taking this equation we can see some topics of machine learning that says:

    \color{White} \large e(w,input)=1/2(y-h(w,input))^2

    The algorithm tries to understand the data like a linear regression something the data, and learning of the sensor, for this example, are trying to follow the response of an AC signal, we can make the prediction with another consideration, using the formula with Noise, and training the system to reach that signal, that can be mean, Learning Supervised, or only letting to discover the relationship, Unsupervised. Like the another code

    #include <iostream>
    #include <math.h>
    #include <stdlib.h> 
    #include <time.h> 
    //What number of elements do you want 
    #define BackFilter 10
    //What will your Learning parameter
    #define LearningParameter 0.1
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    
    class FiltroInteligente{
    	//We have three variables with all the information
    	float Vin[BackFilter]; //Input values
    	float Kca[BackFilter]; //K parameters
    	float Pro[BackFilter]; //=inputs * K parameters
    	//Method to clean the vectors
    	void ClearData(){
    		for(int i=0; i<BackFilter;i++)	{
    			Vin[i]=0;
    			Pro[i]=0;
    		}
    	}
    	//Limpieza del vector de datos
    	void ClearProd(){
    		for(int i=0; i<BackFilter;i++)	{
    			Pro[i]=0;
    		}
    	}
    	//Funcion para predecir los datos
    	public: 
    	float Result=0;
    	float Wantted=0;
    	float ErrorN=0;
    	float ErrorS=0;
    	//Randomize K
    	void RandomizeK(){
    		for(int i=0; i<BackFilter;i++)	{
    			Kca[i]=rand()%BackFilter;
    	 	}
    	}
    	// Make the operacion of Result=sum(Vin*Kpar) Remeber that Vin and Kpar are vectors
    	void ProductoYPrecedir(){
    		Result=0;
    		for(int i=0; i<BackFilter;i++)	{
    			Pro[i]=Vin[i]*Kca[i];
    			Result=Pro[i]+Result;
    	 	}
    	}
    	//Initialize the class
    	void Initialize(){
    		ClearData();
    		RandomizeK();
    		Vin[BackFilter-1]=1; //La ultima posicion es el desface llamada Beta
    	}
    	//Print my data of learning
    	void PrintMySavedData(){
    		printf("Saved:\t");
    		for(int i=0; i<BackFilter;i++)	{
    			printf("%3.3f\t",Vin[i]);
    	 	}
    	 	printf("\nK:\t");
    		for(int i=0; i<BackFilter;i++)	{
    			printf("%3.3f\t",Kca[i]);
    	 	}
    	}
    	//Insert an X value, remember the last position are 1 because
    	/*
    	y=mx+b
    	Where K are a vector that represents m
    	And Vin are a vector that represents x
    	But the b can be absorbed with
    	[x1,x2,x3,...] point [k1,k2,k3] +b => [x1,x2,x3,..,1] point [k1,k2,k3,b]
    	*/
    	void AddX(float Add){
    		for(int i=0; i<(BackFilter-1);i++)	{
    			Vin[i]=Vin[i+1];
    	 	}
    	 	Vin[BackFilter-2]=Add;
    	}
    	//This traing the model One Time
    	/*Using 
    		h(x)=mx+b
    		Where 
    		e=1/2*(y-h(x))^2
    		de/dk=(y-h(x))*(-Vin) //Remeber that y-h(x) is a number that will be multiplied by a vector
    		//(y-h(x))*(Vin) => This will be a vector
    		k(n)=k(n-1)+de/dk =>Remeber that k is a vector and de/dk also
    	*/
    	void TraingOnce(float WanttedData){
    		ProductoYPrecedir();
    		ErrorN=WanttedData-Result;
    		ErrorS=1/2*(ErrorN)*ErrorN;
    		for(int i=0; i<BackFilter;i++)	{
    			Kca[i]=Kca[i]+ErrorN*Vin[i]*LearningParameter;
    	 	}
    	}
    };
    //Signal of testing
    float Signal2Analize(float Time){
    	return sin(Time*3.14/180);
    }
    float SignalWithNoise(float Time){
    	return sin(Time*3.14/180)+0.2+sin(20*Time*3.14/180);
    }
    int main(int argc, char** argv) {
    	FiltroInteligente MyFilter;	
    	float TimeA=0;
    	float Signal=0;
    	MyFilter.Initialize();
    	bool OnlyOne=false;
    	int ConterMaxTraining=20;
    	srand (time(NULL));
    	//El ciclo es infinito
    	while(true){
    		Signal=Signal2Analize(TimeA);
    		MyFilter.ProductoYPrecedir();
    		printf("Prediction\n");
    		printf("Kn: %f \tSk: %f \tPredicted:%f",TimeA,Signal,MyFilter.Result);
    ...
    Read more »