Перейти к содержанию
    

Помогите со схемно-программным решением для измерения периода

На вход девайса может поступать периодический сигнал. А может не поступать, а вместо него – лабуда. Будем считать, что если сигнал есть, то он по крайней мере в разы больше шума, но когда cигнала нет, «лабуда» м.б. большой (как сигнал, если бы он был). Задача – определить, что появился сигнал и измерить его период. Диапазон 1…10 мс, точность нужна порядка 2% (все числа пока ориентировочные).

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

Вычислительная мощность ограничена, ибо AVR => 8 бит, невысокая тактовая. Плюс загружен еще другой задачей.

Обрабатывать непрерывный поток с АЦП, боюсь, некогда, поэтому пытаюсь его минимизировать. Попытался сделать так:

4f99dfcdb98b.jpg

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

3964a7bd6b23t.jpg

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

 

Вопросы:

 

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

 

2. (в случае положительного ответа на 1.) Каким путем посоветуете поступить с полученными отсчетами?

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

 

3. Или вообще надо всё совсем не так?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

частота полезного периодического сигнала в каком диапазоне?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2.Каким путем посоветуете поступить с полученными отсчетами?

 

Так отсчёты не нужны для основной рабготы? А что если Вам считать период таймером (наверника он есть в АВР), запускающийся от прерывания компаратора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

частота полезного периодического сигнала в каком диапазоне?

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

Я же написал: период полезного сигнала 1...10 мс (ориентировочно). Наверно нечетко сформулировал

Фильтры ставить не хочется, хочетс с самым минимальным минимумом компонентов. Ну если уж окажется никак, то тут уж шо уж тут уж (с).

Тем более, что шумы в основном примерно в том же диапазоне

 

Так отсчёты не нужны для основной рабготы? А что если Вам считать период таймером (наверника он есть в АВР), запускающийся от прерывания компаратора?

Само собой, таймером определяю моменты срабатывания компаратора (Input Capture mode).

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

 

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

Изменено пользователем Diusha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если сигнал есть, то он по крайней мере в разы больше шума, но когда cигнала нет, «лабуда» м.б. большой (как сигнал, если бы он был). Задача – определить, что появился сигнал и измерить его период.

Получается, что только компаратором не отделить интервалы сигнала от остального времени шума, т.к. компаратор замучает Вас прерываниями на шуме.

Тупо и напрямую я бы стал решать так:

1. Набирал бы некий буфер, куда помещались бы, как минимум, два периода минимально возможной частоты.

2. Прогонял БПФ с целью выявить максимумы частотного спектра

3. По полученным частотным компонентам брал бы ширину окна величиной с период и методом наименьших квадратов сравнивал бы "кадры" с шагом в ширину окна.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а просто отфильтровать сигнал на входе до 1 кГц? Проще не придумаешь. Религия не позволяет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По прерыванию запускаю АЦП, и в идеале должен получить отсчеты в моменты минимумов и максимумов.

Вы точно понимаете как работает эта схема?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3. По полученным частотным компонентам брал бы ширину окна величиной с период и методом наименьших квадратов сравнивал бы "кадры" с шагом в ширину окна.

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

Т.е., для каждого полученного частотного компонента брать свое окно и далее по тексту? Тогда точно времени не хватит :(

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

 

а просто отфильтровать сигнал на входе до 1 кГц? Проще не придумаешь. Религия не позволяет?

Религия мне, как атеисту, позволяет все. Но мысль непонятна. Что даст фильтрование? Я не силен в данной теме, поэтому посните, пожалуйста.

Может Вы имеете в виду наделать фильтров (программно) от 100 до 1000 Гц с шагом 2%? Напоминаю: AVR :(

 

Вы точно понимаете как работает эта схема?!

Да.

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

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

 

Если время измерения не критично можно попробовать сделать что-то вроде ФАПЧ. Достаточно будет 1-4 отсчета на

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

Да, предполагается что момент взятие отсчета АЦП можно задавать программно.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я же написал: период полезного сигнала 1...10 мс (ориентировочно). Наверно нечетко сформулировал

Фильтры ставить не хочется, хочетс с самым минимальным минимумом компонентов.

Но придется, хотя бы одно звено.

Само собой, таймером определяю моменты срабатывания компаратора (Input Capture mode).

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

 

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

Предлагаю:

1. Изменить схему, добавив гистерезис

post-25837-1293597027_thumb.jpg

2. Алгоритм примерно такой:

- считаете средний, максимальный и минимальный полупериоды/периоды на скользящем окне;

- считаете некое подобие "дисперсии", попроще;

- если "дисперсия" меньше порога, значит есть сигнал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Если время измерения не критично можно попробовать сделать что-то вроде ФАПЧ.

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

 

1. Изменить схему, добавив гистерезис

Вот это идея мне понравилась! Спасибо!

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

 

2. Алгоритм примерно такой:

- считаете средний, максимальный и минимальный полупериоды/периоды на скользящем окне;

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

 

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

58fc06707629.jpg

Можно, добавив еще несколько IF–THEN, предусмотреть и 2 и 3 максимума (≈одинаковых) на период. Но наверно есть покрасивше алгоритм

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот это идея мне понравилась! Спасибо!

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

У меня ошибка в схеме, цепь ПОС/гистерезиса нужно подключить к средней точке, а не к сигнальной цепи.

Нулём сигнала, соответственно, должна быть средняя точка.

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

После корректировки схемы Вы будете иметь точки пересечения нуля и никаких проблем с вычислением периода быть не должно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня ошибка в схеме, цепь ПОС/гистерезиса нужно подключить к средней точке, а не к сигнальной цепи.

Нулём сигнала, соответственно, должна быть средняя точка.

Ну вот, до этого было понятно, а теперь стало непонятно :( ;)

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

 

После корректировки схемы Вы будете иметь точки пересечения нуля и никаких проблем с вычислением периода быть не должно.

Я-то как раз хотел сделать схему, выделяющую пики, а не пересечения нуля, чтобы эти пики измерить и получить доп. информацию. Измерение нулей много информации не добавит ;)

Сигнал может пересекать ноль больше 2-х раз за период (также как и иметь больше 2-х пиков (верхний и ниж.) за период). Так что, с нулями я окажусь в той же ситуации, только без величины сигнала

95801c3930a8.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вот, до этого было понятно, а теперь стало непонятно :( ;)

Я-то как раз хотел сделать схему, выделяющую пики, а не пересечения нуля, чтобы эти пики измерить и получить доп. информацию. Измерение нулей много информации не добавит ;)

Сигнал может пересекать ноль больше 2-х раз за период (также как и иметь больше 2-х пиков (верхний и ниж.) за период). Так что, с нулями я окажусь в той же ситуации, только без величины сигнала

95801c3930a8.jpg

Этот пример возможен при амплитуде помехи или шума близкой по уровню к амплитуде сигнала.

Но Вы писали, что

Будем считать, что если сигнал есть, то он по крайней мере в разы больше шума

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этот пример возможен при амплитуде помехи или шума близкой по уровню к амплитуде сигнала.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...