Merge pull request 'bugfix/linear-regression-prediction' (#19) from bugfix/linear-regression-prediction into main
Reviewed-on: #19
This commit is contained in:
		| @ -36,7 +36,7 @@ void taskInput(void *pvParameters); | ||||
| void initMeasurement(sMeasurement *pMeasurement); | ||||
| void updateAverage(sMeasurement *pMeasurement); | ||||
| void updatePrediction(sMeasurement *pMeasurement); | ||||
| float linearRegressionPredict(const float *samples, size_t count, float futureIndex); | ||||
| float linearRegressionPredict(const float *samples, size_t count, size_t bufferIndex, float futureIndex); | ||||
|  | ||||
| void initInputs(void) | ||||
| { | ||||
| @ -162,6 +162,7 @@ void updatePrediction(sMeasurement *pMeasurement) | ||||
|     predict60s->fValue = linearRegressionPredict( | ||||
|         predict60s->samples, | ||||
|         predict60s->bufferCount, | ||||
|         predict60s->bufferIndex, | ||||
|         predict60s->bufferCount + 60.0f); | ||||
| } | ||||
|  | ||||
| @ -267,7 +268,7 @@ void taskInput(void *pvParameters) | ||||
|     } | ||||
| } | ||||
|  | ||||
| float linearRegressionPredict(const float *samples, size_t count, float futureIndex) | ||||
| float linearRegressionPredict(const float *samples, size_t count, size_t bufferIndex, float futureIndex) | ||||
| { | ||||
|     if (count == 0) | ||||
|         return 0.0f; // No prediction possible with no data | ||||
| @ -276,8 +277,11 @@ float linearRegressionPredict(const float *samples, size_t count, float futureIn | ||||
|  | ||||
|     for (size_t i = 0; i < count; i++) | ||||
|     { | ||||
|         // Calculate the circular buffer index for the current sample | ||||
|         size_t circularIndex = (bufferIndex + i + 1) % count; | ||||
|  | ||||
|         float x = (float)i;               // Time index | ||||
|         float y = samples[i]; // Sample value | ||||
|         float y = samples[circularIndex]; // Sample value | ||||
|  | ||||
|         sumX += x; | ||||
|         sumY += y; | ||||
| @ -288,7 +292,7 @@ float linearRegressionPredict(const float *samples, size_t count, float futureIn | ||||
|     // Calculate slope (m) and intercept (b) of the line: y = mx + b | ||||
|     float denominator = (count * sumX2 - sumX * sumX); | ||||
|     if (fabs(denominator) < 1e-6)    // Avoid division by zero | ||||
|         return samples[count - 1]; // Return last value as prediction | ||||
|         return samples[bufferIndex]; // Return the latest value as prediction | ||||
|  | ||||
|     float m = (count * sumXY - sumX * sumY) / denominator; | ||||
|     float b = (sumY - m * sumX) / count; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user