Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите со схемно-программным решением для измерения периода
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Diusha
На вход девайса может поступать периодический сигнал. А может не поступать, а вместо него – лабуда. Будем считать, что если сигнал есть, то он по крайней мере в разы больше шума, но когда cигнала нет, «лабуда» м.б. большой (как сигнал, если бы он был). Задача – определить, что появился сигнал и измерить его период. Диапазон 1…10 мс, точность нужна порядка 2% (все числа пока ориентировочные).
Форма сигнала может быть любой, вовсе не обязательно, что только с двумя экстремумами по времени за период.
Вычислительная мощность ограничена, ибо AVR => 8 бит, невысокая тактовая. Плюс загружен еще другой задачей.
Обрабатывать непрерывный поток с АЦП, боюсь, некогда, поэтому пытаюсь его минимизировать. Попытался сделать так:

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

Реально, конечно, в моменты горбов получаю кучу отсчетов, часть из которых отсекаю по признаку «слишком рано после предыдущего».

Вопросы:

1. Удачно ли такое схемное-программное решение для получения отсчетов?

2. (в случае положительного ответа на 1.) Каким путем посоветуете поступить с полученными отсчетами?
На заметке а) быстрое преобразование Фурье, б) автокорреляционная функция. Есть еще и в) мысля в сторону алгоритмов поиска периода подстроки в строке.

3. Или вообще надо всё совсем не так?
alexeyv
частота полезного периодического сигнала в каком диапазоне?
может стоит сначала прогнать сигнал через полосовой фильтр, а потом производить дальнейшую обработку?
KARLSON
Цитата(Diusha @ Dec 27 2010, 09:24) *
2.Каким путем посоветуете поступить с полученными отсчетами?


Так отсчёты не нужны для основной рабготы? А что если Вам считать период таймером (наверника он есть в АВР), запускающийся от прерывания компаратора?
Diusha
Цитата(alexeyv @ Dec 28 2010, 06:41) *
частота полезного периодического сигнала в каком диапазоне?
может стоит сначала прогнать сигнал через полосовой фильтр, а потом производить дальнейшую обработку?

Я же написал: период полезного сигнала 1...10 мс (ориентировочно). Наверно нечетко сформулировал
Фильтры ставить не хочется, хочетс с самым минимальным минимумом компонентов. Ну если уж окажется никак, то тут уж шо уж тут уж (с).
Тем более, что шумы в основном примерно в том же диапазоне

Цитата(KARLSON @ Dec 28 2010, 08:22) *
Так отсчёты не нужны для основной рабготы? А что если Вам считать период таймером (наверника он есть в АВР), запускающийся от прерывания компаратора?

Само собой, таймером определяю моменты срабатывания компаратора (Input Capture mode).
Я привел пример формы сигнала, для которого в идеале за период (его) я должен получить 6 отсчетов. Но сигнал может быть и "хуже" (больше отсчетов), а может быть синусоида (2 отсчета), наперед это неизвестно. Поэтому чтобы из кучи отсчетов выудить период, нужен какой-то алгоритм. Это раз. А два - это то, что реально на период я получаю не 6 (как в примере), а десятки отсчетов, из которых надо как-то отсечь лишние (чтобы меньше обрабатывать), но "не выплеснуть и младенца".

P.S. Под отсчетом я здесь подразумеваю пару: [момент времени (по сигналу с компаратора); величина в этот момент (с АЦП)]
EvgenyNik
Цитата
если сигнал есть, то он по крайней мере в разы больше шума, но когда cигнала нет, «лабуда» м.б. большой (как сигнал, если бы он был). Задача – определить, что появился сигнал и измерить его период.

Получается, что только компаратором не отделить интервалы сигнала от остального времени шума, т.к. компаратор замучает Вас прерываниями на шуме.
Тупо и напрямую я бы стал решать так:
1. Набирал бы некий буфер, куда помещались бы, как минимум, два периода минимально возможной частоты.
2. Прогонял БПФ с целью выявить максимумы частотного спектра
3. По полученным частотным компонентам брал бы ширину окна величиной с период и методом наименьших квадратов сравнивал бы "кадры" с шагом в ширину окна.
4. За повторяемый сигнал выбрал бы тот период, у которого наименьшее расхождение по погрешности сравнения кадров.
Designer56
а просто отфильтровать сигнал на входе до 1 кГц? Проще не придумаешь. Религия не позволяет?
GetSmart
Цитата(Diusha @ Dec 27 2010, 11:24) *
По прерыванию запускаю АЦП, и в идеале должен получить отсчеты в моменты минимумов и максимумов.

Вы точно понимаете как работает эта схема?!
Diusha
Цитата(Евгений Николаев @ Dec 28 2010, 17:14) *
3. По полученным частотным компонентам брал бы ширину окна величиной с период и методом наименьших квадратов сравнивал бы "кадры" с шагом в ширину окна.
4. За повторяемый сигнал выбрал бы тот период, у которого наименьшее расхождение по погрешности сравнения кадров.

Т.е., для каждого полученного частотного компонента брать свое окно и далее по тексту? Тогда точно времени не хватит sad.gif
И, насколько я понимаю, для такого алгоритма нужно отсчеты получать непрерывным потоком (компаратор в пролете)?

Цитата(Designer56 @ Dec 28 2010, 19:10) *
а просто отфильтровать сигнал на входе до 1 кГц? Проще не придумаешь. Религия не позволяет?

Религия мне, как атеисту, позволяет все. Но мысль непонятна. Что даст фильтрование? Я не силен в данной теме, поэтому посните, пожалуйста.
Может Вы имеете в виду наделать фильтров (программно) от 100 до 1000 Гц с шагом 2%? Напоминаю: AVR sad.gif

Цитата(GetSmart @ Dec 28 2010, 20:47) *
Вы точно понимаете как работает эта схема?!

Да.
Если этот вопрос трактовать несколько иначе ("Как работает эта схема?"), ответ будет более развернутый sm.gif

Напряжение на "-" компаратора всегда будет отставать от "+" (вх. сигнала). (Речь о мгновенных напряжениях) Допустим, входное напряжение растет. На "-" оно будет чуть ниже.
Вх. н. перестало расти, пошло на убыль. Теперь на "-" напр. больше, чем на "+" - получаю прерывание. Реально (по понятным причинам) получаю не 1 прер., а много
alex_os
Цитата(Diusha @ Dec 29 2010, 09:05) *
Если этот вопрос трактовать несколько иначе ("Как работает эта схема?"), ответ будет более развернутый sm.gif

Напряжение на "-" компаратора всегда будет отставать от "+" (вх. сигнала). (Речь о мгновенных напряжениях) Допустим, входное напряжение растет. На "-" оно будет чуть ниже.
Вх. н. перестало расти, пошло на убыль. Теперь на "-" напр. больше, чем на "+" - получаю прерывание. Реально (по понятным причинам) получаю не 1 прер., а много


Крайне сомнительная схема, работать будет только на идеальной синусоиде (да Вы сами в этом убедились).

Если время измерения не критично можно попробовать сделать что-то вроде ФАПЧ. Достаточно будет 1-4 отсчета на
измеряемый период. В плане выч. затрат это будет самое экономное решение, в плане программирования довольно геморное, т.к. частота может быть в довольно широких пределах.
Да, предполагается что момент взятие отсчета АЦП можно задавать программно.

alexkok
Цитата(Diusha @ Dec 28 2010, 17:27) *
Я же написал: период полезного сигнала 1...10 мс (ориентировочно). Наверно нечетко сформулировал
Фильтры ставить не хочется, хочетс с самым минимальным минимумом компонентов.

Но придется, хотя бы одно звено.
Цитата
Само собой, таймером определяю моменты срабатывания компаратора (Input Capture mode).
Я привел пример формы сигнала, для которого в идеале за период (его) я должен получить 6 отсчетов. Но сигнал может быть и "хуже" (больше отсчетов), а может быть синусоида (2 отсчета), наперед это неизвестно. Поэтому чтобы из кучи отсчетов выудить период, нужен какой-то алгоритм. Это раз. А два - это то, что реально на период я получаю не 6 (как в примере), а десятки отсчетов, из которых надо как-то отсечь лишние (чтобы меньше обрабатывать), но "не выплеснуть и младенца".

P.S. Под отсчетом я здесь подразумеваю пару: [момент времени (по сигналу с компаратора); величина в этот момент (с АЦП)]

Предлагаю:
1. Изменить схему, добавив гистерезис
Нажмите для просмотра прикрепленного файла
2. Алгоритм примерно такой:
- считаете средний, максимальный и минимальный полупериоды/периоды на скользящем окне;
- считаете некое подобие "дисперсии", попроще;
- если "дисперсия" меньше порога, значит есть сигнал.
Diusha
Цитата(alex_os @ Dec 29 2010, 09:36) *
Крайне сомнительная схема, работать будет только на идеальной синусоиде (да Вы сами в этом убедились).

Синусоида ничуть не лучше нарисованного примера сигнала, у нее такие же плоские верхушки. По идее схема должна хорошо работать с пилой (не проверял, т.к. такая форма маловероятна).

Цитата(alex_os @ Dec 29 2010, 09:36) *
Если время измерения не критично можно попробовать сделать что-то вроде ФАПЧ.

К сожалению, очень критично. 0.5 сек – уже точно не годится. Хотелось бы 0.1, ну 0.2 макс. Получается на нижней частоте 10 (20) периодов. Вероятно придется чем-то пожертвовать.

Цитата(alexkok @ Dec 29 2010, 10:39) *
1. Изменить схему, добавив гистерезис

Вот это идея мне понравилась! Спасибо!
Только у АВРок, к сожалению, у компаратора нет выхода на улицу. Придется на внешнем операционнике сделать. Программно выводить выход компаратора по прерыванию – возможны ошибки. Хотя, кто его знает…

Цитата(alexkok @ Dec 29 2010, 10:39) *
2. Алгоритм примерно такой:
- считаете средний, максимальный и минимальный полупериоды/периоды на скользящем окне;

Дело «за малым»: определить период. В это-то все и упирается. Выделив период, возможно будет достаточно тупо 10 периодов разделить на 10.

Можно, наверно, период искать банально как интервал от максимума до максимума, а максимумами считать те, которые отличаются друг от друга не более, чем на …% от амплитуды. Ну вот мы и нашли период; если за N периодов разброс меньше, чем, значит все в абажуре. Но может быть такая форма сисигнала, которая все испортит.

Можно, добавив еще несколько IF–THEN, предусмотреть и 2 и 3 максимума (≈одинаковых) на период. Но наверно есть покрасивше алгоритм
alexkok
Цитата(Diusha @ Dec 30 2010, 11:12) *
Вот это идея мне понравилась! Спасибо!
Только у АВРок, к сожалению, у компаратора нет выхода на улицу. Придется на внешнем операционнике сделать. Программно выводить выход компаратора по прерыванию – возможны ошибки. Хотя, кто его знает…

У меня ошибка в схеме, цепь ПОС/гистерезиса нужно подключить к средней точке, а не к сигнальной цепи.
Нулём сигнала, соответственно, должна быть средняя точка.
Цитата
Дело «за малым»: определить период. В это-то все и упирается. Выделив период, возможно будет достаточно тупо 10 периодов разделить на 10.

После корректировки схемы Вы будете иметь точки пересечения нуля и никаких проблем с вычислением периода быть не должно.
Diusha
Цитата(alexkok @ Dec 30 2010, 11:12) *
У меня ошибка в схеме, цепь ПОС/гистерезиса нужно подключить к средней точке, а не к сигнальной цепи.
Нулём сигнала, соответственно, должна быть средняя точка.

Ну вот, до этого было понятно, а теперь стало непонятно sad.gif wink.gif
Разве приведенная Вами схема не будет выделять пики? По-моему, там все логично

Цитата(alexkok @ Dec 30 2010, 11:12) *
После корректировки схемы Вы будете иметь точки пересечения нуля и никаких проблем с вычислением периода быть не должно.

Я-то как раз хотел сделать схему, выделяющую пики, а не пересечения нуля, чтобы эти пики измерить и получить доп. информацию. Измерение нулей много информации не добавит wink.gif
Сигнал может пересекать ноль больше 2-х раз за период (также как и иметь больше 2-х пиков (верхний и ниж.) за период). Так что, с нулями я окажусь в той же ситуации, только без величины сигнала
alexkok
Цитата(Diusha @ Dec 30 2010, 17:22) *
Ну вот, до этого было понятно, а теперь стало непонятно sad.gif wink.gif
Я-то как раз хотел сделать схему, выделяющую пики, а не пересечения нуля, чтобы эти пики измерить и получить доп. информацию. Измерение нулей много информации не добавит wink.gif
Сигнал может пересекать ноль больше 2-х раз за период (также как и иметь больше 2-х пиков (верхний и ниж.) за период). Так что, с нулями я окажусь в той же ситуации, только без величины сигнала

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

При таких условиях и наличии гистерезиса шумы будут подавляться и лишних переходов через ноль не будет.
Если же Вы хотите обеспечить выделение сигнала и при малых отношениях с/ш, то всё резко усложняется.
Diusha
Цитата(alexkok @ Dec 30 2010, 21:18) *
Этот пример возможен при амплитуде помехи или шума близкой по уровню к амплитуде сигнала.

Нет. Это нарисован сигнал без помехи. Его форма м.б. любой (в разумных пределах) и заранее не известна, в т.ч. и такой.
Diusha
Вот примеры реальных данных, полученных с моей схемой (без введения дополнительного гистерезиса). Отсчеты просто соединены прямыми отрезками.

Код
t=[0,105,214,3290,5516,5626,6234,6335,6438,7464,7571,8925,11937,12046,15184,173
34,17443,18305,18405,19475,19583,20892,23861,23970,27090,29347,29455,29827,30049,
30152,30252,31357,31462,32786,35858,35966,39014,41226,41334,41438,42062,42165,422
66,43337,43441,43564,44679,44780,47723,47831,50988,53237,53347,53481,53660,53957,
54061,54165,55277,55381,55519,56604,56704,59753,62879,65106,65214,65957,66060,661
61,67232,67339,68544,68645,71632,71742,74823,77001,77109,77214,77321,77468,77631,
77735,77839,77941,78043,79140,79251,79445,80426,80530,80632,83605,86791,89031,891
39,89764,89868,89969,90117,91112,91220,92500,95469,95578,98744,101019,101123,1012
43,101347,101451,101555,101658,101760,101880,101982,102948,103054,103159];
d=[189,189,188,133,160,159,158,158,158,159,159,152,190,189,132,159,159,156,156,
158,158,152,188,188,131,157,157,156,155,155,155,158,158,150,188,187,132,158,158,1
58,156,156,156,158,158,157,153,153,188,188,132,159,159,158,158,157,157,158,159,15
9,158,153,153,187,132,158,158,155,156,156,158,157,152,152,188,187,133,157,157,157
,157,156,156,155,155,155,155,158,157,156,152,153,152,188,132,158,158,156,156,156,
156,158,158,153,188,187,132,158,158,157,157,157,157,157,156,157,157,158,159,158];



Код
t=[0,852,999,1390,1939,2047,7531,7711,8141,8741,8981,12866,12970,13717,13925,14
300,14837,14940,20440,20546,21067,21635,21780,25745,25847,26612,26802,27224,27698
,27867,33272,33440,34517,34691,38656,38760,39522,39642,40121,40583,40748,46199,46
306,46810,47398,47588,52389,52594,52987,53494,53629,59079,59188,59710,60249,60472
,64462,65239,65444,65868,66355,66464,72034,72530,73128,73228,77252,77356,78119,78
357,78716,79238,79344,84766,84889,85978,86157,90074,90189,90940,91146,91572,92061
,92196,97594,97830,98232,98801,99007,103852,103957,104450,104909,110484,110592,11
1066,111654,111813,115808,116644,116851,117257,117701,117811,123293,123399,123860
,124460,124620,128556,128659,129407,129659,130050,130554,130663,136114,136222,136
682,137254];
d=[139,133,132,131,131,132,191,191,192,189,188,139,139,133,133,131,132,132,190,
190,192,188,188,139,139,133,133,131,131,131,190,190,188,188,139,138,132,133,129,1
30,130,189,189,191,187,187,131,131,128,130,129,188,188,191,187,186,137,131,131,12
8,129,130,190,192,189,189,138,137,132,131,130,131,131,192,192,190,189,140,140,134
,134,131,132,131,193,193,194,190,190,134,133,130,131,192,192,194,190,190,139,132,
131,129,131,130,191,192,193,190,190,139,139,133,132,131,132,131,192,192,194,191];



Код
t=[0,1632,1736,1836,4002,7495,7603,10935,11051,12906,14504,14635,20280,20388,20
492,20597,23747,23906,25745,27451,33180,33289,33395,36559,36674,36778,38600,40218
,40352,45991,46101,46205,49371,49471,49579,51397,53029,53133,58881,59006,59465,62
273,62375,64258,65826,65930,66030,71738,75099,77130,78714,84521,84626,84730,88046
,89968,91614,91717,97402,97914,98018,100855,101000,102841,104424,104526,104633,10
6719,106825,110303,110407,110862,113681,113785,115663,117250,117351,123069,123565
,123666,126551,128518,130044,136057,136168,136435,136584,139331,139435,141343,142
974,143074,148765,149275,149380,152261,152390,154172,155844,155948,156050,161664,
162176,162280,165163,167024,168731,168831,174432,178122,179908,181601,181718,1873
94,190874,190988,192754,194695,194796,200290];
d=[158,141,141,142,156,195,195,137,137,158,142,141,194,193,193,193,136,135,156,
140,192,192,192,134,133,134,155,139,139,192,192,192,134,134,134,155,139,139,191,1
91,190,133,133,155,139,140,139,193,133,156,141,194,194,193,134,156,141,140,193,19
1,191,134,134,156,141,140,140,154,154,193,193,191,133,133,155,139,139,192,191,191
,133,154,139,192,192,191,191,132,132,155,138,138,195,192,192,135,135,157,138,139,
139,194,193,193,134,157,140,140,193,135,157,140,140,194,133,134,157,138,138,193];


На не самых низких частотах получается вполне нормально. Это что касается схемы. Возможно в дальнейшем понадобится ее подрихтовать.
А пока все мысли об алгоритме.
На глазок-то по картинке период выделить проще простого.
Разброс длительностей даже между самым длинным и самым коротким получается в пределах 2%.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.