滤波前的曲线
滤波后的曲线
滤波代码
/*
*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;
}