E015.D.011-FXLS90230/Drivers/BSP/DataProcess.c

324 lines
11 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "DataProcess.h"
GetDataValue MeasurementData_Nearbit; //½ü¶Ë²âÁ¿Öµ
GetDataValue MeasurementData_Farbit; //Ô¶¶Ë²âÁ¿Öµ
//»ñµÃÈ¨ÖØ·¶Î§
void get_weights_scores_range(GetFeatureValue* feature)
{
// Ìî³ä weights_normal
float weights_normal[ROWS][COLS_NORMAL] = {
{0.02536112373147522f,0.05512614321141711f,0.14267535646902674f,0.16133346206755558f,0.10950333816620461f},
{0.022501814070676942f,0.04732276804576742f,0.04194724344174091f,0.02621574442760558f,0.047215370581991545f},
{0.018003586497350618f,0.0431656287153646f,0.07865669397927093f,0.017026200202278845f,0.003652478376425392f},
{0.32024982967117427f,0.035535672541306684f,0.031030858413814488f,0.24429833563710904f,0.09967948230006361f},
{0.029334689721561346f,0.02969550083218594f,0.09925900579103232f,0.029629006919347025f,0.4357667452203222f},
{0.05787595533854885f,0.01554478121686156f,0.028520717142108763f,0.07200373575215642f,0.0006793460069581621f},
{0.11164004553402096f,0.021488846081792058f,0.027015323736423267f,0.06835601650464118f,0.06507896606999451f},
{0.03512378851112017f,0.04353279811744198f,0.02353244436926462f,0.11985817699670917f,0.026400101174232783f},
{0.0679031765133709f,0.015229294191235638f,0.02114050815724666f,0.047639082979661976f,0.04478038713658755f},
{0.1406890147631353f,0.1880250839886159f,0.20847554840928026f,0.0810319935793325f,0.04348556994313417f},
{0.03156489452065363f,0.022497648211455456f,0.07162434867943443f,0.035050436098907636f,0.013979034047182124f},
{0.016102335088496025f,0.015524545028903453f,0.0472261768209504f,0.024201430458576385f,0.05320423374249968f},
{0.02532395637816995f,0.13180297364581464f,0.05950058091445133f,0.0459745429704959f,0.031178515883672587f},
{0.02299058880568741f,0.2719675224112871f,0.09280615745629113f,0.015702128841647265f,0.008980547313484886f},
{0.07533520085455829f,0.06354079376055055f,0.026589036219663745f,0.011679706563975762f,0.01641588403724634f}
};
// Ìî³ä weights_abnormal
// Ìî³ä±ê×¼·ÖÊý
float std_scores_normal[COLS_NORMAL] = {4.426009220352611f,1.0100249366124394f,1.229524185950373f,2.5243247379778886f,1.8966734702247467f};
// Ìî³ä·¶Î§Öµ
float range_values[COLS_NORMAL] = {0.14035106713875936f,0.07188706493959258f,0.34388788541653376f,0.6280178217431671f,0.30525313799525955f};
// Ìî³ä×îСºÍ×î´óÖµ
float min_values[ROWS] = {
0.0f, // ѹÁ¦²îÖµ×îСֵ
0.0f, // ÄÚѹÄÜÁ¿×îСֵ
0.0f, // ÍâѹÄÜÁ¿×îСֵ
0.0f, // ×êѹ¾ùÖµ×îСֵ
0.0f, // ×êѹ·ù¶È×îСֵ
0.0f, // ×êѹ·½²î×îСֵ
0.0f, // Ť¾Ø¾ùÖµ×îСֵ
0.0f, // Ť¾Ø·ù¶È×îСֵ
0.0f, // Ť¾Ø·½²î×îСֵ
0.0f, // תËÙ¾ùÖµ×îСֵ
0.0f, // תËÙ·ù¶È×îСֵ
0.0f, // תËÙ·½²î×îСֵ
0.0f, // XÕñ¶¯ÑÏÖØÐÔ×îСֵ
0.0f, // YÕñ¶¯ÑÏÖØÐÔ×îСֵ
0.0f // ZÕñ¶¯ÑÏÖØÐÔ×îСֵ
};
float max_values[ROWS] = {
10.0f, // ѹÁ¦²îÖµ×î´óÖµ
5.0f, // ÄÚѹÄÜÁ¿×î´óÖµ
5.0f, // ÍâѹÄÜÁ¿×î´óÖµ
155.0f, // ×êѹ¾ùÖµ×î´óÖµ
50.0f, // ×êѹ·ù¶È×î´óÖµ
100.0f, // ×êѹ·½²î×î´óÖµ
10.0f, // Ť¾Ø¾ùÖµ×î´óÖµ
20.0f, // Ť¾Ø·ù¶È×î´óÖµ
100.0f, // Ť¾Ø·½²î×î´óÖµ
120.0f, // תËÙ¾ùÖµ×î´óÖµ
30.0f, // תËÙ·ù¶È×î´óÖµ
3150.0f, // תËÙ·½²î×î´óÖµ
5.0f, // XÕñ¶¯ÑÏÖØÐÔ×î´óÖµ
5.0f, // YÕñ¶¯ÑÏÖØÐÔ×î´óÖµ
5.0f // ZÕñ¶¯ÑÏÖØÐÔ×î´óÖµ
};
// ½«Êý¾Ý¸³Öµµ½½á¹¹Ìå
for (int i = 0; i < ROWS; i++) {
feature->min_values[i] = min_values[i];
feature->max_values[i] = max_values[i];
for (int j = 0; j < COLS_NORMAL; j++) {
feature->weights_normal[i][j] = weights_normal[i][j];
}
}
for (int i = 0; i < COLS_NORMAL; i++) {
feature->std_scores_normal[i] = std_scores_normal[i];
feature->range_values[i] = range_values[i];
}
}
// ¹éÒ»»¯Êý¾Ý
void normalize_data(float* data, float* min_values, float* max_values, float* data_nor, int size)
{
for (int i = 0; i < size; i++) {
data_nor[i] = 1 + 9 * (data[i] - min_values[i]) / (max_values[i] - min_values[i]);
}
}
// ¾ØÕó³Ë·¨£º½á¹û¾ØÕó = Êý¾ÝÏòÁ¿ ¡Á È¨ÖØ¾ØÕó
void matrix_multiply(float* data, float weights[ROWS][COLS_NORMAL], float* result, int rows, int cols)
{
for (int i = 0; i < cols; i++) {
result[i] = 0.0f;
for (int j = 0; j < rows; j++) {
result[i] += data[j] * weights[j][i];
}
}
}
// ¼ÆËãÏà¶ÔÎó²î
float relative_error(float value, float standard) {
return fabs((value - standard) / standard);
}
// ÅжÏÂß¼­
int Zuanjin_weights_judge(float* data, GetFeatureValue* dataFeature) {
float data_nor[ROWS];
normalize_data(data, dataFeature->min_values, dataFeature->max_values, data_nor, ROWS);
// ¼ÆËã normal µÄ·ÖÊý
float scores_normal[COLS_NORMAL];
matrix_multiply(data_nor, dataFeature->weights_normal, scores_normal, ROWS, COLS_NORMAL);
float min_error = 1000000;
int con_index = -1;
// ¼ÆËã×îСÏà¶ÔÎó²î
for (int i = 0; i < COLS_NORMAL; i++) {
float error = relative_error(scores_normal[i], dataFeature->std_scores_normal[i]);
if (error < min_error) {
min_error = error;
con_index = i;
}
}
float con_value = scores_normal[con_index];
float range_normal = dataFeature->range_values[con_index];
float value_big = dataFeature->std_scores_normal[con_index] * (1 + range_normal);
float value_small = dataFeature->std_scores_normal[con_index] * (1 - range_normal);
// ¼ì²éÊÇ·ñÔÚ·¶Î§ÄÚ
if (value_small < con_value && con_value < value_big)
{
return con_index;
}
else
{
return -1;
}
}
unsigned char Get_MeasureData(GetDataValue DataValeNear) {
unsigned char Temp; //¹¤¿öÐÅÏ¢ÁÙʱ±äÁ¿
GetFeatureValue dataFeature;
get_weights_scores_range(&dataFeature);
float InPress = DataValeNear.Mean_InPress; //ÄÚѹƽ¾ùÖµ
float OutPress = DataValeNear.Mean_OutPress; //Íâѹƽ¾ùÖµ
float Mean_WOB = DataValeNear.Mean_WOB; //×êѹƽ¾ùÖµ
float Mean_Torque = DataValeNear.Mean_Torque; //Ť¾ØÆ½¾ùÖµ
float Mean_RPM = DataValeNear.Mean_RPM; //תËÙÆ½¾ùÖµ
float Mean_InTemprature = DataValeNear.Mean_InTemprature; //¹ÜÄÚÎÂ¶ÈÆ½¾ùÖµ
float Mean_OutTemprature = DataValeNear.Mean_OutTemprature; //»·¿ÕÎÂ¶ÈÆ½¾ùÖµ
float Different_Press = DataValeNear.Different_Press; //ѹÁ¦²îÖµ
float Energy_InPress = DataValeNear.Energy_InPress; //ÄÚѹÄÜÁ¿Öµ
float Energy_OutPress = DataValeNear.Energy_OutPress; //ÍâѹÄÜÁ¿Öµ
float Amplitude_WOB = DataValeNear.Amplitude_WOB; //×êѹ·ù¶ÈÖµ
float Variance_WOB = DataValeNear.Variance_WOB; //×êѹ·½²î
float Amplitude_Torque = DataValeNear.Amplitude_Torque; //Ť¾Ø·ù¶ÈÖµ
float Variance_Torque = DataValeNear.Variance_Torque; //Ť¾Ø·½²î
float Amplitude_RPM = DataValeNear.Amplitude_RPM; //תËÙ·ù¶ÈÖµ
float Variance_RPM = DataValeNear.Variance_RPM; //תËÙ·½²î
float Vibration_AxisX = DataValeNear.Vibration_AxisX; //XÖáÕñ¶¯ÑÏÖØÐÔ
float Vibration_AxisY = DataValeNear.Vibration_AxisY; //YÖáÕñ¶¯ÑÏÖØÐÔ
float Vibration_AxisZ = DataValeNear.Vibration_AxisZ; //ZÖáÕñ¶¯ÑÏÖØÐÔ
float Variance_Vibration = DataValeNear.Variance_Vibration; //Õñ¶¯·½²î
float data[15];
data[0] = Different_Press;
data[1] = Energy_InPress;
data[2] = Energy_OutPress;
data[3] = Mean_WOB;
data[4] = Amplitude_WOB;
data[5] = Variance_WOB;
data[6] = Mean_Torque;
data[7] = Amplitude_Torque;
data[8] = Variance_Torque;
data[9] = Mean_RPM;
data[10] = Amplitude_RPM;
data[11] = Variance_RPM;
data[12] = Vibration_AxisX;
data[13] = Vibration_AxisY;
data[14] = Vibration_AxisZ;
int con_result = Zuanjin_weights_judge(data, &dataFeature);
if (con_result == 0)
{
Temp = 'A';
};
if (con_result == 1)
{
Temp = 'B';
}
if (con_result == 2)
{
Temp = 'C';
}
if (con_result == 3)
{
Temp = 'D';
}
if (con_result == 4)
{
Temp = 'E';
}
if (con_result == -1)
{
Temp = 'F';
}
return Temp; // ·µ»Ø´¦Àí½á¹û
}
void DataCompute(void)
{
uint8_t i;
GetDataValue DataValeNear = {
.Mean_InPress = 0.f, //ÄÚѹƽ¾ùÖµ
.Mean_OutPress = 0.f, //Íâѹƽ¾ùÖµ
.Mean_WOB = 0.f, //×êѹƽ¾ùÖµ
.Mean_Torque = 2.399f,
.Mean_RPM = 4.293f,
.Mean_InTemprature = 22.74f,
.Mean_OutTemprature = 0.93f,
.Different_Press = 2.5f,
.Energy_InPress = 10.0f,
.Energy_OutPress = 8.5f,
.Amplitude_WOB = 5.0f,
.Variance_WOB = 0.8f,
.Amplitude_Torque = 2.3f,
.Variance_Torque = 1.0f,
.Amplitude_RPM = 150.0f,
.Variance_RPM = 2.5f,
.Vibration_AxisX = 0.1f,
.Vibration_AxisY = 0.15f,
.Vibration_AxisZ = 0.2f,
.Variance_Vibration = 0.05f
};
//½«½ÓÊÕµ½µÄÊý¾Ý¸³Öµ¸øÔËËã²ÎÊý
for(i = 0;i < DATALENG;i++)
{
DataValeNear.DataValue[i] = MeasurementData_Nearbit.DataValue[i];
}
unsigned char con_index = Get_MeasureData(DataValeNear);
// ´òÓ¡½á¹û
// printf("The integer is: %d\n", con_index);
UART_SendByte(con_index);
}
void Get_Data_Process(void)
{
if(g_Data.Tim1Count1sFlag)//¶¨Ê±±êÖ¾
{
//½ÓÊÕÍê³É±ê־Ϊ1,»òÕߵȴý³¬Ê±£¬·¢Ë͵ڶþ×éÊý¾Ý£¬Á½¸ö´®¿Ú·Ö±ðÅжÏ
if(g_Data.GetUart1OverFlag) //´®¿Ú1¿ÕÏÐ
{
switch(g_Data.Uart1SendCommendFlag)
{
case 0:
Send_Slave(1); //¶ÁÈ¡½ü¶Ë¹¤²ÎÊý¾Ý
g_Data.Uart1SendCommendFlag = 1;
g_Data.Uart1OverCount = 0; //³¬Ê±¼ÆÊ±±êÖ¾
g_Data.GetUart1OverFlag = 0; //µÈ´ý½ÓÊÕÍê³É
break;
case 1:
Send_Slave(2); //¶ÁÈ¡½ü¶Ë¹¤²ÎÊý¾Ý
g_Data.Uart1SendCommendFlag = 2;
g_Data.Uart1OverCount = 0; //³¬Ê±¼ÆÊ±±êÖ¾
g_Data.GetUart1OverFlag = 0; //µÈ´ý½ÓÊÕÍê³É
break;
default:
break;
}
}
if(g_Data.GetUart3OverFlag) //´®¿Ú2¿ÕÏÐ
{
switch(g_Data.Uart3SendCommendFlag)
{
case 0:
Send_Slave(3); //¶ÁÈ¡½ü¶Ë¹¤²ÎÊý¾Ý
g_Data.Uart3SendCommendFlag = 1;
g_Data.Uart3OverCount = 0; //³¬Ê±¼ÆÊ±±êÖ¾
g_Data.GetUart3OverFlag = 0; //µÈ´ý½ÓÊÕÍê³É
break;
case 1:
Send_Slave(4); //¶ÁÈ¡½ü¶Ë¹¤²ÎÊý¾Ý
g_Data.Uart3SendCommendFlag = 2;
g_Data.Uart3OverCount = 0; //³¬Ê±¼ÆÊ±±êÖ¾
g_Data.GetUart3OverFlag = 0; //µÈ´ý½ÓÊÕÍê³É
break;
default:
break;
}
}
//1sÄÚ¶ÁÈ¡Íê³ÉºóÇå¿Õ1s±êÖ¾
if((g_Data.Uart1SendCommendFlag==2)&&(g_Data.Uart3SendCommendFlag==2))//½ÓÊÕÍê³É
{
g_Data.Tim1Count1sFlag = _FALSE;
g_Data.Uart1SendCommendFlag = 0;
g_Data.Uart3SendCommendFlag = 0;
//»ñÈ¡Êý¾ÝÍê³É£¬ÓÃÓÚÊý¾Ý¼ÆËã
g_Data.GetComplate_Flag = 1;
}
}
else
{
if(g_Data.GetComplate_Flag)
{
if((g_Data.GetUart1OverFlag)&&(g_Data.GetUart3OverFlag))
{
DataCompute();
g_Data.GetComplate_Flag = 0;
}
}
}
}