|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:34 am
Averaging (и малко линеаризация)
| Автор |
Съобщение |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
 Averaging (и малко линеаризация)
Измерване в диапазон (0V;5V), ADC 10bit-a => LSB=4.883mV
В докуентацията е посочено, че сумарната грешка е +/- 2LSB, което ще рече +/- 9.766mV. Ако изведа стойностите на измерването директно на LCD-то последните позиции ще играят. Бих могьл да изрежа последните 2 бита с цел да "замразя" резултата, но по този начин си скапвам разрешаващата способност. Очевидно ще се наложи да отпиша mV-позицията, но ми е интересно да проверя какви ще са резултатите от определянето на някаква средна стойност на серия от измервания. Вьопросьт е кой метод какво предлага.
1. Arithmetic mean
Правя 1024 (или 128) измервания (ADC-то е бьрзо, процесьт е бавен), сумирам и шифт-вам 10 бита в дясно. Имайки предвид, че се очаква шума в голяма степен да е Гаусиан, се надявам на подобрено SNR. Проблем може да се появи от сравнително лошата реакция на промени при този тип осредняване. Друг неприятен ефект е, че стойности с големи отклонения оказват силно влияние. Бяхме дискутирали преди време вьзможността чрез стандартното отклонение да се отсеят тези стойности, но това си е сравнително тежка техника и не мисля, че ще се наложи на този тап да прибягвам до нея.
Вьпросьт с реализациятa. Осредняването може да стане след извьршването на всички измервания, което става с по-малко сметки и малко по-вече памет, но за да имам готова стойност, който да покажа на LCD-то трябва да изчакам всички 1024 изервания. Не че е проблем...
Другата вьзможност е изчисляването на средната стойност в движение, чрез
сметките са повече, но след всяко измерване разполагам с готова за изобразяване стойност. В случая изобразяването не е от сосбено значение, но при interrupt ще разполагам с актуална стойност. Като се замисля обаче за един потенциометьр е напьлно излишно.
[2. Moving average]
Идеята е отново да се проведат голям брой измервания като извьршвам осредняването на всеки n^2 позиции. Големината на n определя степента на изглаждане и скоростта на реакция при резки промени в амплитудата на сигнала. Този метод би трябвало да има много по-добра динамична характеристика и да проследява промените на сигнала максимално точно, за разлика от пьрвият метод, който се предполага, че се прилага при нединамични сигнали.
Може да се реализира по два начина.
а) извьршват се всички измервания и след това с два вградени цикьла се попьлва масива, който ще сьдьржа изгладения сигнал.
б)стойностите се изчисляват в движение, като за целта се използва опашка FIFO. Поради нерелевантността на подредбата на стойностите в прозореца, опашката може да се реализира освен чрез изместване на позициите в масива, така и чрез структура тип часовник.
3. Този метод не мога да го определя. Формулата е елементарна:
[y(n)=( y(n-1) + x(n) ) / 2]
Осредняват се винаги предходната осреднена стойност и настоящата стойност. На базата на няколко примера мога да заключа, че функционира, но не успявам да го сравня с втория метод. Някакви предложения?
Това е общо взето. Има редица други течники за изглаждане на "ошумени" сигнали и определяне на средна стойност, но предполагам се използват рядко и за специфични задачи. Интересно ми е да чуя какви техники използвате в какви ситуации и с какви проблеми/особености сте се срещали.
Поздрави!
Последна промяна HCL на Нед Мар 04, 2007 8:17 pm, променена общо 1 път
|
| Нед Мар 04, 2007 7:46 am |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
За шума - в момента се сблъсквам с нещо подобно- само че при регулатори.Усредняването на практика е интегриране.При използване на аналогов регулатор (ПИД) шумовете се внасят от външните елементи и могат да самовъзбудят системата.При цифрово интегриране обаче е възможно да се елиминира тази грешка.Тогава се появява грешка от дискретизация по ниво и квантуване по време.Въпроса опира до подходящ подбор на време на дискретизация и разрядност на АЦП-то над което сега мисля.В момента се пуйча и над самокалибриране на система - както си работиш (измерваш) в един момент свързваш входа на АЦП-то към маса и измерваш офсета.Този офсет го изваждаш от всеки един резултат или след като сумираш N пъти и разделиш на N го изваждаш от получения резултат.Не е приложимо директно при изкуствено увеличаване разрядност на АЦП (приложим е но с особенност). Другото което се сещам - за да махнеш шума използвай MDM усилватели,но те са скъпи.Имаше някаква елегатнта хватка с редове на Тейлор и Маклорен но я четох преди седмица посред нощите и нещо ми се губи от де съм я чел  но идеята беше,че се използват само няколко стойности и замествайки ги в реда получаваш това усредняване,т.е боравиш с малко стойности и малък буфер.Сега ми идва и идеята да следиш диференциала на грешката и спрямо него да коригираш резултата но трябва да го пообмисля 
|
| Нед Мар 04, 2007 11:10 am |
|
 |
|
Syrius-B
Ранг: Форумен бог
Регистриран на: Пон Яну 30, 2006 2:48 am Мнения: 1248 Местоположение: София
|
Има една много проста (за реализация в MPU) хватка:
-Мериш 10 пъти (нпр.) и сумираш.
-Махаш най-голямото и най-малкото от сумата.
-делиш на 8
|
| Нед Мар 04, 2007 12:50 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
@Ки4о предполагам ги знаеш тези неща, пиша ги за цялостност на темата - относно подходящия подбор на разрядност на АПЦ-то: Поради квантизиращата грешка максималното реализуемо SNR е
т.е. всеки бит внася подобрение с около 6dB. При 10бит-ово ADC имаш в най-добрия случай SNR=62dB. Тази тема може да представлява интерес http://www.mcu-bg.com/mcu_site/viewtopic.php?t=3728Отделно можеш да се подобри квантизиращата грешка чрез dithering, т.е. вмьквaне нa допьлнително шум в сигнала. Тьй като квантизиращата грешка е +/-0.5LSB, се вкарва шум сьс стандартно отклонение около 2/3LSB. На стр.5 има графики които онагледяват добре ефекта http://www.dspguide.com/CH3.PDFТова за Тейлор редовете звучи интересно като опция за конструиране на резултат от измерване чрез сензор с нелинейна функция без да се налага използването на неудобни от кьм памет Look-up таблици покриващи целия диапазон на измерването или интензивно от кьм процесорно време изчисляване на стойностите директно от функцията. Достатьчно е да разделиш целия диапазон на участьци, колкото повече толкова по-добре, но си ограничен от кьм памет, все пак бягаме от look-up таблиците. За всеки участьк фиксираш дадена точка x0 около която развивaш ред на Тейлор до втория-член, т.е. линейната част и запазваш в таблица изчислените за всички x0 линейни уравнения.
От тук нататьк CPU-то смята мултиплициране и сьбиране доста по бьрзо от x^3+4x например и по този начин конструираш графата на измерването чрез отделните линейни участьци. При всяко положение ще се наложи да изгладиш резултата с averaging.
Hе знам до колко грешката от линеаризирането оказва някакво влияние, определено диапазоньт около x0 не трябва да е много голям и отделните участьци трябва да са подбрани спрямо хода на функцията, като се сьобразяваш с инфлексните точки. Интересно е да се провери как работи тази техника.
[@Syrius-B] това е доста хитро, наподобява метода сьс стандартното отклонение, но е далеч по-елементарно за реализация, определено ще го тествам.
|
| Нед Мар 04, 2007 2:04 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Производната на функцията ти показва изменението  ,а паметта (.т.е таблицата дето формираш в нея) я ползваш за съхраняване на предишните отчети.Ако си в момента на Х(n) помнош в нея X(n-1),X(n-2).... за да можеш с по-голяма точност да смяташ.Принципно редовете може да ги използваш и за смятане на много неща.При регулатора смяташ в реално време,няма как да предвидиш изменението за напред.Можеш да разбереш посоката но не и стойността.Абе правят се едни опити с наблюдатели от висок ред,но там си е доста сложна математика. Редовете се използват и при линейни функции,зависи от конкретната задачка и какво точно иска да се прави. Използва се развитие до 3-5 член на реда в зависимост от желаната точност.
Колкото до този трик с увеличаване на разрядността - лично аз съм малко скептично настроен-предпочитам 16 битово АЦП вместо от 10 на го правя на 16  В Матлаб имаше една такава функция за изчисляване на средна стойност - май и казваха медиана (може и да греша).Възможно е да направиш и усредняване със прозоречна функция - всичкото което е в прозореца се сумира и дели на броя отчети в прозореца.Но трябва да го проверя как се прави.
Определено ще пробвам и това дето го каза Syrius-B.
|
| Нед Мар 04, 2007 3:57 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
Идеята ми беше малко по-различна. Изчислението на изменението от предходната стойност е добра стратегия, но ако функцията ми е полином от 3. или 4. степен това означава след образуването на пьрвата производна да оставя CPU-то да смята полином от .2 или 3. степен, което при малко по-динамичен процес няма да е много забавно.
Каква е идеята. Разделям целия диапазон на секции. Приерно 5 секции от по 1V в диапазона [0V;5V]. Избирам 5 точки за развитие, примерно на 0.5V, 1.5V, 2.5V, 3.5V, 4.5V. Развивам редове на Тейлор до втория член за всяка опорна точка x0,
и получавам по една линейна функция за всяка секция. Тези функции ги пиша в паметта на µC. До тук сметките са само на хартия.
Какво става при измерването. При получаване на нова стойност x от ADC-то (примерно 1.3V) определям в коя секция лежи (в случая [1V;2V]) и изчислявам f(x) използвайки линейното уравнение отнасящо се до тази секция.
Какво печеля. Печеля performance т.е. време, понеже вече не ми се налага да смятам полиноми 2. и 3. степен, а работя с линейни уравнение (т.е. умножение и сьбиране).
Какво губя. Някаква грешка поради линеаризирането. Грешката е толкова по-малка, колкото повече опорни точки използвам и колкото по-добре сьм напаснал секциите на хода на сигнала. И колкото по-дьльг ред на Тейлор сьм развил, но тьй като целим свеждане на умноженията до минимум, работим само с линейната част.
Дали работи нямам идея, на теория звучи добре, малко повече програмна памет се иска от µC-a, но далеч по-малко от реализация с look-up таблица, а и се освобождава изчислителна мощност. Иначе казано може да се работи с нелинейни сензори и µC от ниськ клас, което са доста спестени парички. Но това само на теория, ще опитам да го приложа на практика идната седмица, да видим какьв ще е резултата.
|
| Нед Мар 04, 2007 6:04 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Това дето искаш да го направиш - съгласен съм,но за всеки интервал ти ще смяташ диференчно уравнение,а не пълния диференциал на функцията,т.е същинското изменение.Идеята с използването на реда е именно да сметнеш пълния диференциал на система от висок ред.Другото което искам да те питам е какво правиш при нулева производна - на практика това ти показва че функцията няма промяна - пак ли ще тръгваш да смяташ? Остава и въпроса как ще предвидиш хода на сигнала?Значи,смятайки по това което предлагаш,за всеки интервал имаш определена стойност.Крайния брой интервали означава по-начупена функция,от там може да се получи грешка в апроксимацията(ако се налага) и евентуално ако правиш интегриране (усредняване) това няма ли да вкара грешка?Това което ти предлагам да пробваш е следното - имаш бавен процес с голяма времеконстанта.Преди всяко измерване определяш грешката-офсета.Голямата времеконстанта означава че можеш да определиш една гранична стойност на изменението на функцията между 2 измервания и ако имаш по -голяма стойност от тази грешка-значи имаш силно смущение.Определяйки производната знаеш на къде ти върви процеса и дали въобще може да тръгне в такава посока.Пресмяташ си стойността на функцията и вземаш решението - в твоя случай средната стойност.Нищо не пречи да запазваш стойностите от измерането във памет (примерно в 16 точки).След това си правиш интегрирането и воала.Това ти позволява ако имаш някаква грешка в аналоговата част да я изолираш (имаш максимален праг на скорост на изменение на величина определена от самия процес). Абе с едни такива неща се занимавам напоследък и нещо взе да става интересно но ще видим... 
|
| Нед Мар 04, 2007 6:44 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Ки4о, идеята е добра, но това предполага познаване на процеса, което обаче поглеждайки релно е доста нереалистично. Примерно, казваш терморегулатор за пещ, логично е в определен интервал температурата д анараства, след това да спада, не се очакат подскоци ... да ако някой идиот не отвори пеща, да това е груб пример, но реално дост от процесите които изглеждат познати не са. Да вземем пак случая с пеща, някой вкарва студено тяло, или изкарва вс еоще неизтинало, нзнайн защо, просто е идиот и го прави, но ако си настроил ПИД да речем, но той извади тяло което е 1/2 от загрятат маса, темературата е започне да сада с по висока стойност, ако си задал някаква стойност за граница на изменението може да с еокажце че дълго време отчтите ще са извън тази граница. Но като цяло идеята е добра и съм я прилагал.
Тук малко се засегнаха две теми май, едното е усредняване, имаше не лоша тема по въпроса, другото кото се засегна е линеаризацията.Проблема с неточноста на ADC до голяма степен се решава с интегриране, т.е нормално усредняване. Вариант е да позлваш прозорец, който го пулниш с отчетите и на който му прави обработката, примерно 128 отчта и на всеки нов байт, преизчисляваш, това също работи доста добре, обикновенно усредняване но .. 
|
| Нед Мар 04, 2007 7:32 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
Тони е прав, засегнахме две теми. Без да искам, просто и двете проблематики (усредняване и линеаризация) са ми актуални.
За това което писах в предния си пост пьлният диференциал на с-мата не е от значение. Използвам реда на Тейлор единствено с цел да линеаризирам функцията на определени места (опорните точки x0). Става вьпрос за функция на нелинеарен сензор (нещо от сорта Temperatur=F(Voltage)), която с малко кьсмет е дадена в документацията на сензора, ако това не е така, не развивам ред на Тeйлор а просто линеаризирам отделните участьци на рька по метода на тангентата.
Нямам предвид обработката на входящия сигнал за което говориш ти, a как от измереното напрежение на изхода на сензора да получа мерената физична величина (Температура, ускорение...) без да се налага да правя сложни сметки или да използвам таблица за стойностите. просто смесих темите по невнимание...
A това за което говориш е доста интерсно като метод. Само че проблемьт, който описа Тони звучи доста реален.
Явно трябва да се сьобразяват и "особеностите средата" в която протича процеса
@ToHu това което даваш като пример с прозореца е точо moving average. От това което изчетох последните 2 дена, изглежда този метод макар и толкова елементарен дава много добри резултати.
|
| Нед Мар 04, 2007 8:13 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Ами тук неата са така, добри резултати от математическа гледна точка и добри резултати в реална ситуация. Математически, разлики има, и то не малки, ноне винаги сложни методи за филтрация а данните, или осредняване, дават толкова добри резултати на практика. В действителния свят имаш много неща които не са идеални, дори са далеч от идеалното, и добрите и работещи иначе математически похвати не всеки път дават очаквания добър резултат, дори понякога се получава че резулатат в определени моменти е по лош отколкот резултат от по елементарна обработка. Точноста математичски да се подобрява е лека лудост, ако трябва точност, нчина за подобрение е във входните вериги, датчици, усилватели, АЦП. Софтуерно единственто разумно нещо е да се филтрират смущения и грешки, което само по себе си също е подобряване на точноста. Проблма с ADC и грешките от него се рещава в голяма степен с просто усредняване, заото както ти самия каза рзпределението е гаусово. Това се отнася и за много от другите смутители, но естествено има случаи когато това не е така, примерно отместване на изхода поради несиметрия, еднополярни смущения, или несиметрини такива, да речем в някои случаи при комутация на товари. Там е вече удобно да се ползват статистически методи, акто тия които обсъдихме в другата тема. В крайна сметка това което там обсъждахме, при подходяща дължина на прозореца може да се реазлизира сравнително бързо.
|
| Нед Мар 04, 2007 9:50 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Съжелявам ако съм разводнил темата.  В момента съм на вълна регулатори и там се сблъсквам със подобни явления и за това писах.
|
| Нед Мар 04, 2007 10:01 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Aaaa, не, никак даже, то в регулаторите е едно от основните места където се среща тоя проблем .... само дето малко се смесиха линеаризация с премахване на грешките, иначе самит алгоритми в голяма степен ако са настрени правилно играят ролята и на един вид филтри, но не трябва да се разчита на това.
|
| Нед Мар 04, 2007 10:07 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
@Syrius абе тя идеята си е много добра, ама като седнах да напиша функцията и ми се опулиха очите накрая. Много код бре, не може толкоз ресурси за изчистването на един максимум и един минимум. Предполагам, че аз го пиша много дьрварски. Как да стане по-елегантно?
Cортиране е излишно, linear search ще ми вьрти втори цикьл, вкарах го директно при попьлването на масива и пак не ми харесва
Последна промяна HCL на Вто Апр 03, 2007 5:08 pm, променена общо 1 път
|
| Вто Апр 03, 2007 4:48 pm |
|
 |
|
danov
Ранг: Минаващ
Регистриран на: Вто Ное 16, 2004 4:43 pm Мнения: 85 Местоположение: София
|
|
| Вто Апр 03, 2007 4:59 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
Защото не разсьждавам докато мисля  . Не мога да повярвам, че не го прецених. Без масив кода пада от 104 на 30Byte, да не говорим, че е и по-бьрзо. danov Благодаря!
А и бях допуснал грешка, вместо min_position на 2 места бях писал min. Компилаторьт обаче кефи, веднага изписка, че една от променливите е непотребна.
|
| Вто Апр 03, 2007 5:25 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|