реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> STM32F4: цифровой фильтр АЦП
k000858
сообщение Dec 26 2014, 11:28
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Есть девайс, мерит напряжение. К сожалению, плата разведена не очень хорошо, есть шум на ацп: иногда вместо 0 показывает 0.1-0.3В (вход мерит до 72В благодаря резистивному делителю).
Планирую добавить усреднение: замерять с помощью АЦП 100 (например 100) раз канал, затем вычислять среднее арифметическое из полученных значений. Так делается или есть способ похитрее программно сгладить шумы?

В МК есть FPU и инструкции DSP. Быть может есть готовые библиотеки в CMSIS для подобных расчетов?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 26 2014, 12:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(k000858 @ Dec 26 2014, 15:28) *
Так делается или есть способ похитрее программно сгладить шумы?

Делается. Если со схемотехникой и разводкой все в порядке, то этот метод вполне применим.
Рискну спросить. А антиалиасный фильтр перед АЦП имеется ? Хотя бы простейшая RC - цепочка ? И насколько сложно будет исправить некорректно разведенную плату ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 26 2014, 13:02
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вот простейший фильтр:
CODE
#define SHIFT 4 // filter time constant is T*2^SHIFT

static int acc;

// seed filter with initial value
void filter_init(int a)
{
acc = a << SHIFT;
}

// call this periodically and supply filter with input data
void filter_advance(int a)
{
acc += a - (acc >> SHIFT);
}

// filter output
int filter_result(void)
{
return acc >> SHIFT;
}
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 26 2014, 13:13
Сообщение #4


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(k000858 @ Dec 26 2014, 13:28) *
Так делается или есть способ похитрее программно сгладить шумы?


После АЦП до любых других фильтров всегда применяйте медианный.
Здесь где-то на форуме недалеко есть тема со сравнением быстродействия различных реализаций медианного фильтра.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 26 2014, 15:53
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



экспонента для плавных процессов тоже хорошо броски борет
Go to the top of the page
 
+Quote Post
Aner
сообщение Dec 26 2014, 19:56
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463



Если шум на ацп: иногда вместо 0 показывает 0.1-0.3В (вход мерит до 72В благодаря резистивному делителю). Это нужно исправлять. Вы хоть прикиньте ошибку и динам диапазон. Может у вас 6 разрядов шумят из 12. А может меряете програмно не верно, без учета входых реактивностей.
Ну исправите вы что-то софтом усредните, отмедианите, откалманите, а аппаратная ошибка дающая шум останется.
Go to the top of the page
 
+Quote Post
k000858
сообщение Dec 29 2014, 04:12
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(kovigor @ Dec 26 2014, 16:30) *
Делается. Если со схемотехникой и разводкой все в порядке, то этот метод вполне применим.
Рискну спросить. А антиалиасный фильтр перед АЦП имеется ? Хотя бы простейшая RC - цепочка ? И насколько сложно будет исправить некорректно разведенную плату ?

На входе АЦП простой резистивный делитель + кондер на GND
На входе Vref рекомендуемая схема от ST

Схема будет переделана в следующих ревизиях устройства, как только будут найдены источники помех и способы их устранения.
Сейчас задача - улучших характеристики АЦП уже эксплуатируемых устройств (т.е. программно)

Цитата(scifi @ Dec 26 2014, 17:02) *
Вот простейший фильтр:
CODE
#define SHIFT 4 // filter time constant is T*2^SHIFT

static int acc;

// seed filter with initial value
void filter_init(int a)
{
acc = a << SHIFT;
}

// call this periodically and supply filter with input data
void filter_advance(int a)
{
acc += a - (acc >> SHIFT);
}

// filter output
int filter_result(void)
{
return acc >> SHIFT;
}

спасибо за пример. еще бы допереть как его использовать.
можно в 2х словах?
Go to the top of the page
 
+Quote Post
k000858
сообщение Dec 29 2014, 06:45
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(AlexandrY @ Dec 26 2014, 16:13) *
После АЦП до любых других фильтров всегда применяйте медианный.
Здесь где-то на форуме недалеко есть тема со сравнением быстродействия различных реализаций медианного фильтра.

в DSP библиотеках CMSIS что то есть для медианного фильтра?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 29 2014, 06:58
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
спасибо за пример. еще бы допереть как его использовать.
можно в 2х словах?


идея в том что вы вызываете void filter_init(int a)
с первым полученным от АЦП значением или 0

а далее каждое новое значение пихаете в void filter_advance(int a), и когда вам надо
отфильтрованный результат, берете его в int filter_result(void)


это обычная экспонента



Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 29 2014, 07:18
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Dec 29 2014, 09:58) *
идея в том что вы вызываете void filter_init(int a) ...

Спасибо за пояснения. А я хотел просто послать на RTFM: в комментариях к коду, вообще-то, всё написано :-)
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 29 2014, 08:26
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(k000858 @ Dec 29 2014, 08:12) *
На входе АЦП простой резистивный делитель + кондер на GND

Общеизвестно, что на сопротивление такого делителя накладываются ограничения.
У вас R не больше предельного значения? В противном случае АПЦ превращается в показометр.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 29 2014, 08:37
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(k000858 @ Dec 29 2014, 07:12) *
На входе АЦП простой резистивный делитель + кондер на GND
На входе Vref рекомендуемая схема от ST

Цитата(adnega @ Dec 29 2014, 11:26) *
Общеизвестно, что на сопротивление такого делителя накладываются ограничения.
У вас R не больше предельного значения? В противном случае АПЦ превращается в показометр.

Кроме того, конденсатор должен быть рядом с ножкой МК. Это же относится и к Vref. Проверено хождением по граблям :-)
Go to the top of the page
 
+Quote Post
k000858
сообщение Dec 29 2014, 09:21
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(adnega @ Dec 29 2014, 11:26) *
Общеизвестно, что на сопротивление такого делителя накладываются ограничения.
У вас R не больше предельного значения? В противном случае АПЦ превращается в показометр.


плата разведена довольно неплохо, а вот схема питания устройства ( ... -> 5В -> 3.3В) так себе, соответственно Vref получается довольно шумным не смотря на фильтр.

на самом деле железной частью устройства занимаюсь не я. я больше по программной части.

Применил вышеописанный фильтр. Без подключенного измеряемого напряжения (на входе АЦП 0В):
до применения показания были 0 - 0.3В
после применения (результат берется из 100 измерений) 0.07-0.12В т.е. 0В никогда не бывает.

В общем делаю вывод, что частота помехи слишком высокая и в измерения слишком часто попадают броски. Будь частота помехи пониже, от фильтра было бы больше пользы.

Быть может у кого то еще появятся мысли о том, как мне победить помеху программным способом...

Цитата(Golikov A. @ Dec 29 2014, 09:58) *
идея в том что вы вызываете void filter_init(int a)
с первым полученным от АЦП значением или 0

а далее каждое новое значение пихаете в void filter_advance(int a), и когда вам надо
отфильтрованный результат, берете его в int filter_result(void)


это обычная экспонента

спасибо.
а чем такой способ отличается от медианного фильтра (в 2х словах, если не сложно) ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 29 2014, 09:30
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(k000858 @ Dec 29 2014, 12:21) *
Применил вышеописанный фильтр. Без подключенного измеряемого напряжения (на входе АЦП 0В):
до применения показания были 0 - 0.3В
после применения (результат берется из 100 измерений) 0.07-0.12В т.е. 0В никогда не бывает.

Можно предположить, что помеха настолько велика, что среднеквадратичное отклонение имеет порядок 0.1В, что и даёт такое среднее значение около 0 (потому что отрицательные значения на входе АЦП заменяются нулём, а положительные остаются). Это предположение нужно подтвердить. Оцифруйте 100...1000 отсчётов при ненулевом входе и посчитайте статистические показатели: среднее, мин., макс., среднеквадратичное отклонение.
Если предположение подтвердится, то можно приподнять сигнал на входе АЦП ещё одним резистором (к Vref, например), чтобы сигнал на входе АЦП никогда не опускался ниже 0 даже в присутствии шумов. Ну а потом эту поправку от резистора учесть в расчётах, естественно.
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 29 2014, 09:33
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(k000858 @ Dec 29 2014, 13:21) *
В общем делаю вывод, что частота помехи слишком высокая и в измерения слишком часто попадают броски. Будь частота помехи пониже, от фильтра было бы больше пользы.
Быть может у кого то еще появятся мысли о том, как мне победить помеху программным способом...

Если Rain будет больше рекомендованного значения, то в каждой выборке вы будете иметь бросок, и программно такое не обработать.
Осциллограф наглядно покажет эти броски на ножке АЦП.
Ради эксперимента увеличьте емкость между входом АЦП и GND до мкФ, время выборки АЦП увеличьте до максимума - должно полегчать.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 29 2014, 12:07
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
а чем такой способ отличается от медианного фильтра (в 2х словах, если не сложно) ?

можно ровно в 2 словахsm.gif
"Ни чем"
sm.gif))

это стандартный медианый целочисленный фильтр

Цитата
Если предположение подтвердится, то можно приподнять сигнал на входе АЦП ещё одним резистором (к Vref, например), чтобы сигнал на входе АЦП никогда не опускался ниже 0 даже в присутствии шумов. Ну а потом эту поправку от резистора учесть в расчётах, естественно.

все бы вам резисторы паять...

надо программно откалибровать и все... Проверьте на среднем значении. Если оно после усреднения будет ровное, то вам действительно надо просто учитывать что вблизи нуля отрицательный сигнал отваливается... и ввести еще одну коррекцию, как на спидометрах машин, загнуть хвост)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 29 2014, 12:32
Сообщение #17


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Golikov A. @ Dec 29 2014, 15:07) *
можно ровно в 2 словахsm.gif
"Ни чем"
sm.gif))
это стандартный медианый целочисленный фильтр

Отнюдь. Медианный фильтр просто отбрасывает, не использует значения, значительно отличающиеся от остальных. Он хорош для избавления от неправильных измерений при импульсных помехах.
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 29 2014, 12:48
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата
Сейчас задача - улучших характеристики АЦП уже эксплуатируемых устройств (т.е. программно)

Увеличивать время семплирования до максимума.

А можно посмотреть напряжение на ножке АЦП? Осциллограмму в студию! По картинке сразу будет виден и уровень шумов, и характер...
Обсуждение сейчас - пальцем в небо.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 29 2014, 12:56
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(adnega @ Dec 29 2014, 15:48) *
Обсуждение сейчас - пальцем в небо.

Ну так топикстартер на вопросы не любит отвечать. Ему, видимо, с бубном плясать приятнее laughing.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 29 2014, 14:22
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Отнюдь. Медианный фильтр просто отбрасывает, не использует значения, значительно отличающиеся от остальных. Он хорош для избавления от неправильных измерений при импульсных помехах.


А блин! Точно. Термины уже попутал.
Это обычный экспоненциальный фильтр.

Медиана, классическая, берет 4 значения, максимум - минимум отбрасывает, 2 оставшихся усредняет. Это фильтр который создан отсекать случайные выбросы.


Go to the top of the page
 
+Quote Post
k000858
сообщение Dec 30 2014, 05:47
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



1) Vref 3.3В
2) Вход АЦП (после резистивного делителя и ёмкости, прямо возле ножки МК) без подключенного напряжения

Шумит все, что можно: напряжение питания, опорное напряжение, вход АЦП. А вероятнее всего шумят земли. Понятное дело плату будут разводить, повторюсь, моя задача - улучшить показатели АЦП программно, насколько это возможно

SamplingTime = ADC_SAMPLETIME_480CYCLES;
АЦП конвертит беспрерывно и под DMA складывает результаты в память, а я из пати, когда мне надо забираю цифры (примерно раз в секунду)

Сообщение отредактировал IgorKossak - Jan 14 2015, 18:27
Причина редактирования: удалил "тяжёлые" картинки
Go to the top of the page
 
+Quote Post
VAI
сообщение Dec 30 2014, 06:04
Сообщение #22


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Вот здесь рассматривалось много разных медиан.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 30 2014, 06:48
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(k000858 @ Dec 30 2014, 08:47) *
2) Вход АЦП (после резистивного делителя и ёмкости, прямо возле ножки МК) без подключенного напряжения

Имя, сестра, имя! Номиналы резисторов!?
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 30 2014, 07:03
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(k000858 @ Dec 30 2014, 09:47) *
Шумит все, что можно: напряжение питания, опорное напряжение, вход АЦП.

Дык, 10мВ амплитуда. Где же ужасные "0.1 - 0.3В"?
Go to the top of the page
 
+Quote Post
k000858
сообщение Dec 30 2014, 07:33
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(scifi @ Dec 30 2014, 09:48) *
Имя, сестра, имя! Номиналы резисторов!?

69.8K и 3.3К

Цитата(scifi @ Dec 30 2014, 09:48) *
Имя, сестра, имя! Номиналы резисторов!?

вот пример нескольких замеров АЦП (при разрешении 4095)

Код
1: 4
2: 5
3: 0
4: 14
5: 1
6: 0
7: 0
8: 0
9: 4
10: 1


Код
1: 0
2: 0
3: 4
4: 0
5: 13
6: 3
7: 4
8: 2
9: 10
10: 6


вот отсуда и получаются эти 0 - 0.3В
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 30 2014, 07:49
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



max = 14

14 * 3300 мВ / 4096 = 11 мВ = 0.011В

А вы как считаете?
Go to the top of the page
 
+Quote Post
k000858
сообщение Dec 30 2014, 07:57
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(adnega @ Dec 30 2014, 10:49) *
max = 14

14 * 3300 мВ / 4096 = 11 мВ = 0.011В

А вы как считаете?

* (R1 + R2)/R2 = 0.25В

R1 R2 резистивный делитель

Цитата(VAI @ Dec 30 2014, 09:04) *
Вот здесь рассматривалось много разных медиан.

применил способ Xenia
31 точка. в результате показания 0.02-0.07В при подключенных 0В
может стоит изменить количество точек?
Go to the top of the page
 
+Quote Post
VAI
сообщение Jan 13 2015, 12:32
Сообщение #28


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Цитата
может стоит изменить количество точек?

Медианный фильтр не пропускает выбросы длительностью меньше половины ширины фильтра. Т.е. если у Вас 31 точка, то шумовые выбросы длительностью меньше или равно времени 15 отсчетов не пройдут через фильтр. Думайте сами.
И после резестивного делителя повторитель поствьте.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jan 13 2015, 12:47
Сообщение #29


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(VAI @ Jan 13 2015, 14:32) *
И после резестивного делителя повторитель поствьте.

Это лишнее: входное сопротивление ADC (ножки в режиме AIN) - огого, потому 70K погоды не делают.

Сообщение отредактировал KnightIgor - Jan 13 2015, 12:48
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 13 2015, 13:59
Сообщение #30


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(KnightIgor @ Jan 13 2015, 14:47) *
Это лишнее: входное сопротивление ADC (ножки в режиме AIN) - огого, потому 70K погоды не делают.
При бесконечном времени выборки. А при конечном надо успеть за время выборки через выходное сопротивление этого делителя зарядить/разрядить конденсатор УВХ до входного напряжения плюс-минус половина напряжения младшего разряда АЦП. Емкость конденсатора УВХ - 4 пФ, проходное сопротивление ключа УВХ - 6 кОм, входное сопротивление входа АЦП - не менее 50 кОм (а совсем не огого).

Прикрепленное изображение


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 14 2015, 04:21
Сообщение #31


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(VAI @ Jan 13 2015, 15:32) *
Медианный фильтр не пропускает выбросы длительностью меньше половины ширины фильтра. Т.е. если у Вас 31 точка, то шумовые выбросы длительностью меньше или равно времени 15 отсчетов не пройдут через фильтр. Думайте сами.
И после резестивного делителя повторитель поствьте.

т.е. допустим на входе АЦП 0В, после оцифровки 31 точки результаты: 0 0 0 0 0 0 0 0 0 0 10 10 0 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6, результаты 10 10 не попадут в результаты а 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 попадут. так?

что будет с такого вида результатами?

Код
ADC_Volt_0: 8
ADC_Volt_1: 0
ADC_Volt_2: 0
ADC_Volt_3: 4
ADC_Volt_4: 11
ADC_Volt_5: 5
ADC_Volt_6: 0
ADC_Volt_7: 4
ADC_Volt_8: 3
ADC_Volt_9: 5
ADC_Volt_10: 5
ADC_Volt_11: 0
ADC_Volt_12: 0
ADC_Volt_13: 10
ADC_Volt_14: 0
ADC_Volt_15: 0
ADC_Volt_16: 5
ADC_Volt_17: 6
ADC_Volt_18: 6
ADC_Volt_19: 0
ADC_Volt_20: 3
ADC_Volt_21: 3
ADC_Volt_22: 6
ADC_Volt_23: 0
ADC_Volt_24: 0
ADC_Volt_25: 3
ADC_Volt_26: 5
ADC_Volt_27: 2
ADC_Volt_28: 0
ADC_Volt_29: 5
ADC_Volt_30: 11


Наткнулся на аппноут ST AN4073 http://www.st.com/web/en/resource/technica.../DM00050879.pdf

Описанный в нем способ показал наилучшие результаты в моем случае (применил способ сортировка + усреднение)
Как называется такой способ ? как выбрать оптимальные N и X ?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 14 2015, 06:00
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



сортировка и усреднение - медиана?

классическая 4 точечная медиана.
берет 4 значения, выкидывает из них самое большое и самое маленькое, два оставшихся усредняет.

дальше вы можете выбирать сколько самых больших и маленьких значений выкинуть, и сколько усреднить.

как вы сами понимаете если у вас значения вида

а а а а а а а а б б б б б а а а а а, где а - один уровень сигнала, а б - какой то то всплеск, то число отбрасываемых мидианой значений должно определяться длинной этих всплесков.

то есть к примеру у вас 4 точечная медиана

а а а а = а
а а а б = а
а а б б = (а+б)/2
а б б б = (а+б)/2
б б б б = б
и дальше начнет спадать, ваш всплеск прошел.
а если медиана будет отбрасывать по 5 значений, то все 5 б всегда будут в максимумах и отброшены и не пройдут на выход никогда. Но с другой стороны количество отброшенных значений определяет число накапливаемых результатов, и как следствие задержку выдачи сигнала, то есть в нашем же примере 4 точечной медианы
допустим б - это не выброс а реальная смена сигнала, только через 4 значения после появления нового сигнала на входе, он появился на выходе. Опять же не только всплески, но и короткие изменения полезного сигнала будут отброшены, то есть при фильтрации синуса условно его горбы будут срезаны, то есть зарезана амплитуда.

вот из этих соображений и выбирайте, а других рецептов никто не даст. Баланс между шумом и правильностью измерений





Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 14 2015, 07:28
Сообщение #33


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(Golikov A. @ Jan 14 2015, 09:00) *

о! большое спасибо за объяснение. теперь все понял.

Сообщение отредактировал IgorKossak - Jan 14 2015, 09:53
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
adnega
сообщение Jan 14 2015, 08:21
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



а б б б = б ?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 14 2015, 08:44
Сообщение #35


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



а если кругом одни б б, то что выдаст описанный выше фильтер? Если нечего отбрасывать, не отбрасывайте ничего. Это к вопросу о пяти б. Что значит "не пройдут никогда"? А что же тогда выдавать?
Видимо, я не до конца понял. А 4 - точечный медианный фильтр с усреднением - интересно, чувствую, что можно реализовать и аппаратно, в ПЛИС, например. Хотя, на мой взгляд - это уже два фильтра.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 14 2015, 09:16
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



я имел ввиду про исходную последовательность....

ну то есть если у нас есть стабильный сигнал и в нем встречаются выбросы разной длительности, то до тех пор пока в окно фильтра не попадут отклонения суммарной длительностью больше отбрасываемой части, они не выйдут наружу...

Цитата
а б б б = б ?

да, почему нет...

допустим а меньше б.

тогда самое маленькое из этих 4 что? а.
самое большое из них что? б
а и б отбрасывается остается б б
(б+б)/2 = б

я может ошибаюсь, но в том представлении что я имею о медианном фильтре отбрасываются не по значению а по количеству. То есть все входные данные сортируются и с начала и с конца отбрасывается заданное число значений, оставшиеся усредняются...

это позволяет сигналам вида
а а а а б а а а а а б а а а б а а а а а б а а а а а,
то есть с единичными выбросами всегда от них избавляться... не зависимо от того куда эти выбросы вверх или вниз.

при этом как бы числом отбрасываемых регулируется интенсивность выбросов, считая что окно фильтра пропорционально раздвигается...

то есть 4 точечный уже почувствует влияние выбросов , если между ними будет менее 3 "правильных" сигналов, а увеличив число отбрасываемых значений и длину фильтра мы "затянем" фильтр ближе к более стабильному сигналу, и сможем откидывать более интенсивные выбросы.

Цитата
точечный медианный фильтр с усреднением - интересно, чувствую, что можно реализовать и аппаратно, в ПЛИС, например.


не знаю, всегда считал что усреднение должно быть. Зачем забирать N значений N/2 от них выбрасывать, и из оставшихся N/2 значений использовать только 1, зачем остальные то были нужны? и как выбрать то единственное? если у нас 1 2 3 4, то что на выходе 2 или 3? Почему 2 или почему 3? а так на выходе 2.5 и никому не обидноsm.gif


при этом прелесть с усреднением в том что сигнал вида
а б а б а б а б а б а б даст для 4 точечной медианы (а+б)/2, то есть как бы средний уровень, а сигнал с преобладанием а, будет ближе к а он будет выдавать то а, то (а+б)/2 и очень редко б. Мне кажется физически это верная работа

В плис реализуется, однотактовый вариант не очень быстр, в силу необходимости сортировки и как следствие мультиплексоров, но конвейерный вполне и не только в 4 значения...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 14 2015, 09:31
Сообщение #37


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Golikov A. @ Jan 14 2015, 12:16) *
не знаю, всегда считал что усреднение должно быть. Зачем забирать N значений N/2 от них выбрасывать, и из оставшихся N/2 значений использовать только 1, зачем остальные то были нужны? и как выбрать то единственное? если у нас 1 2 3 4, то что на выходе 2 или 3? Почему 2 или почему 3? а так на выходе 2.5 и никому не обидноsm.gif

Медиана по трем точкам. И, вообще, по нечетному количеству. Скажем, для 5 точек в середину попадет согласно сортировке, она же и выйдет наружу. И не один раз.
А потом можно усреднять, сколько душа пожелает.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Jan 14 2015, 10:10
Сообщение #38


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



ТС.
Прежде, чем колдовать с фильтрами, построили бы гистограмму, приподняв вход на 1 вольт. И автокорреляционную функцию.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 14 2015, 11:01
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Медиана по трем точкам. И, вообще, по нечетному количеству. Скажем, для 5 точек в середину попадет согласно сортировке, она же и выйдет наружу. И не один раз.
А потом можно усреднять, сколько душа пожелает.


ну может быть. Я почему то видел везде классическую реализацию с 4 точками и усреднением по 2. В целом главное знать что хочешь получить, а как это получить - уже второй моментsm.gif

Цитата
Прежде, чем колдовать с фильтрами, построили бы гистограмму, приподняв вход на 1 вольт. И автокорреляционную функцию.

неплохо придавили)
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jan 14 2015, 11:32
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Golikov A. @ Jan 14 2015, 13:01) *
ну может быть. Я почему то видел везде классическую реализацию с 4 точками и усреднением по 2. В целом главное знать что хочешь получить, а как это получить - уже второй моментsm.gif

Медианный фильтр классически по нечетному количеству точек делается. После сортировки берется то значение, которое в серединной точке, никакого усреднения.
А для четного количества точек придуман костыль в виде среднего арифметического двух серединных точек, "виртуальная медиана массива".
Где применять медианный фильтр а где усреднять всю выборку - зависит от характера возможных помех/наводок и от физики источника сигнала (сенсора).
Я, как правило, применяю и то и другое: сначала медианный фильтр по окну последних измерений(чаще всего 5-точечный-уже длинный но еще быстрый) , а после него- среднее арифметическое по окну из последних значений, выданных медианным фильтром.
Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 21 2015, 10:13
Сообщение #41


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



И все таки: какое количество точек для сортировки/усреднения в моем случае лучше взять? вот пример 4х замеров АЦП по 10 значений при 0В на входе АЦП?

CODE
ADC_Volt_0: 0
ADC_Volt_1: 10
ADC_Volt_2: 6
ADC_Volt_3: 1
ADC_Volt_4: 2
ADC_Volt_5: 4
ADC_Volt_6: 5
ADC_Volt_7: 7
ADC_Volt_8: 7
ADC_Volt_9: 5


ADC_Volt_0: 2
ADC_Volt_1: 0
ADC_Volt_2: 1
ADC_Volt_3: 5
ADC_Volt_4: 0
ADC_Volt_5: 4
ADC_Volt_6: 3
ADC_Volt_7: 5
ADC_Volt_8: 0
ADC_Volt_9: 4
ADC_Volt_0: 0


ADC_Volt_1: 10
ADC_Volt_2: 0
ADC_Volt_3: 0
ADC_Volt_4: 3
ADC_Volt_5: 4
ADC_Volt_6: 5
ADC_Volt_7: 13
ADC_Volt_8: 4
ADC_Volt_9: 0


ADC_Volt_0: 0
ADC_Volt_1: 6
ADC_Volt_2: 0
ADC_Volt_3: 0
ADC_Volt_4: 4
ADC_Volt_5: 4
ADC_Volt_6: 0
ADC_Volt_7: 3
ADC_Volt_8: 2
ADC_Volt_9: 0


Сообщение отредактировал IgorKossak - Jan 21 2015, 14:21
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 21 2015, 10:22
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



вижу единичные большие выбросы, остальное ровненько, 3 точек хватит...


есть у меня подозрение что сигнал у вас приподнят на некий уровень, так как нету отрицательных значений
вычтите дополнительно к фильтру из сигнала какую-то величину, например 2. Это нормализует сигнал вблизи нуля, и немного испортит его в максимуме.

Но лучше конечно построить чуть более умную функцию
kX + b, и подобрать k и b так чтобы сигнал был от 0 до максимума
и вот ее уже фильтровать
Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 21 2015, 11:16
Сообщение #43


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(Golikov A. @ Jan 21 2015, 13:22) *
вижу единичные большие выбросы, остальное ровненько, 3 точек хватит...

в приведенном выше примере указывается 2 количества точек: 1) точки измерения (оцифровки) = точки сортировки 2) точки усреднения.

Цитата(Golikov A. @ Jan 21 2015, 13:22) *
есть у меня подозрение что сигнал у вас приподнят на некий уровень


просто моменты оцифровки часто попадают на "шум" поэтому редко бывает 0

Цитата(Golikov A. @ Jan 21 2015, 13:22) *
нету отрицательных значений

разве такое может быть, учитывая что АЦП выдает от 0 до 4095?


Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 21 2015, 11:25
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Именно потому что оно выдает 0 - 4095 у вас и нет -1.

если что-то шумит около 0, какие значения будут? только положительные, значит средний уровень какой? Больше нуля, чтобы в 0 попасть надо уметь мерить отрицательные значения.

Так что вы можете обфильтроваться около нуля у вас всегда будет значительная ошибка. При этом чем больше вы усредняете тем хуже будет результат, потому что сумма будет только расти.

на пальцах:

сигнал 0,
реально он - 1 0 1 0 - 1 0 1 -1 0 1 -1 1
итак далее
ваше АЦП его превращает в 0 0 1 0 0 0 1 0 0 1 0 1
и так далее
сумма первого сигнала 0, сумма вашего сигнала 4
средние первого сигнала 0, среднее вашего сигнала 0.3

когда у вас есть шум и он сдвинут в какую - то сторону усреднение будет только увеличивать ошибку.... Та же история у вас будет возле максимума, после усреднения вы все дальше будите от максимума. Потому если вы хотите что-то мерить точно, оно должно быть внутри диапазона, а по краям всегда будет не точно
Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 21 2015, 11:54
Сообщение #45


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(Golikov A. @ Jan 21 2015, 14:25) *
skip

значит цифровой обработкой не улучшить показания?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 21 2015, 13:06
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



цифровая обработка только в кино про шпионов из размытой фотографии делает четкую картинку, где можно марку сигарет разглядеть.

Если у вас нет значений сигнала, никакая цифровая обработка их не восстановит. Улучшить можно, но все зависит от....


в вашем случае можно сделать так
ваш сигнал от 0 до 4095
вы его немного растягиваете, сделав от 0 до 4099, например, и сдвигаете на 2 вниз, получая диапазон значение
-2 до 4097
вы , конечно внесли искажения в сигнал, но зато выдвинули за границы диапазона, если сигнал растягивать и сдвигать на ваш характерный уровень шума, то это позволит более корректно определить ноль и диапазон.

Пишу более корректно, а не точно, потому что этими манипуляциями вы только помогаете усредняющим фильтрам не еузжать от нуля вверх и от диапазона вниз, а точность вы не увеличиваете, даже наоборот уменьшаете, во время растяжения вы растягиваете еще и шум.

Ваша проблема не нова, обратите внимания как много приборов которые работают с положительными величинами, не измеряют хорошо вблизи нуля, тот же спидометр машины, который из нуля выходит только после Н км в час.

Go to the top of the page
 
+Quote Post
Latch
сообщение Jun 3 2015, 14:07
Сообщение #47





Группа: Участник
Сообщений: 13
Регистрация: 15-10-06
Пользователь №: 21 331



Нужно мерять 16 каналов 1 раз в секунду. Реально достичь на STM32F4 +-0.1% ?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 3 2015, 14:51
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



0.1% от чего?
от диапазона, какого?
от сигнала, опять же какого?
как вы понимаете относительная погрешность вблизи нуля растет в бесконечность...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 3 2015, 16:02
Сообщение #49


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Latch @ Jun 3 2015, 17:07) *
Нужно мерять 16 каналов 1 раз в секунду. Реально достичь на STM32F4 +-0.1% ?

Конечно. Там же 12-разрядный АЦП. Плюс усреднение по огромному количеству выборок. За 1 секунду можно много набрать.
Go to the top of the page
 
+Quote Post
Axel
сообщение Jun 4 2015, 03:20
Сообщение #50


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(Latch @ Jun 3 2015, 17:07) *
Нужно мерять 16 каналов 1 раз в секунду. Реально достичь на STM32F4 +-0.1% ?


Если:
- 0.1% - это от всего диапазона (4096 попугаев)
- спектр входных сигналов не содержит "высоких" (относительно частоты выборок АЦП) составляющих
- выходные импедансы источников сигналов невысоки
- источник опоры приличного качества и (по опыту) не менее 2 вольт
- разводка, обвеска, питание соответствуют
то реально...
Go to the top of the page
 
+Quote Post
Latch
сообщение Jun 5 2015, 09:54
Сообщение #51





Группа: Участник
Сообщений: 13
Регистрация: 15-10-06
Пользователь №: 21 331



всем спасибо... проделал следующее:
опорное 2.5V
крона 9V -> REF195 -> 5V -> делитель 20K 1K (конденсатора нет) -> ADC pin (~10% от диапазона)
тестовый софт: АЦП 5 KHz, 4 канала, DMA, 256 усреднений в пакете (т.е выход ~19 остчетов в сек.)
поиск мин. и макс. в течение получаса, результат: +-0.06%

Сообщение отредактировал Latch - Jun 5 2015, 09:55
Go to the top of the page
 
+Quote Post
ALEN&Co
сообщение Jul 22 2016, 08:10
Сообщение #52





Группа: Участник
Сообщений: 13
Регистрация: 8-06-12
Пользователь №: 72 222



Цитата(Latch @ Jun 3 2015, 17:07) *
Нужно мерять 16 каналов 1 раз в секунду. Реально достичь на STM32F4 +-0.1% ?

Не факт.
Разрешение 0,1% получите без проблем.
Точность же определяется не только количеством разрядов.
Во первых, у любого АЦП есть погрешности (интегральная и дифференциальная нелинейности, дрейф сдвига и т.п.), и у этого встроенного они превышают МЗР. Плюс погрешности опорника.

Во вторых, важна правильная разводка ПП. Обратите особое внимание на аналоговую землю (не зря же это отдельная ножка!!).

Сопротивление делителя должно быть небольшим. Смотрите рекомендации в дш. Лучше, если не более нескольких кОм. И конденсатор максимально близко с чипу.

Если важен участок около нуля, сделайте положительное смещение 5..10 МЗР. В зависимости от сопротивления резисторов делителя достаточно многомегаомного резистора на +реф. Программно этот нуль потом вычтете (после усреднения).

АЦП на максимальную длительность. И пусть работает непрерывно. Усреднение лишним не бывает.

Опорник, как уже написали, на максимальное напряжение, и диапазон по входу использовать максимально.


З.Ы. Вообще, при таких требованиях целесообразно ставить внешнее АЦП.
Я использую обычно AD7687, полная схема содержит еще мультиплексоры и инструментальные усилители. Погрешность преобразования с 32 каналов минимум на порядок ниже.

Цитата(Latch @ Jun 5 2015, 12:54) *
поиск мин. и макс. в течение получаса, результат: +-0.06%

Уже хорошо, но этого мало, если Вам необходимо жестко 0,1%.

Добавьте временной дрейф.
Попробуйте во всём диапазоне рабочих температур.
Соедините общий провод источника реального сигнала с вашей схемой, чтобы добавить реальные шумы.
Измените влажность в помещении хотя бы на несколько часов.
...

Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 15:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.02034 секунд с 7
ELECTRONIX ©2004-2016