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 initMeasurement(sMeasurement *pMeasurement); | ||||||
| void updateAverage(sMeasurement *pMeasurement); | void updateAverage(sMeasurement *pMeasurement); | ||||||
| void updatePrediction(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) | void initInputs(void) | ||||||
| { | { | ||||||
| @ -162,6 +162,7 @@ void updatePrediction(sMeasurement *pMeasurement) | |||||||
|     predict60s->fValue = linearRegressionPredict( |     predict60s->fValue = linearRegressionPredict( | ||||||
|         predict60s->samples, |         predict60s->samples, | ||||||
|         predict60s->bufferCount, |         predict60s->bufferCount, | ||||||
|  |         predict60s->bufferIndex, | ||||||
|         predict60s->bufferCount + 60.0f); |         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) |     if (count == 0) | ||||||
|         return 0.0f; // No prediction possible with no data |         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++) |     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 x = (float)i;               // Time index | ||||||
|         float y = samples[i]; // Sample value |         float y = samples[circularIndex]; // Sample value | ||||||
|  |  | ||||||
|         sumX += x; |         sumX += x; | ||||||
|         sumY += y; |         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 |     // Calculate slope (m) and intercept (b) of the line: y = mx + b | ||||||
|     float denominator = (count * sumX2 - sumX * sumX); |     float denominator = (count * sumX2 - sumX * sumX); | ||||||
|     if (fabs(denominator) < 1e-6)    // Avoid division by zero |     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 m = (count * sumXY - sumX * sumY) / denominator; | ||||||
|     float b = (sumY - m * sumX) / count; |     float b = (sumY - m * sumX) / count; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user