⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gyroscope_sdlg.cpp

📁 中值滤波加提升小波降噪方法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						n++;
						UpdateData(FALSE);	
						
					}//else
					break;
			case 1:
				if(m_num<32)
					{
						m_xGyro=str.Mid(1,6);
						m_xJiaG=str.Mid(7,6);
						m_xTemp=str.Mid(13,6);
						m_xBenchmark=str.Mid(19,6);

						m_yGyro=str.Mid(25,6);
						m_yJiaG=str.Mid(31,6);
						m_yTemp=str.Mid(37,6);
						m_yBenchmark=str.Mid(43,6);

						extern float gyroscope1[32],gyroscope2[32];
						gyroscope1[m_num]=atof(m_xGyro);
						gyroscope2[m_num]=atof(m_yGyro);
						
						m_num++;
						UpdateData(FALSE);
					}
				else
					{  
						m_xGyro=str.Mid(1,6);
						m_xJiaG=str.Mid(7,6);
						m_xTemp=str.Mid(13,6);
						m_xBenchmark=str.Mid(19,6);

						m_yGyro=str.Mid(25,6);
						m_yJiaG=str.Mid(31,6);
						m_yTemp=str.Mid(37,6);
						m_yBenchmark=str.Mid(43,6);

						
						fxGyro=atof(m_xGyro);
						fyGyro=atof(m_yGyro);
			
						extern float gyroscope1[32],gyroscope2[32];
						SYSTEMTIME t1,t2;
						GetSystemTime(&t1);               
						op1=TI_Denoise(gyroscope1);
						op2=TI_Denoise(gyroscope2);
						GetSystemTime(&t2);
						int ms;
						ms=t2.wMilliseconds-t1.wMilliseconds;
						strTime.Format("%d",ms);
						strT_xGyro.Format("%f",op1);
						strT_yGyro.Format("%f",op2);
						if(n<10)
						{
							m_xSourceSignal+=m_xGyro;
							m_xSourceSignal+="\r\n";
							m_xDenoiseSignal+=strT_xGyro;
							m_xDenoiseSignal+="\r\n";

							m_ySourceSignal+=m_yGyro;
							m_ySourceSignal+="\r\n";
							m_yDenoiseSignal+=strT_yGyro;
							m_yDenoiseSignal+="\r\n";

							m_time+=strTime;
							m_time+="\r\n";
						}
						else
						{
							m_xSourceSignal.Empty();
							m_xDenoiseSignal.Empty();
							m_xSourceSignal+=m_xGyro;
							m_xSourceSignal+="\r\n";
							m_xDenoiseSignal+=strT_xGyro;
							m_xDenoiseSignal+="\r\n";

							m_ySourceSignal.Empty();
					        m_yDenoiseSignal.Empty();
					        m_ySourceSignal+=m_yGyro;
					        m_ySourceSignal+="\r\n";
					        m_yDenoiseSignal+=strT_yGyro;
						    m_yDenoiseSignal+="\r\n";


							m_time.Empty();
							m_time+=strTime;
							m_time+="\r\n";
							n=0;
						}

						for(int j=0;j<31;j++)
						{	gyroscope1[j]=gyroscope1[j+1];
						    gyroscope2[j]=gyroscope2[j+1];
						}
						gyroscope1[31]=fxGyro;
						gyroscope2[31]=fyGyro;
						n++;
						UpdateData(FALSE);	
						
					}//else
					break;
			case 0:
				if(m_num<32)
					{
						m_xGyro=str.Mid(1,6);
						m_xJiaG=str.Mid(7,6);
						m_xTemp=str.Mid(13,6);
						m_xBenchmark=str.Mid(19,6);

						extern float gyroscope1[32];
						gyroscope1[m_num]=atof(m_xGyro);					
						
						m_num++;
						UpdateData(FALSE);
					}
				else
					{  
						m_xGyro=str.Mid(1,6);
						m_xJiaG=str.Mid(7,6);
						m_xTemp=str.Mid(13,6);
						m_xBenchmark=str.Mid(19,6);

						fxGyro=atof(m_xGyro);
			
						extern float gyroscope1[32];
						SYSTEMTIME t1,t2;
						GetSystemTime(&t1);               
						op1=TI_Denoise(gyroscope1);	
						GetSystemTime(&t2);
						int ms;
						ms=t2.wMilliseconds-t1.wMilliseconds;
						strTime.Format("%d",ms);
						strT_xGyro.Format("%f",op1);

						if(n<10)
						{
							m_xSourceSignal+=m_xGyro;
							m_xSourceSignal+="\r\n";
							m_xDenoiseSignal+=strT_xGyro;
							m_xDenoiseSignal+="\r\n";

							m_time+=strTime;
							m_time+="\r\n";
						}
						else
						{
							m_xSourceSignal.Empty();
							m_xDenoiseSignal.Empty();
							m_xSourceSignal+=m_xGyro;
							m_xSourceSignal+="\r\n";
							m_xDenoiseSignal+=strT_xGyro;
							m_xDenoiseSignal+="\r\n";

							m_time.Empty();
							m_time+=strTime;
							m_time+="\r\n";
							n=0;
						}

						for(int j=0;j<31;j++)
						{	
							gyroscope1[j]=gyroscope1[j+1];
						}
						gyroscope1[31]=fxGyro;
						n++;
						UpdateData(FALSE);	
						
					}//else
					break;
					
		}//switch
	}

}



float CGyroscope_sDlg::TI_Denoise(float signal[])
{
	int i,j,m,size=0;
	//初始化table[N][L+1]
	for(i=0;i<32;i++)
	{
		for(j=0;j<=4;j++)
		{
			if(0==j)
				table[i][j]=signal[i];
			else
				table[i][j]=0;
		}
	}

	//return table[31][0];
    //dwt
	
	for(i=1;i<=4;i++)
	{
		size=(32>>i);
		for(j=0;j<=(1<<i)-2;j=j+2)
		{
			for(m=0;m<size*2;m++)
			{
				signal[m]=table[size*j+m][0];
				temp[m]=table[size*j+m][0];
			}
            db4lift_dwt(signal,size);
			
			for(m=0;m<size;m++)
			{
				table[m+size*j][0]=signal[2*m];
				table[m+size*j][i]=signal[2*m+1];
			}

			db4lift_dwt(temp,size);

			for(m=0;m<size;m++)
			{
				table[(j+1)*size+m][0]=temp[2*m];
				table[(j+1)*size+m][i]=temp[2*m+1];
			}
			
		}
	}
	
	//Soft threshold denoising
	thresh_soft(table);

	//idwt
	for(i=4;i>=1;i--)
	{
		size=(32>>i);
		for(j=0;j<=(1<<i)-2;j=j+2)
		{
			for(m=0;m<size;m++)
			{
				signal[m]=table[j*size+m][0];
				signal[size+m]=table[j*size+m][i];
			}
			
			db4lift_idwt(signal,size);
            iadjust(signal,size);
			for(m=0;m<size;m++)
			{
				temp[m]=table[(j+1)*size+m][0];
				temp[size+m]=table[(j+1)*size+m][i];
			}

            db4lift_idwt(temp,size);

            iadjust(temp,size);

			for(m=0;m<size*2;m++)
			{
				table[size*j+m][0]=(signal[m]+temp[m])/2;
			}
		}
	}

	for(i=0;i<32;i++)
	{
		output[i]=table[i][0];
	}
	//return output[31];
	float outputR;
    outputR= flp(output);
	return outputR;

}

void CGyroscope_sDlg::db4lift_dwt(float processing[], int n)
{
	int i;
    for(i=0;i<n;i++)
	{
		processing[2*i]=processing[2*i]+1.732*processing[2*i+1];
	}

	for(i=0;i<n;i++)
	{
		if(0==i)
			processing[2*i+1]=processing[2*i+1]-0.433*processing[2*i]+0.067*processing[2*i+2];//
		else 
			processing[2*i+1]=processing[2*i+1]-0.433*processing[2*i]+0.067*processing[2*i-2];
	}

	for(i=0;i<n;i++)
	{
		if((n-1)!=i)
			processing[2*i]=processing[2*i]-processing[2*i+1+2];
		else
			processing[2*i]=processing[2*i]-processing[2*i+1-2];//
	}

	for(i=0;i<n;i++)
	{
		processing[2*i]=processing[2*i]*0.5176;
		processing[2*i+1]=processing[2*i+1]*1.932;
	}

}

void CGyroscope_sDlg::db4lift_idwt(float processing[], int n)
{
	int i;

	for(i=0;i<n;i++)
	{
		processing[i]=processing[i]/0.5176;
		processing[n+i]=processing[n+i]/1.932;
	}

	for(i=0;i<n;i++)
	{
		if((n-1)!=i)
			processing[i]=processing[i]+processing[n+i+1];
		else
			processing[i]=processing[i]+processing[n+i-1];//
	}

	for(i=0;i<n;i++)
	{
		if(0==i)
			processing[n+i]=processing[n+i]+0.433*processing[i]-0.067*processing[i+1];//
		else
			processing[n+i]=processing[n+i]+0.433*processing[i]-0.067*processing[i-1];

	}

	for(i=0;i<n;i++)
	{
		processing[i]=processing[i]-1.732*processing[n+i];
	}
}

void CGyroscope_sDlg::iadjust(float processing[], int n)
{
	int i;
	float t[32];
    for(i=0;i<n;i++)
	{
		t[i]=processing[n+i];
	}

	for(i=n-1;i>=0;i--)
	{
		
		processing[2*i]=processing[i];
		
	}

	for(i=0;i<n;i++)
	{
		processing[2*i+1]=t[i];
	}

}

void CGyroscope_sDlg::thresh_soft(float table[32][5])
{
	int i,j;
	float u;
	float thresh,sigma;
	//if(table>0)
//	{table=table;}
//	else
	//{table=-table;}
	
	sigma=median(table)/0.6745;
    
	for(i=1;i<=3;i++)
	{
		for(j=0;j<32;j++)
		{
		thresh=(3.6*sigma)/(log(j+1));//sqrt(2*log(N))*sigma;
        u=1/((table[j][i]-thresh)*(table[j][i]-thresh)+1);
			if(myfabs(table[j][i])<thresh)
				table[j][i]=0;
			else if(table[j][i]>=thresh)
				table[j][i]=table[j][i]-u*thresh;
			else 
				table[j][i]=table[j][i]+u*thresh;
		}
	}	

for(i=4;i<=4;i++)
	{
		for(j=0;j<32;j++)
		{
		thresh=(3.6*sigma)
        
			if(myfabs(table[j][i])<thresh)
				table[j][i]=0;
			else if(table[j][i]>=thresh)
				table[j][i]=table[j][i]-u*thresh;
			else 
				table[j][i]=table[j][i]+u*thresh;
		}
	}	



}

float CGyroscope_sDlg::median(float table[32][5])
{
	int i,j;
   float t=0;
   for(i=0;i<32;i++)
   {
   		temp[i]=myfabs(table[i][1]);
   }
   
   for(j=1;j<32;j++)
   {
	   for(i=0;i<32-j;i++)
	   {
		   if(temp[i]>temp[i+1])
		   {
			   t=temp[i];temp[i]=temp[i+1];temp[i+1]=t;
		   }
	   }
   }
   t=(temp[32/2-1]+temp[32/2])/2;
   
   return t;
}


float CGyroscope_sDlg::flp(float output[])
{
	int i,j;
float e,sum,thresh1,b;
float B[20],data_forecast[20];
double phi;

b = 1.0/20;
for(i=0 ; i<20 ; i++)  //初始权重
   {
    B[i] = b;
    }

phi = pow(10,-8);

for(i=0 ; i<32-20 ; i++)    //前向预测
   {
   sum = 0;
   for(j=0 ; j<20 ; j++)
      {
       data_forecast[j] = output[i+j]; 
       sum = sum + (B[j] * data_forecast[j]);
       }
   
   e=fabs((output[i+20])-sum);
   if (e<0.1*output[20])
      {
       phi=0.99*phi;
       }
      
   thresh1 = phi*e;       
   for(j=0;j<20;j++)               //更新权重
      {
       B[j] = B[j] + thresh1*data_forecast[j];
       }
     
     output[i]=sum;                //滤波后的输出信号
    }
    return output[31];

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -