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

|
На вход девайса может поступать периодический сигнал. А может не поступать, а вместо него – лабуда. Будем считать, что если сигнал есть, то он по крайней мере в разы больше шума, но когда cигнала нет, «лабуда» м.б. большой (как сигнал, если бы он был). Задача – определить, что появился сигнал и измерить его период. Диапазон 1…10 мс, точность нужна порядка 2% (все числа пока ориентировочные). Форма сигнала может быть любой, вовсе не обязательно, что только с двумя экстремумами по времени за период. Вычислительная мощность ограничена, ибо AVR => 8 бит, невысокая тактовая. Плюс загружен еще другой задачей. Обрабатывать непрерывный поток с АЦП, боюсь, некогда, поэтому пытаюсь его минимизировать. Попытался сделать так:  сигнал (с правильной пост. сост.) завожу на аналоговый компаратор и АЦП. Компаратор выдает прерывание по каждой смене состояния (т.е. в обе стороны). По прерыванию запускаю АЦП, и в идеале должен получить отсчеты в моменты минимумов и максимумов.  Реально, конечно, в моменты горбов получаю кучу отсчетов, часть из которых отсекаю по признаку «слишком рано после предыдущего». Вопросы: 1. Удачно ли такое схемное-программное решение для получения отсчетов? 2. (в случае положительного ответа на 1.) Каким путем посоветуете поступить с полученными отсчетами? На заметке а) быстрое преобразование Фурье, б) автокорреляционная функция. Есть еще и в) мысля в сторону алгоритмов поиска периода подстроки в строке. 3. Или вообще надо всё совсем не так?
|
|
|
|
|
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-х пиков (верхний и ниж.) за период). Так что, с нулями я окажусь в той же ситуации, только без величины сигнала  Этот пример возможен при амплитуде помехи или шума близкой по уровню к амплитуде сигнала. Но Вы писали, что Цитата Будем считать, что если сигнал есть, то он по крайней мере в разы больше шума При таких условиях и наличии гистерезиса шумы будут подавляться и лишних переходов через ноль не будет. Если же Вы хотите обеспечить выделение сигнала и при малых отношениях с/ш, то всё резко усложняется.
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|