|
Помогите со схемно-программным решением для измерения периода, при ограниченных ресурсах |
|
|
|
Dec 27 2010, 03:24
|
Вечный студент
   
Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262

|
На вход девайса может поступать периодический сигнал. А может не поступать, а вместо него – лабуда. Будем считать, что если сигнал есть, то он по крайней мере в разы больше шума, но когда cигнала нет, «лабуда» м.б. большой (как сигнал, если бы он был). Задача – определить, что появился сигнал и измерить его период. Диапазон 1…10 мс, точность нужна порядка 2% (все числа пока ориентировочные). Форма сигнала может быть любой, вовсе не обязательно, что только с двумя экстремумами по времени за период. Вычислительная мощность ограничена, ибо AVR => 8 бит, невысокая тактовая. Плюс загружен еще другой задачей. Обрабатывать непрерывный поток с АЦП, боюсь, некогда, поэтому пытаюсь его минимизировать. Попытался сделать так:  сигнал (с правильной пост. сост.) завожу на аналоговый компаратор и АЦП. Компаратор выдает прерывание по каждой смене состояния (т.е. в обе стороны). По прерыванию запускаю АЦП, и в идеале должен получить отсчеты в моменты минимумов и максимумов.  Реально, конечно, в моменты горбов получаю кучу отсчетов, часть из которых отсекаю по признаку «слишком рано после предыдущего». Вопросы: 1. Удачно ли такое схемное-программное решение для получения отсчетов? 2. (в случае положительного ответа на 1.) Каким путем посоветуете поступить с полученными отсчетами? На заметке а) быстрое преобразование Фурье, б) автокорреляционная функция. Есть еще и в) мысля в сторону алгоритмов поиска периода подстроки в строке. 3. Или вообще надо всё совсем не так?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 15)
|
Dec 28 2010, 10:27
|
Вечный студент
   
Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262

|
Цитата(alexeyv @ Dec 28 2010, 06:41)  частота полезного периодического сигнала в каком диапазоне? может стоит сначала прогнать сигнал через полосовой фильтр, а потом производить дальнейшую обработку? Я же написал: период полезного сигнала 1...10 мс (ориентировочно). Наверно нечетко сформулировал Фильтры ставить не хочется, хочетс с самым минимальным минимумом компонентов. Ну если уж окажется никак, то тут уж шо уж тут уж (с). Тем более, что шумы в основном примерно в том же диапазоне Цитата(KARLSON @ Dec 28 2010, 08:22)  Так отсчёты не нужны для основной рабготы? А что если Вам считать период таймером (наверника он есть в АВР), запускающийся от прерывания компаратора? Само собой, таймером определяю моменты срабатывания компаратора (Input Capture mode). Я привел пример формы сигнала, для которого в идеале за период (его) я должен получить 6 отсчетов. Но сигнал может быть и "хуже" (больше отсчетов), а может быть синусоида (2 отсчета), наперед это неизвестно. Поэтому чтобы из кучи отсчетов выудить период, нужен какой-то алгоритм. Это раз. А два - это то, что реально на период я получаю не 6 (как в примере), а десятки отсчетов, из которых надо как-то отсечь лишние (чтобы меньше обрабатывать), но "не выплеснуть и младенца". P.S. Под отсчетом я здесь подразумеваю пару: [момент времени (по сигналу с компаратора); величина в этот момент (с АЦП)]
Сообщение отредактировал Diusha - Dec 28 2010, 10:28
|
|
|
|
|
Dec 28 2010, 11:14
|

Знающий
   
Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402

|
Цитата если сигнал есть, то он по крайней мере в разы больше шума, но когда cигнала нет, «лабуда» м.б. большой (как сигнал, если бы он был). Задача – определить, что появился сигнал и измерить его период. Получается, что только компаратором не отделить интервалы сигнала от остального времени шума, т.к. компаратор замучает Вас прерываниями на шуме. Тупо и напрямую я бы стал решать так: 1. Набирал бы некий буфер, куда помещались бы, как минимум, два периода минимально возможной частоты. 2. Прогонял БПФ с целью выявить максимумы частотного спектра 3. По полученным частотным компонентам брал бы ширину окна величиной с период и методом наименьших квадратов сравнивал бы "кадры" с шагом в ширину окна. 4. За повторяемый сигнал выбрал бы тот период, у которого наименьшее расхождение по погрешности сравнения кадров.
--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
|
|
|
|
|
Dec 29 2010, 03:05
|
Вечный студент
   
Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262

|
Цитата(Евгений Николаев @ Dec 28 2010, 17:14)  3. По полученным частотным компонентам брал бы ширину окна величиной с период и методом наименьших квадратов сравнивал бы "кадры" с шагом в ширину окна. 4. За повторяемый сигнал выбрал бы тот период, у которого наименьшее расхождение по погрешности сравнения кадров. Т.е., для каждого полученного частотного компонента брать свое окно и далее по тексту? Тогда точно времени не хватит  И, насколько я понимаю, для такого алгоритма нужно отсчеты получать непрерывным потоком (компаратор в пролете)? Цитата(Designer56 @ Dec 28 2010, 19:10)  а просто отфильтровать сигнал на входе до 1 кГц? Проще не придумаешь. Религия не позволяет? Религия мне, как атеисту, позволяет все. Но мысль непонятна. Что даст фильтрование? Я не силен в данной теме, поэтому посните, пожалуйста. Может Вы имеете в виду наделать фильтров (программно) от 100 до 1000 Гц с шагом 2%? Напоминаю: AVR  Цитата(GetSmart @ Dec 28 2010, 20:47)  Вы точно понимаете как работает эта схема?! Да. Если этот вопрос трактовать несколько иначе ("Как работает эта схема?"), ответ будет более развернутый  Напряжение на "-" компаратора всегда будет отставать от "+" (вх. сигнала). (Речь о мгновенных напряжениях) Допустим, входное напряжение растет. На "-" оно будет чуть ниже. Вх. н. перестало расти, пошло на убыль. Теперь на "-" напр. больше, чем на "+" - получаю прерывание. Реально (по понятным причинам) получаю не 1 прер., а много
|
|
|
|
|
Dec 29 2010, 03:36
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(Diusha @ Dec 29 2010, 09:05)  Если этот вопрос трактовать несколько иначе ("Как работает эта схема?"), ответ будет более развернутый  Напряжение на "-" компаратора всегда будет отставать от "+" (вх. сигнала). (Речь о мгновенных напряжениях) Допустим, входное напряжение растет. На "-" оно будет чуть ниже. Вх. н. перестало расти, пошло на убыль. Теперь на "-" напр. больше, чем на "+" - получаю прерывание. Реально (по понятным причинам) получаю не 1 прер., а много Крайне сомнительная схема, работать будет только на идеальной синусоиде (да Вы сами в этом убедились). Если время измерения не критично можно попробовать сделать что-то вроде ФАПЧ. Достаточно будет 1-4 отсчета на измеряемый период. В плане выч. затрат это будет самое экономное решение, в плане программирования довольно геморное, т.к. частота может быть в довольно широких пределах. Да, предполагается что момент взятие отсчета АЦП можно задавать программно.
--------------------
ну не художники мы...
|
|
|
|
|
Dec 29 2010, 04:39
|
Знающий
   
Группа: Участник
Сообщений: 609
Регистрация: 3-03-07
Из: San Jose
Пользователь №: 25 837

|
Цитата(Diusha @ Dec 28 2010, 17:27)  Я же написал: период полезного сигнала 1...10 мс (ориентировочно). Наверно нечетко сформулировал Фильтры ставить не хочется, хочетс с самым минимальным минимумом компонентов. Но придется, хотя бы одно звено. Цитата Само собой, таймером определяю моменты срабатывания компаратора (Input Capture mode). Я привел пример формы сигнала, для которого в идеале за период (его) я должен получить 6 отсчетов. Но сигнал может быть и "хуже" (больше отсчетов), а может быть синусоида (2 отсчета), наперед это неизвестно. Поэтому чтобы из кучи отсчетов выудить период, нужен какой-то алгоритм. Это раз. А два - это то, что реально на период я получаю не 6 (как в примере), а десятки отсчетов, из которых надо как-то отсечь лишние (чтобы меньше обрабатывать), но "не выплеснуть и младенца".
P.S. Под отсчетом я здесь подразумеваю пару: [момент времени (по сигналу с компаратора); величина в этот момент (с АЦП)] Предлагаю: 1. Изменить схему, добавив гистерезис
2. Алгоритм примерно такой: - считаете средний, максимальный и минимальный полупериоды/периоды на скользящем окне; - считаете некое подобие "дисперсии", попроще; - если "дисперсия" меньше порога, значит есть сигнал.
--------------------
|
|
|
|
|
Dec 30 2010, 04:12
|
Вечный студент
   
Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262

|
Цитата(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 максимума (≈одинаковых) на период. Но наверно есть покрасивше алгоритм
|
|
|
|
|
Dec 30 2010, 05:12
|
Знающий
   
Группа: Участник
Сообщений: 609
Регистрация: 3-03-07
Из: San Jose
Пользователь №: 25 837

|
Цитата(Diusha @ Dec 30 2010, 11:12)  Вот это идея мне понравилась! Спасибо! Только у АВРок, к сожалению, у компаратора нет выхода на улицу. Придется на внешнем операционнике сделать. Программно выводить выход компаратора по прерыванию – возможны ошибки. Хотя, кто его знает… У меня ошибка в схеме, цепь ПОС/гистерезиса нужно подключить к средней точке, а не к сигнальной цепи. Нулём сигнала, соответственно, должна быть средняя точка. Цитата Дело «за малым»: определить период. В это-то все и упирается. Выделив период, возможно будет достаточно тупо 10 периодов разделить на 10. После корректировки схемы Вы будете иметь точки пересечения нуля и никаких проблем с вычислением периода быть не должно.
--------------------
|
|
|
|
|
Dec 30 2010, 11:22
|
Вечный студент
   
Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262

|
Цитата(alexkok @ Dec 30 2010, 11:12)  У меня ошибка в схеме, цепь ПОС/гистерезиса нужно подключить к средней точке, а не к сигнальной цепи. Нулём сигнала, соответственно, должна быть средняя точка. Ну вот, до этого было понятно, а теперь стало непонятно  Разве приведенная Вами схема не будет выделять пики? По-моему, там все логично Цитата(alexkok @ Dec 30 2010, 11:12)  После корректировки схемы Вы будете иметь точки пересечения нуля и никаких проблем с вычислением периода быть не должно. Я-то как раз хотел сделать схему, выделяющую пики, а не пересечения нуля, чтобы эти пики измерить и получить доп. информацию. Измерение нулей много информации не добавит  Сигнал может пересекать ноль больше 2-х раз за период (также как и иметь больше 2-х пиков (верхний и ниж.) за период). Так что, с нулями я окажусь в той же ситуации, только без величины сигнала
|
|
|
|
|
Dec 30 2010, 15:18
|
Знающий
   
Группа: Участник
Сообщений: 609
Регистрация: 3-03-07
Из: San Jose
Пользователь №: 25 837

|
Цитата(Diusha @ Dec 30 2010, 17:22)  Ну вот, до этого было понятно, а теперь стало непонятно  Я-то как раз хотел сделать схему, выделяющую пики, а не пересечения нуля, чтобы эти пики измерить и получить доп. информацию. Измерение нулей много информации не добавит  Сигнал может пересекать ноль больше 2-х раз за период (также как и иметь больше 2-х пиков (верхний и ниж.) за период). Так что, с нулями я окажусь в той же ситуации, только без величины сигнала  Этот пример возможен при амплитуде помехи или шума близкой по уровню к амплитуде сигнала. Но Вы писали, что Цитата Будем считать, что если сигнал есть, то он по крайней мере в разы больше шума При таких условиях и наличии гистерезиса шумы будут подавляться и лишних переходов через ноль не будет. Если же Вы хотите обеспечить выделение сигнала и при малых отношениях с/ш, то всё резко усложняется.
--------------------
|
|
|
|
|
Jan 9 2011, 00:51
|
Вечный студент
   
Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262

|
Вот примеры реальных данных, полученных с моей схемой (без введения дополнительного гистерезиса). Отсчеты просто соединены прямыми отрезками. Код 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%.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|