Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Поиск частоты  (Прочитано 42128 раз)
0 Пользователей и 1 Гость смотрят эту тему.
direct
Гость
« : 16-11-2004 21:01 » 

Пришлось задачку решить - определить частоту цифрового сигнала (сигнал периодический одной частоты  от 0.0001 Гц до 1 Гц, пишется в файл с дискретом 10 раз в секунду). В принципе, если "тупо" найти спектр в указанном диапазоне, то частота определяется, но это много времени занимает. У кого есть соображения, как частоту быстрее можно найти (или сузить диапазон поиска частот)? И как быть, если не полный период сигнала записан? Спасибо за ответ!
Записан
Alf
Гость
« Ответ #1 : 16-11-2004 22:15 » 

Если под "цифровым сигналом" понимаются импульсы с двумя уровнями (0-1), то я бы не стал связываться с определением спектра (во-первых, спектральное разложение - не столь простая вещь, если нет готовых инструментов, во-вторых, спектр импульсного сигнала с крутыми фронтами содержит слишком много гармоник, которые нам к тому же совершенно не нужны). Достаточно определить период, измеряя интервал между переходами 0-1 и 1-0, а потом вычислить частоту как обратную периоду величину (тем более что именно так обычно и работают частотомеры при измерении очень низких частот).

Относительно второго вопроса (неполный период) уверен, что для цифрового сигнала методики не существует - невозможно, наблюдая постоянный уровень 0 или 1, предсказать время переключения заранее. Если же сигнал аналоговый, например, синусоида стабильной амплитуды, то не составит труда экстраполировать его до точки пересечения с осью Х, а там опять же определить частоту через период.
Записан
direct
Гость
« Ответ #2 : 16-11-2004 23:51 » 

Под "цифровым" сигналом понимается сигнал, полученный с АЦП (уровень кода от 0 до 65535). Я видимо, неверно выразился: это аналоговый оцифрованный сигнал! А про аналоговый сигнал известно, что он периодический (частота от 1 до 0.0001 Гц). Если искать спектр с таким шагом (0.0001 Гц), это вызывает большие накладные расходы. В интервал записи может попасть как несколько периодов, так и менее одного периода! Я более конкретно спрошу: что в такой ситуации выгоднее - оптимизировать расчет спектра или как-то сузить диапазон частот сигнала (как Не понял) (а далее тупо считать спектр)  - вот в чем вопрос!
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 17-11-2004 07:18 » 

Ни фига себе диапазон частот у аналогового сигнала!
Это ж сколько точек?
С другой стороны, если данные записываются в файл, то я так понимаю, что о бытродействии преобразований речи и быть не должно. Все- таки не real-time.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alf
Гость
« Ответ #4 : 17-11-2004 08:04 » 

direct, а вообще есть ли необходимость в расчете спектра? Если сигнал периодический, достаточно отследить переход через 0 (ну или через 32768, если он смещен на середину диапазона). Этим определится период первой гармоники, из него вычисляется частота. Остальные гармоники, я так понял, и не требуются?
Считать спектр сигнала на участке меньше одного периода в общем случае, по моему убеждению, затея безнадежная. Если амплитуда и форма сигнала известны, тогда имеет смысл воспользоваться интерполяцией, попытавшись совместить известный кусок с рассчитанным полным периодом, а потом определить период интерполированной функции тем же способом, что и выше.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 17-11-2004 08:36 » 

Укажи частоту оцифровки сигнала, гладкость сигнала. Преобразование Фурье позволяет вычислить спектр имея по крайней мере 3 точки.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alf
Гость
« Ответ #6 : 17-11-2004 10:57 » 

И сколько же гармоник можно определить по 3 точкам? Про количество периодов сигнала уже и спрашивать неловко...
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 17-11-2004 11:25 » 

неловко -не спрашивай Улыбаюсь
Если известна частота дискретизации - достатосчно 3! точек.
Количество гармоник - а сколько надо?
Надо только вспомнить преобразование Фурье.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alf
Гость
« Ответ #8 : 17-11-2004 12:36 » 

Цитата: Sla
...Надо только вспомнить преобразование Фурье.

Золотые слова.

Начнем воспоминания с того, что у непериодического сигнала (3 точки запросто могут не охватить период) спектр сигнала непрерывен, и посему само понятие гармоники лишено смысла, можно говорить лишь о спектральной плотности. Если ты умеешь определять частоту сигнала по спектральной плотности, то я, наверное, не знаю математики...

Если же 3 точки приходится на несколько периодов сигнала, то старина Котельников должен в гробу перевернуться от таких методов обработки сигналов (да и Найквисту не поздоровится). Ты всерьез способен отличить синусоиду от меандра или там пилы по 3-м точкам?

Предлагаю эксперимент. Я беру какую-либо кривую, делаю 3 отсчета и сообщаю результат. Ты мне в ответ сообщаешь параметры разложения по Фурье (скажем, трех гармоник будет достаточно), и сравниваем результаты. В случае совпадения признаю свое полное невежество в данном вопросе и преклоняюсь перед твоим мастерством. Ну а если нет - не обессудь, вывод будет с точностью до наоборот. Думаю, вычисление по 3-м точкам не будет столь обременительным, чтобы эксперимент занял много времени.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 17-11-2004 12:48 » 

Sla, см. первый пост:
Цитата: direct
пишется в файл с дискретом 10 раз в секунду


direct, расскажи детальнее: происхождение и форма сигнала, предпологаемый размер буфера, цель задачи.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 17-11-2004 13:15 » 

пишется в файл 10 раз в секунду, - не есть частота оцифровки

Построить спеткр по 3 точкам - построим Улыбаюсь
с частотой сигнала - проблемка, согласен. и я говорил про спектр, а не про частоту.
Сигнал периодический!
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alf
Гость
« Ответ #11 : 17-11-2004 13:31 » 

Цитата: Sla
...с частотой сигнала - проблемка, согласен. и я говорил про спектр, а не про частоту.

Так, это дело все интереснее становится... Как говорится, чем дальше в лес, тем толще партизаны.

Вообще-то спектр периодического сигнала представляет собой набор частот и амплитуд его гармонических составляющих (в полном варианте добавляется еще и фаза, но в нашем случае она вряд ли интересна). При этом частота сигнала равна частоте основной (первой)гармоники.

То есть определить частоту проблематично, а получить спектр - запросто? Неувязочки...
Цитата: Sla
Сигнал периодический!

И что, по трем отсчетам реально определить, когда они повторятся снова? Тут даже Нострадамус руки опустил бы.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 17-11-2004 13:39 » 

послушай Зин! не трогай Нострадамуса.
частотные составляющие сигнала, но не частоту сигнала. Есть разница?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alf
Гость
« Ответ #13 : 17-11-2004 14:12 » 

Цитата: Sla
...частотные составляющие сигнала, но не частоту сигнала. Есть разница?

Нет разницы. Потому как в разложении периодического сигнала в ряд Фурье первая составляющая и есть частота повторения сигнала. Если ты действительно знаешь частотные составляющие сигнала, то автоматически получаешь и частоту самого сигнала.

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

Код:
0.264095659
0.255317054
0.299569688


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

Принимая частоту выборки за единицу, жду данных о спектре сигнала.
Записан
direct
Гость
« Ответ #14 : 17-11-2004 15:23 » 

Цитата: RXL
Sla, см. первый пост:
Цитата: direct
пишется в файл с дискретом 10 раз в секунду


direct, расскажи детальнее: происхождение и форма сигнала, предпологаемый размер буфера, цель задачи.


Происхождение сигнала - это биение колебательной системы, форма (теоретически - затухающая синусоида), реально получается "кривоватая" синусоида, размер буфера 256 точек. Цель всего этого - определить частоту биений в режиме реального времени. А в файл я пока лишь для отладки пишу.
Записан
direct
Гость
« Ответ #15 : 17-11-2004 15:29 » 

Я вот что хотел сказать: это сигнал обладает шумами, поэтому идею поиска перехода через ноль я пока "похоронил" (не знаю, как ее реализовать). Идею "по 3 точкам" хороню сразу (обратили внимание на диапазон частот?), если частота 1 Гц будет, то по трем точкам не определишь частоты! Что касается поиска спектра, то я по максимуму спектра нахожу основную частоту, но, блин. медленно работает (слишком широкий диапазон). У кого есть идеи по сужению диапазона частот этого сигнала?
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #16 : 17-11-2004 16:48 » 

direct, есл у тебя буфер 256 точек, то неужели дискретное преобразование для 256 точек медлено работает?

Кстати несколько непоняток. Как с таким буфером ты хочешь ловить частоту в 0.0001Гц ? период займет 100000 точек. Улыбаюсь
Записан

Megabyte be with you!
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 17-11-2004 21:05 » 

Есть мнение, что если было бы возможно восстановить спектр по 3 точкам сигнала (пусть периодического), можно было бы создать алгоритм сжатия, на порядки превосходящий существующие по степени сжатия.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
direct
Гость
« Ответ #18 : 18-11-2004 02:49 » 

Цитата: Lex
direct, есл у тебя буфер 256 точек, то неужели дискретное преобразование для 256 точек медлено работает?

Кстати несколько непоняток. Как с таким буфером ты хочешь ловить частоту в 0.0001Гц ? период займет 100000 точек. Улыбаюсь



Только одним способом - увеличивать интервал между точками! Будет не 10 точек в секунду, а, скажем, 1 точка за 10 сек:). Если период не получится, то придется по неполному периоду частоту искать!
Но 256 точек  - это для ЦПС, где будет работать алгоритм в реальном времени. А в файло я пока могу и побольше точек записать (главное, чтобы в принципе частота определялась!)
Записан
direct
Гость
« Ответ #19 : 18-11-2004 03:05 » 

Расчет спектра можно ускорить, применив ШПФ (шустрое преобразование фурье Улыбаюсь)! А если в буфере данных меньше периода, то расчет спектра дает лишь оценку основной частоты (искажения большие!). Но ведь я видел, как цифровые осциллографы выводят частоту и амплитуду сигналов (даже с неполным периодом), какие алгоритмы там применяются?Улыбаюсь
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #20 : 18-11-2004 10:14 » 

direct, если ты просто будешь менять частоту дескритизации, нарвешся на строб эффект. Если работал с цифровыми осцилографами, то должен знать, что это такое.

Цитата

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


И точность этих измерений +- лапоть.

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

Megabyte be with you!
direct
Гость
« Ответ #21 : 18-11-2004 14:58 » 

По ходу дела, так и придется делать. Сначала фильтром урезать полосу частот, далее поиск спектра. Благодарю за обсуждение вопроса! Улыбаюсь
Записан
Alf
Гость
« Ответ #22 : 18-11-2004 15:10 » 

Цитата: direct
Я вот что хотел сказать: это сигнал обладает шумами, поэтому идею поиска перехода через ноль я пока "похоронил" (не знаю, как ее реализовать).

А не проще подавить шумы фильтром и искать-таки переход через 0 сглаженной кривой? Зачем возиться со спектром, если все равно информация о гармониках, кроме основной, не нужна?
Цитата: direct
Идею "по 3 точкам" хороню сразу (обратили внимание на диапазон частот?), если частота 1 Гц будет, то по трем точкам не определишь частоты!

Что похоронил - это правильно, уж больно порочная идея. Только при чем тут диапазон частот? А если частота 1 ГГц будет, то определишь? Тут в самом принципе дело.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 19-11-2004 07:16 » 

Хлчу еще напомнить неплохую книгу: http://www.dspguide.com
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
direct
Гость
« Ответ #24 : 19-11-2004 18:28 » 

Цитата: Alf

А не проще подавить шумы фильтром и искать-таки переход через 0 сглаженной кривой? Зачем возиться со спектром, если все равно информация о гармониках, кроме основной, не нужна?

Что похоронил - это правильно, уж больно порочная идея. Только при чем тут диапазон частот? А если частота 1 ГГц будет, то определишь? Тут в самом принципе дело.


Что-ж, это было-бы здорово (гораздо проще поиска спектра). Но если период не влезет в буфер накопления (или даже полупериод!), тогда как вторую точку пересечения искать? А диапазон частот притом, что надо просканировать спектр от 0.0001 Гц до 1 Гц с шагом 0.0001 Гц - широко слишком получается Улыбаюсь  - желательно сузить этот диапазон!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 19-11-2004 19:23 » 

direct, можно считать спектр ступенчато:
1) выборка 10Гц на 256 точек: 5-0.039Гц
2) из предыдущей выборки выбрать с некоторым шагом несколько семплов (напр. 2 точки) и делать это каждый раз при выполнении 1-го шага. Когда наберется полный буфер (скажем, те же 256 точек), то выполнить fft и для него (получается 10Гц/128 : 0.039-0.0003Гц).

Т.е., каждые 25.6 секунды у тебя вычисляется первый спектр, а каждые 3276.8 - второй. Кстати, перед выборкой семплов для второго шага полезно будет прогнать его через фильтр, да бы обрезать частоты выше половины частоты семплирования.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Alf
Гость
« Ответ #26 : 22-11-2004 14:17 » 

Цитата: direct
Что-ж, это было-бы здорово (гораздо проще поиска спектра). Но если период не влезет в буфер накопления (или даже полупериод!), тогда как вторую точку пересечения искать?

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

Обработка будет выглядеть примерно так.

1. Набить буфер размером n байт входными данными.

2. Если нужно избавиться от шумов, произвести фильтрацию. Лично я для подобной задачи пользовался таким примитивным способом: берем выборку плюс-минус k элементов относительно текущей точки (k выбираем эмпирически, но небольшое, порядка 2-3) и находим среднее арифметическое значение, которое и принимаем в качестве значения сигнала в текущей точке. Конечно, такое усреднение сглаживает пики сигнала, поэтому может оказаться, что лучше считать не среднее арифметическое, а применять различные весовые коэффициенты.

3. По отфильтрованным значениям найти пересечение кривой с осью абсцисс. Проще всего найти пару соседних точек с противоположным знаком, которые заведомо лежат по разные стороны оси абсцисс, и линейной интерполяцией определить точку пересечения (или использовать более гладкую интерполяцию, если точности линейной окажется недостаточно).

При таком подходе даже не понадобится буфер на 256 точек, он здесь явно избыточен. Вполне достаточно будет буфера размером 2*k+1, где, как я уже говорил, k<10.

Буфер в данном случае организован в виде очереди FIFO, т.е. при считывании очередного слова из входного файла все данные сдвигаются, выталкивая самое старое значение.

Могу добавить, что подобные методы обработки неплохо зарекомендовали себя в промышленных установках, для которых я создавал программное обеспечение. Разумеется, затраты вычислительных ресурсов были минимальны.
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #27 : 23-11-2004 14:09 » 

Согласен с методом Alf'а. Тут вся тонкость будет найти правильное пересечени ноля. Скорее всего придется немного поиграться с разными методами фильтрации и усреднения сигнала. А так наиболее правильный метод из предложенных для детектирования такого диапазона частот.
Записан

Megabyte be with you!
direct
Гость
« Ответ #28 : 26-11-2004 17:07 » 

Очень привлекательный метод. Согласен, с фильтрами придется повозиться (ведь надо монотонный сигнал получить). Ну а если в буфер попадет, скажем, только одно пересечение с нулем (меньше, чем полупериод), что тогда делать?
Записан
Alf
Гость
« Ответ #29 : 26-11-2004 21:04 » 

direct, я, наверное, не до конца прояснил свою идею.

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

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

Когда при очередном отсчете найден переход функции через 0:

1. Отмечаешь текущее время отсчета.
2. Находишь разницу между временем текущего перехода через 0 и предыдущего. Как догадываешься, это и есть период сигнала.
3. Находишь частоту как величину, обратную периоду.
4. Сохраняешь найденное время переходя через 0 как предыдущее и ищешь следующий переход.

Итак, все, что тебе нужно, - это небольшой массив порядка 10 элементов для усреднения сигнала (фильтровать помехи) и пара переменных - время текущего и предыдущего перехода функции через 0. Обрати внимание, что период сигнала вовсе не обязан помещаться в буфере при таком методе.

Собственно, и буфер-то нужен только лишь для фильтрации сигнала. Если сигнал достаточно чистый или на входе АЦП стоит интегратор, можно обрабатывать значения по одному, сведя размер входного буфера к единице.

По крайней мере, при таких накладных расходах (менее 20 байт на переменные и пара простых процедур) я не вижу другого метода, который сравнился бы по точности. Полноценный анализ спектра потребует огромных ресурсов оперативной памяти и процессорного времени, и при этом даст слишком много избыточной информации. А авантюры вроде восстановления спектра по трем отсчетам (или даже тридцати трем) и обсуждению не подлежат, это скорее задача для шоу Валдиса Пельша (угадаю мелодию с трех нот).
Записан
xelos
Гость
« Ответ #30 : 27-11-2004 18:43 » 

если файл пишется 10 раз в секунду, максимальная частота сигнала - 1 Гц, то проблемы с 20 байтами фильтрами. По известной теореме (всегда забываю этого американского математика), частота сигнала для оцифровки (для фильтра  в нашем случае), должна быть в два раза выше максимальной частоты нашего исходного сигнала. Т.е. для использования фильтра из 20 значений, нужно как минимум брать сигнал с частотой 40 Гц, а не 10 как указывалось в самом начале.
а вообще для фильтрации входного сигнала можно даже не морочиться с интеграторами - кондер небольшой (в зависимости от величины шума) или R-C цепочку, где 1/R*C (по памяти пишу, может обратное отношение) - частота среза, например герц 10, если полезный сигнал 1 Герц, достаточно хорошо уже фильтруют. Плюс сам АЦП как фильтр...
а что за система, если не секрет? и какое отношение шум/полезный сигнал?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #31 : 27-11-2004 19:09 » 

xelos, не все так сложно: 1 значение текущее, а 9 за предыдущие отсчеты.
y(n)=sum(h(n)*x(n-k), k=0..N-1
Пример FIR-фильтра:
Код:

double z[10(;
double h[10(;

void init)void: | int i; for)i=1;i<10;i++: z[i(=0; "

double pass)double in_val: |
  int i;
  double res=0;

  z[0(=in_val;
  for)i=0;i<10;i++: res+=z[i(*h[i(;
  for)i=9;i;i++: z[i(=z[i-1(;
  return res;
  "

P.S.: не знал, что Котельников был американцем...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Alf
Гость
« Ответ #32 : 27-11-2004 23:19 » 

Цитата: RXL
P.S.: не знал, что Котельников был американцем...

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

xelos, в данном случае размер буфера для фильтрации помех не имеет никакого отношения к частоте выборки.
Записан
xelos
Гость
« Ответ #33 : 28-11-2004 11:29 » 

я просто в Европе обучался...

если период синусоиды 1 Гц, вы выбираете значения 10 раз в секунду с буфером в 20 значений. Т.е. вы усредняете фактически 2 периода!!!! о каком фильтре речь???
Записан
xelos
Гость
« Ответ #34 : 28-11-2004 11:55 » 

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

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #35 : 28-11-2004 16:33 » 

Цитата: xelos
если период синусоиды 1 Гц, вы выбираете значения 10 раз в секунду с буфером в 20 значений. Т.е. вы усредняете фактически 2 периода!!!! о каком фильтре речь???
 Не понял - какие периоды, какие усреднения? Поясни, пожалуйста, подробнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
xelos
Гость
« Ответ #36 : 28-11-2004 17:40 » 

проблема была: снимаются значения 10 раз в секунду; сигнал какой-то периодический, с максимальной частотой 1 Гц (или минимальный период - 1 с).
предлагается использовать фильтрацию сигнала с помощью скользящего фильтра усредненных значений (Moving Average Filter).

Длина буфера берется 20 значений. Чтобы отфильтровать сигнал - самое простое (как и было указано) берем среднее арифметическое буфера. Если среднее арифметическое рассчитывается по 20 значениям, то это означает, что усредняется сигнал за последние 2 секунды. При максимальной частоте в 1 Гц - это два периода сигнала. Среднестатистически, результат будет равен 0, если сигнал симметричный относительно 0, или равен оффсету.

При периоде в 1 секунду, усреднять можно значения только за временной промежуток где-то в 100-200мс, ИМХО. Даже 200 мс, имхо, мне кажется, будет слишком много.

я работал с апериодическими сигналами с постоянной времени в 1 с. При частоте опроса датчика в 50 Гц (каждые 20 мс), оптимальным было использование скользящего фильтра с длиной временного окна в 100 мс (т.е. на 5 значений буфер фильра), если размер окна фильтра делать больше, то постоянная времени увеличивается очень здорово.

может, я конечно, что-то недопонял, но ИМХО, при частоте периодического сигнала в 1 Гц, размер окна скользящего фильтра не должен превышать 1/10 периода.
Записан
xelos
Гость
« Ответ #37 : 28-11-2004 17:58 » 

прочитал еще раз дискуссию - 10 Гц это не частота дискретизации, а частота записи в файл. Если частота дискретизации много больше 10 Гц, то вопрос частично снимается.

что я хотел сказать - длина буфера, по идее, выбирается в зависимости от двух параметров: частота сигнала и частота дискретизации. причем длина буфера для фильтра прямо зависит от отношения частота дискретизации/частота сигнала.
Записан
direct
Гость
« Ответ #38 : 28-11-2004 18:15 » 

С критерием Найквиста тут все в порядке: частота дискретизации на порядок превышает наибольшую частоту сигнала (1 Гц). Данных вполне достаточно для применения фильтров (их, судя по постам выше великое множество, что-нибудь выберу Улыбаюсь ).
Природа этого сигнала - биения колебательной системы (типа связанных маятников), область применения - инерциальные системы навигации (там все погрешности ультранизкой частоты - отсюда и такой диапазон частот). Сигнал этот  - затухающий (см. мой пост на 1-й странице). Постоянная времени - от 10 с до 1500 с. Если период (или его часть) меньше, чем постоянная времени - то частоту можно найти (фильтрами, спектрами и. т. д). Но самая большая неприятность -  это когда сигнал затухает, не пройдя даже пол-периода (или периода) (назовем это производственным браком).
Это я к вопросу о поиске нуля сигнала. Допустим, через один нуль сигнал прошел, а на пути ко следующему нулю он затух. Но в буфере даные-то есть, по ним нельзя частоту оценить?
Соотношение сигнал/шум таково, что амплитуда шума примерно в 50 раз меньше амплитуды сигнала (я толком не знаю что точно означает это соотношение).
Записан
Alf
Гость
« Ответ #39 : 28-11-2004 23:27 » 

direct, я давненько уже проходил теорию волновых процессов и мало что помню оттуда. Но интуитивно мне кажется, что в случае апериодических процессов определить собственную частоту колебаний будет не так уж просто.

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

Кстати, попутно еще одна идея насчет сокращения объема буфера для хранения входных данных. До сих пор как-то само собой подразумевалось, что раз уж выборки делаются с фиксированной частотой, то и заносить их в буфер следует равномерно. Однако в случае низких частот сигнал между соседними выборками меняется незначительно. Если хранить в буфере не каждую выборку, а только те, которые отстоят от предыдущей как минимум на заданную величину, объем хранимых данных можно будет резко сократить, т.к. в случае медленно меняющегося сигнала и выборки будут заноситься в буфер редко. По идее должен получиться саморегулирующийся процесс, когда в буфере сидит одинаковое количество периодов сигнала независимо от его частоты. Конечно, в этом случае придется хранить не только отсчет, а пару "время/значение", но в конечном счете это должно окупиться.
Записан
Alf
Гость
« Ответ #40 : 28-11-2004 23:42 » 

Цитата: direct
...Соотношение сигнал/шум таково, что амплитуда шума примерно в 50 раз меньше амплитуды сигнала (я толком не знаю что точно означает это соотношение).

Вроде тут ничего мудреного. Например, амплитуда сигнала 1V, сигнал синусоидальный. На него накладывается шум (допустим, белый), амплитудой 20mV, и получаем в сумме размытую, немного "лохматую" синусоиду.

Кстати, неплохо бы разобраться в природе шума. Допустим, наводка от сети 50Hz - одно дело, тепловой шум резистора - другое и т.д. Шуметь вполне может и сам аналого-цифровой преобразователь, и в этом случае предложенная ранее идея фильтровать шумы RC-цепочкой ничего не даст, только численные методы помогут.

Если с выяснением природы шума проблемы, стоит хотя бы определиться с его спектральными характеристиками - замкнуть измерительный вход накоротко и замерить выходной сигнал. Если шум не белый, а другого цвета, это может облегчить его фильтрацию.
Записан
xelos
Гость
« Ответ #41 : 29-11-2004 10:15 » 

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

Наводки сети определяются достаточно просто - если есть специализированный источник питания, то подключить схему к нему и посмотреть. Если нет, то можно от батарейки запитать. Большую часть наводок сети можно устранить стандартными сетевыми фильтрами - их великое множество.

Шум, в 50 раз меньший сигнала - должен достаточно легко фильтроваться. Полный респект Alf, цифровой фильтр должен помочь.

Возникла еще одна идея как получить кривую. Но ее нужно обдумать, критики здесь много. Если система известна, задать параметрическое описание кривой процесса и по нескольким точкам определять параметры кривой (подгонять ее под реальный процесс), решая систему уравнений. Проблема фильтрации здесь не снимается, однако при этом методе можно получить достаточно хорошие результаты с получением точного результата.
Записан
direct
Гость
« Ответ #42 : 29-11-2004 18:11 » 

Цитата: Alf
я давненько уже проходил теорию волновых процессов и мало что помню оттуда. Но интуитивно мне кажется, что в случае апериодических процессов определить собственную частоту колебаний будет не так уж просто.


А если бы это было просто, я стал бы тогда вопросы задавать? Улыбаюсь Перед тем, как приступать к практической реализации решения этой задачи, я моделировал в маткаде такого рода сигналы: сигнал типа sin(wt)exp(-t/T) я подвергал спектральному анализу и главная частота четко определялась! Значит, частоту можно найти (по крайней мере, теоретически). Вопрос лишь в реализации!

Цитата: Alf

Однако в случае низких частот сигнал между соседними выборками меняется незначительно. Если хранить в буфере не каждую выборку, а только те, которые отстоят от предыдущей как минимум на заданную величину, объем хранимых данных можно будет резко сократить, т.к. в случае медленно меняющегося сигнала и выборки будут заноситься в буфер редко. По идее должен получиться саморегулирующийся процесс, когда в буфере сидит одинаковое количество периодов сигнала независимо от его частоты.


Все абсолютно верно, но для того, чтобы такой процесс измерения организовать, надо априори знать хотя бы грубо, чему равна эта частота! А как раз это-то мне и не известно, вот проблема-то Улыбаюсь
Записан
direct
Гость
« Ответ #43 : 29-11-2004 18:24 » 

Цитата: xelos

Возникла еще одна идея как получить кривую. Но ее нужно обдумать, критики здесь много. Если система известна, задать параметрическое описание кривой процесса и по нескольким точкам определять параметры кривой (подгонять ее под реальный процесс), решая систему уравнений. Проблема фильтрации здесь не снимается, однако при этом методе можно получить достаточно хорошие результаты с получением точного результата.


Идея прекрасная! Это, кажется, называется сплайновой аппроксимацией. То есть ты предлагаешь через 3 точки сигнала (лежащие в пределах полупериода) проводить, скажем, параболу или еще какую-то загогулину, далее при получении следующей точки опять проводить параболу, чтобы она состыковалась с предыдущими измерениями, я правильно понял?
Но для этого нужно определиться с интервалом между точками, а для этого надо грубо оценить частоту сигнала (я же не знаю частоту априори!) Если этот подход удастся реализовать, тогда фильтрация отдыхает! Улыбаюсь Это будет самый простой метод!
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #44 : 29-11-2004 19:34 » 

а частота со временем не меняется? в смысле, фиксирована ли она для одного процесса?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
xelos
Гость
« Ответ #45 : 29-11-2004 20:49 » 

Цитата: direct

Идея прекрасная! Это, кажется, называется сплайновой аппроксимацией. То есть ты предлагаешь через 3 точки сигнала (лежащие в пределах полупериода) проводить, скажем, параболу или еще какую-то загогулину, далее при получении следующей точки опять проводить параболу, чтобы она состыковалась с предыдущими измерениями, я правильно понял?
Но для этого нужно определиться с интервалом между точками, а для этого надо грубо оценить частоту сигнала (я же не знаю частоту априори!) Если этот подход удастся реализовать, тогда фильтрация отдыхает! Улыбаюсь Это будет самый простой метод!


можно пробовать либо весь вид кривой задать общим уравнением типа A*sin(B*x)*exp(C/x) - потом пытаться искать коэффициенты (однако здесь нужна хорошая вычислительная мощность процессора). Либо куски кривой описывать известными уравнениями низшего порядка. То, что ты предлагаешь, насколько я помню, действительно является одним из видов сплайновой аппроксимации.
Однако, ИМХО, исходная проблема с фильтрацией сигнала не снимается. Точки-то, которые у тебя есть, они же шумом искажены...
Можно ли в твоих конкретных условиях подбирать кривые общего вида, чтобы они были нечувствительны к шуму? Либо их перерасчитывать постоянно, либо кривые эти по как можно большим точкам строить.
Так что может этот метод и не подойдет - слишком громоздким будет по сравнению с фильтрацией сигнала и поиском его прохода через 0.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #46 : 30-11-2004 09:54 » 

Думается, если памяти достаточно и процессор достаточно производительный, то можно составить таблицу коэффициентов аппроксимирующей функции, упорядочить их по, скажем, частоте описываемой функции и искать наиболее подходящие через минимизацию СКО или суммарной разности отклонений. Только кажется мне, что для этого нужно иметь полный период (не уверен) и известный фазовый сдвиг. Но объём вычислений будет довольно большим.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
direct
Гость
« Ответ #47 : 30-11-2004 19:45 » 

Цитата: xelos

можно пробовать либо весь вид кривой задать общим уравнением типа A*sin(B*x)*exp(C/x) - потом пытаться искать коэффициенты (однако здесь нужна хорошая вычислительная мощность процессора).


Скажу сразу, аппроксимация всей кривой - это гроб с музыкой Улыбаюсь Для справки: этим занимались в одном институте РАН, так ничего и не вышло! Высокая наука ничего толкового мне не сказала, эта задача для прикладных специалистов!

Цитата: xelos
Можно ли в твоих конкретных условиях подбирать кривые общего вида, чтобы они были нечувствительны к шуму? Либо их перерасчитывать постоянно, либо кривые эти по как можно большим точкам строить.


Я пришел к выводу, что лучшая кривая - это прямая. Как ты смотришь на то, чтобы аппроксимировать пачку данных отрезком? А точке в пачке накопить столько, чтобы гарантированно отсечь шумы! Получится ломаная, по которой нули сразу определяются (не красиво - зато просто!)
Записан
direct
Гость
« Ответ #48 : 30-11-2004 19:49 » 

Цитата: dimka
Думается, если памяти достаточно и процессор достаточно производительный, то можно составить таблицу коэффициентов аппроксимирующей функции, упорядочить их по, скажем, частоте описываемой функции и искать наиболее подходящие через минимизацию СКО или суммарной разности отклонений. Только кажется мне, что для этого нужно иметь полный период (не уверен) и известный фазовый сдвиг. Но объём вычислений будет довольно большим.


Да какой там он производительный! Он эквивалентен i386 (около 70 МГц тактовая частота). Объем вычислений нужно сводить к минимуму. Однако, вопрос с неполным периодом так и остается открытым!
Записан
xelos
Гость
« Ответ #49 : 01-12-2004 10:18 » 

Цитата: direct

Я пришел к выводу, что лучшая кривая - это прямая. Как ты смотришь на то, чтобы аппроксимировать пачку данных отрезком? А точке в пачке накопить столько, чтобы гарантированно отсечь шумы! Получится ломаная, по которой нули сразу определяются (не красиво - зато просто!)

это получится как разновидность фильтра. Например, на 10 точек строишь кусок прямой, минимизирующий какой-нибудь параметр. Если шум равномерный (нет выбросов в отдельные моменты времени), то почему бы и нет?

насчет параметрической прямой - надо обдумать. Если заниматься сплайновой аппроксимацией - период сигнала или просто часть периода - тебе без разницы. Т.е. будешь подбирать кривые 3-4 порядка, на какой-то кусок прямой, не забывая граничные условия.
в итоге у тебя получится составная кривая, но с условиями гладкости в местах стыка. Метод точно такой же, как при аппроксимации прямыми, только кривая получится более касивая Улыбаюсь
Записан
direct
Гость
« Ответ #50 : 02-12-2004 15:33 » 

Цитата: xelos

Т.е. будешь подбирать кривые 3-4 порядка, на какой-то кусок прямой, не забывая граничные условия.


А как это проводить кривые 3-4 порядка на кусок прямой? Поясни, пожалуйста, подробнее Улыбаюсь
Записан
xelos
Гость
« Ответ #51 : 02-12-2004 17:33 » 

Цитата: direct

А как это проводить кривые 3-4 порядка на кусок прямой? Поясни, пожалуйста, подробнее Улыбаюсь

описался, на кусок твоего сигнала УлыбаюсьУлыбаюсь период или часть его - в этом случае тебе без разницы УлыбаюсьУлыбаюсь
положительный момент такого способа для фильтрации (неважно прямыми или кривыми) - постоянная времени твоего фильтрованного сигнала будет ближе к реальности, чем в случае со скользящим фильтром.
Записан
Alf
Гость
« Ответ #52 : 06-12-2004 09:14 » 

Плохие новости для сторонников подгонки коэффициентов кривой под экспериментально измеренные точки.

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

Сначала построил две кривые: sin(x) и sin(2*x). Затем умножил их на exp(K*x). Варьируя значение K, добился срыва колебаний и перехода к апериодическому процессу.

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

Резюме: как я и подозревал интуитивно, в случае сильного затухания синусоидального сигнала собственная частота колебаний перестает играть большую роль, поскольку экспонента определяет форму кривой. Результирующая кривая получается чем-то вроде аттрактора, чем затрудняется восстановление коэффициентов для аппроксимации.

Если на тему еще не забили, попробуйте воспроизвести или опровергнуть полученный результат. Может, я где просчитался в спешке.
Записан
direct
Гость
« Ответ #53 : 06-12-2004 21:11 » 

Цитата: Alf
Если на тему еще не забили, попробуйте воспроизвести или опровергнуть полученный результат. Может, я где просчитался в спешке.

Ну что ты, Alf, на эту тему никто не забил Улыбаюсь Я внимательно слежу за ответами по этому вопросу! Задача эта не из простых, поэтому меня интересует каждый пост по данной теме!
Если я правильно понял, ты моделировал апериодическое звено. Ну в этом случае кривая никогда не перейдет через нуль! Попробуй построить в "Ёкселе-мокселе" такую кривую:
(5*sin(2*t*pi*0.005) + 6*cos(2*t*pi*0.005))*exp(-t/100),
где t - время в секундах, построй кривую в диапазоне от 0 до 100 сек., там точно есть одно пересечение с нулем! И как дальше частоту искать? Улыбаюсь
Записан
DblM
Гость
« Ответ #54 : 04-03-2005 21:12 » 

Мда... у меня ощущение неосознонности цели....
если нужно посчитать частоту биение просто и наверняка [но не 100 пудово], достаточно найти период смены скаплений минимумов с максимумами... и задача решена... поправьте меня ежли что не так...
Записан
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines