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

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

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

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
Технический
Администратор

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 » new

Цитата: 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