|
Простейший цифровой ФНЧ, для конечного массива точек |
|
|
|
Jan 20 2011, 10:37
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Есть массив, в котором записаны значения с АЦП. Напряжения формируют некую "огибающую" Платформа: STM32, сигнал - массив значений с АЦП в вольтах. 1)Подскажите фильтр (алгоритм на Си) чтобы сгладить(усреднить) значения в массиве? 2) Как определить характерные места у огибающей (резкое увеличение значения, резкий спад)
Сообщение отредактировал Ivan Kuznetzov - Jan 20 2011, 11:26
Эскизы прикрепленных изображений
--------------------
Разработчик
|
|
|
|
|
 |
Ответов
|
Jan 21 2011, 11:01
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Код /************************************************************************ * * * Библиотека для цифровой фильтрации. * * Версия: 1.01. * * * * Файл: fir.c Дата создания: 08.07.2010г. * * Последние изменения: 08.07.2010г. * * Сапего Александр Леонидович. (sapegoal@mail.ru) * * * ************************************************************************/
#include "stdint.h"
// Фильтр 2-го порядка исходя из формулы y0^ = a0*(x0+x2)+a1*x1 + b1*y0 + b2*y1 + c1*y0 // где a и b - коэффициенты, c - целая часть y0 // После выполнения производится сдвиг y. // y1 -> y2, y0 -> y1, y0^ -> y0; // // В процедуру передаётся 2 параметра // 1 - указатель на значения, в последовательности: x0,x1,x2,y0,y1,y2 // 2 - указатель на значения коэффициентов в последовательности: a0,a1,b1,b2,c1 // По финишу результат делится на 32768
struct data_s { int16_t x[3],y[3]; // Данные фильтра };
struct coef_s { int16_t a0, a1, b1, b2, c1; // Коэффициенты фильтра };
void fir2_16(uint8_t * data, uint8_t * coef) { struct data_s *d_s; struct coef_s *c_s; int32_t acc; d_s = (struct data_s *) data; c_s = (struct coef_s *) coef; acc = (int32_t)(d_s->x[0] + d_s->x[2]) * (int32_t)c_s->a0; acc += (int32_t)d_s->x[1] * (int32_t)c_s->a1; acc += (int32_t)d_s->y[0] * (int32_t)c_s->b1; acc += (int32_t)d_s->y[1] * (int32_t)c_s->b2; acc >>= 15; acc += d_s->y[0] * c_s->c1; d_s->y[2] = d_s->y[1]; d_s->y[1] = d_s->y[0]; d_s->y[0] = acc; } Код // Фильтр Баттерворта 4 порядка 1000 -> 100; 200 = -30 дб // // 1 звено y0 = 0,061885*(x0+x2) + 0,123770*x1 + 1,048600*y1 - 0,296140*y2 // Коэффициенты a0,a1,b1,b2,c1 = 2028, 4056, 1593, -9704, 1 // 2 звено y0 = 0,077956*(x0+x2) + 0,155913*x1 + 1,320910*y1 - 0,632739*y2 // Коэффициенты a0,a1,b1,b2,c1 = 2554, 5109, 10516, -20734, 1 // int16_t fltr_c1[5] = {2028, 4056, 1593, -9704, 1}, fltr_c2[5] = {2554, 5109, 10516, -20734, 1}; Код fir2_16((uint8_t *)&lin[cnt_line].x[0],(uint8_t *)fltr_c1);// Первое звено фильтра fir2_16((uint8_t *)&lin[cnt_line].y[0],(uint8_t *)fltr_c2);// Второе звено фильтра Так например. ))
|
|
|
|
|
Jan 21 2011, 14:47
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Пробегало давненько: Цитата Код u16_t Yavg;
for(;;) { Yavg -= Yavg/256; Yavg += ADCH; } Запуск и готовность АЦП за Вами. Утверждается, что в старшем байте Yavg получим фильтр НЧ с частотой среза = частоте запуска АЦП/256 с погрешностью обработки <0.5 LSB, по АФЧХ эквивалентный RC цепочке с такой же частотой среза. Почему? Хемминг уже рассказал, у меня лучше не получится.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
Ivan Kuznetzov Простейший цифровой ФНЧ Jan 20 2011, 10:37 Demeny Цитата(Ivan Kuznetzov @ Jan 20 2011, 13:3... Jan 20 2011, 11:21 Ivan Kuznetzov Demeny, спасибо! функция уже заметно красивей ... Jan 20 2011, 12:02 AHTOXA Цитата(Ivan Kuznetzov @ Jan 20 2011, 17:0... Jan 20 2011, 13:27 Ivan Kuznetzov AHTOXA, спасибо, действительно красивее!
В... Jan 20 2011, 13:55 AHTOXA Цитата(Ivan Kuznetzov @ Jan 20 2011, 18:5... Jan 20 2011, 19:16 firstvald Есть метод скользящего среднего, считается так:
(... Jan 20 2011, 14:18  SasaVitebsk Цитата(Ivan Kuznetzov @ Jan 21 2011, 17:2... Jan 25 2011, 15:04   Ivan Kuznetzov SasaVitebsk, хотим! чем отличается от этого? Jan 25 2011, 19:31 777777 Цитата(Ivan Kuznetzov @ Jan 20 2011, 13:3... Jan 23 2011, 10:58 demiurg_spb Цитата(777777 @ Jan 23 2011, 13:58) Если ... Jan 24 2011, 10:20 _pv Цитата(Ivan Kuznetzov @ Jan 20 2011, 16:3... Jan 23 2011, 13:06 SasaVitebsk Цитата(_pv @ Jan 23 2011, 16:06) Кстати, ... Jan 26 2011, 07:20  _pv Цитата(SasaVitebsk @ Jan 26 2011, 13:20) ... Jan 26 2011, 15:29   SasaVitebsk Цитата(_pv @ Jan 26 2011, 18:29) не думаю... Jan 26 2011, 21:14 GetSmart В Саратове живут суровые профэссианалы Jan 24 2011, 11:15 777777 Цитата(GetSmart @ Jan 24 2011, 14:15) В С... Jan 24 2011, 13:04 Ivan Kuznetzov Внесу ясность в суть дела. Речь идет о цифровом из... Jan 25 2011, 13:24 firstvald Цитата(Ivan Kuznetzov @ Jan 25 2011, 16:2... Jan 26 2011, 11:29 firstvald Навсякий случай: FIR все же постабильнее, хотя и ... Jan 26 2011, 15:38 ig_z QUOTE (_pv @ Jan 23 2011, 15:06) Кстати, ... Jan 27 2011, 11:54 ViKo Цитата(ig_z @ Jan 27 2011, 13:54) Так все... Jan 28 2011, 08:48  orthodox Цитата(ViKo @ Jan 28 2011, 10:48) Из прив... Jan 30 2011, 09:50   ViKo Цитата(orthodox @ Jan 30 2011, 11:50) Нес... Jan 30 2011, 10:31 SasaVitebsk Извиняюсь. Действительно IIR. Jan 28 2011, 11:47 Ivan Kuznetzov Еще вопрос по теме тонометра. Я сейчас использую д... Jan 29 2011, 16:04 =AK= Цитата(Ivan Kuznetzov @ Jan 20 2011, 21:0... Jan 30 2011, 09:00 firstvald Не , там напряжение ли или частота - все едино - п... Jan 30 2011, 09:22 ViKo http://search.analog.com/search/default.as...CG... Jan 30 2011, 09:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|