滑动平均滤波

滤波前的曲线

滤波后的曲线

滤波代码


/*
*arg1:原始数据
*arg2:滑动平均滤波计算平均值时所取得点数,点数越到越失真
*arg3:原始数据大小
*arg4:平滑后的数据
*/
static void Smooth(float *rawData, int pointsOfWindow, int dataLen, float *processData)
{
	int N = pointsOfWindow;
	int size = dataLen;
    float Sum1=0;
    for(int j=0;j<size;j++)
    {
        //if(j<N/2)
        //{
        //    for(int k=0;k<N;k++)
        //    {
        //        Sum1+=rawData[j+k];
        //    }
        //   processData[j]=Sum1/N;
        //}
        //else
        //  if(j<size -N/2)
            if(j<size-N)
            {
                //for(int k=0;k<N/2;k++)
                for(int k=0;k<N;k++)
                {
                    //Sum1+=(rawData[j+k]+rawData[j-k]);
                      Sum1+=rawData[j+k];
                }
                processData[j]=Sum1/N;
            }
            else
            {
                for(int k=0;k<size-j;k++)
                {
                    Sum1+=rawData[j+k];
                }
                for(int k=0;k<(N-size+j);k++)
                {
                    Sum1+=rawData[j-k];
                }
                processData[j]=Sum1/N;
            }
        Sum1=0;
    }
}

/*
Function1、平滑阻抗和相位并返回平滑后的阻抗和相位
Function2、保存原始的阻抗和相位到rawData.txt,只保留最近一次的数据
arg1:原始阻抗数据
arg2:原始相位数据
arg2:平滑的点数
arg3:数据个数
arg4:处理后的阻抗数据
arg5:处理后的相位数据
*/
static void SmoothImpedanceAndPhase(float *rawFreqData, float *rawImpedanceData, float *rawPhaseData, 
									int pointsOfWindow, int dataLen, 
									float *processImpedanceData, float *processPhaseData)
{
	FILE *fp = fopen("./rawData.txt", "w");
	if(fp == NULL)	MessagePopup("Tips", "写数据时打开文件出错0");
	Smooth(rawImpedanceData, pointsOfWindow, dataLen, processImpedanceData);//平滑阻抗
	Smooth(rawPhaseData, pointsOfWindow, dataLen, processPhaseData);//平滑相位
	for(int i = 0;i<dataLen;i++)
	{
		//processData_Im[i] =processData_impedance[i] * sin(processData_phase[i] * 3.1415926535 / 180);
		//processData_Re[i] =processData_impedance[i] * cos(processData_phase[i] * 3.1415926535 / 180);
		fprintf(fp, "%.5f\t%.5f\t%.5f\n",rawFreqData[i], rawImpedanceData[i], rawPhaseData[i]);//保存原始数据到可执行程序目录下,以备查看
	}
	fclose(fp);
}


int CVICALLBACK RunSmoothingCallback (int panel, int control, int event,
									  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_LEFT_CLICK_UP:
			FILE *fp = fopen("./rawData.txt", "w");
			if(fp == NULL)	MessagePopup("Tips", "写数据时打开文件出错0");
			float processData_impedance[260];
			float processData_phase[260];
			float processData_Im[260];
			float processData_Re[260];
			unsigned char ctrlVal = 0;
			GetCtrlVal(panel, SMOOTHINGP_RING, &ctrlVal);   //Points of Window
			Smooth(cdc_Data.myImpedance, ctrlVal, cdc_Data.pointsNum, processData_impedance);//平滑阻抗
			Smooth(cdc_Data.myPhase, ctrlVal, cdc_Data.pointsNum, processData_phase);//平滑相位
			for(int i = 0;i<cdc_Data.pointsNum;i++)
			{
				processData_Im[i] = -processData_impedance[i] * sin(processData_phase[i] * 3.1415926535 / 180);
				processData_Re[i] =processData_impedance[i] * cos(processData_phase[i] * 3.1415926535 / 180);
				fprintf(fp, "%.5f\t%.5f\t%.5f\n",cdc_Data.freq[i], cdc_Data.myImpedance[i], cdc_Data.myPhase[i]);//保存原始数据到可执行程序目录下,以备查看
			}
			fclose(fp);
			
			GraphInit(hGraphDispPanel, 0, 1,cdc_Data.pointsNum,&Graph1);
			DeleteGraphPlot (hGraphDispPanel, GRAPHDISP_GRAPH1, -1, VAL_IMMEDIATE_DRAW);//Delete a painting from a drawing
			GraphDeinit(&Graph1);
			SetAxisScalingMode(hGraphDispPanel, GRAPHDISP_GRAPH1, VAL_LEFT_YAXIS, VAL_AUTOSCALE, 0,0);
			SetAxisScalingMode(hGraphDispPanel, GRAPHDISP_GRAPH1, VAL_BOTTOM_XAXIS, VAL_AUTOSCALE, 0,0); 
			Graph1.plotHandle=PlotXY(hGraphDispPanel, GRAPHDISP_GRAPH1, processData_Re, processData_Im, cdc_Data.pointsNum, VAL_FLOAT, VAL_FLOAT,
									Graph1.pCurveArray->pCurveAttr->plotStyle,
									Graph1.pCurveArray->pCurveAttr->pointStyle,
									Graph1.pCurveArray->pCurveAttr->lineStyle, 1,
									Graph1.pCurveArray->pCurveAttr->lineColor);
			break;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值