From fd45847d5d30c960ecb425ca26f2a67532efd2fb Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Sat, 7 Feb 2026 09:55:56 +0300 Subject: [PATCH] =?UTF-8?q?=D1=85=D0=B7=20=D1=87=D1=82=D0=BE=20=D1=82?= =?UTF-8?q?=D1=83=D1=82=20=D1=8D=D1=82=D0=BE=20=D0=BD=D0=B5=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MyLibs/Inc/filters.h | 5 +++-- MyLibs/Src/filters.c | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/MyLibs/Inc/filters.h b/MyLibs/Inc/filters.h index 79541b2..529df5c 100644 --- a/MyLibs/Inc/filters.h +++ b/MyLibs/Inc/filters.h @@ -256,11 +256,12 @@ typedef struct _FilterLUT_t{ FilterState_t state; ///< Состояние фильтра float* input_values; // Массив входных значений float* output_values; // Массив выходных значений + float offset; // Смещение input_values uint16_t size; // Размер таблицы uint8_t interpolation; // Флаг интерполяции (0 - отключена, 1 - линейная) uint8_t dataProcessing; ///< Флаг - данные в обработке - int (*reset)(struct _FilterLUT_t *filter, float* input_arr, float* output_arr, uint16_t size, uint8_t interpolation); + int (*reset)(struct _FilterLUT_t *filter, float* input_arr, float* output_arr, uint16_t size, uint8_t interpolation, float offset); float (*process)(struct _FilterLUT_t *filter, float input); } FilterLUT_t; @@ -290,7 +291,7 @@ int FilterAverage_Init(FilterAverage_t* filter, uint32_t size, FilterMode_t mode float FilterAverage_Process(FilterAverage_t* filter, float input); int FilterPoly_Init(FilterPoly_t* filter, float* coeffs, uint8_t order); float FilterPoly_Process(FilterPoly_t* filter, float input); -int FilterLUT_Init(FilterLUT_t* filter, float* input_arr, float* output_arr, uint16_t size, uint8_t interpolation); +int FilterLUT_Init(FilterLUT_t* filter, float* input_arr, float* output_arr, uint16_t size, uint8_t interpolation, float offset); float FilterLUT_Process(FilterLUT_t* filter, float input); int FilterRMS_Init(FilterRMS_t* filter, uint32_t window_size); float FilterRMS_Process(FilterRMS_t* filter, float input); diff --git a/MyLibs/Src/filters.c b/MyLibs/Src/filters.c index 5570171..c88f617 100644 --- a/MyLibs/Src/filters.c +++ b/MyLibs/Src/filters.c @@ -220,9 +220,10 @@ float FilterPoly_Process(FilterPoly_t* filter, float input) { * @param output_arr Массив выходных значений * @param size Размер таблицы * @param interpolation Флаг интерполяции (0 - ближайшее значение, 1 - линейная интерполяция) + * @param offset Сдвиг input_arr для удобной коррекции * @return 0 - успех, -1 - ошибка */ -int FilterLUT_Init(FilterLUT_t* filter, float* input_arr, float* output_arr, uint16_t size, uint8_t interpolation) { +int FilterLUT_Init(FilterLUT_t* filter, float* input_arr, float* output_arr, uint16_t size, uint8_t interpolation, float offset) { check_init_filter(filter); if ((input_arr == NULL) || (output_arr == NULL)) return -1; @@ -230,6 +231,7 @@ int FilterLUT_Init(FilterLUT_t* filter, float* input_arr, float* output_arr, uin filter->output_values = output_arr; filter->size = size; filter->interpolation = interpolation; + filter->offset = offset; filter->state = FILTER_READY; filter->reset = &FilterLUT_Init; @@ -253,6 +255,7 @@ float FilterLUT_Process(FilterLUT_t* filter, float input) { uint16_t left_index = 0; uint16_t right_index = filter->size - 1; + input -= filter->offset; // Если значение за пределами таблицы - возвращаем крайние значения if (input <= filter->input_values[0]) { return filter->output_values[0];