Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Фильтрация сигнала


Автор: PostEr 23.7.2003, 15:48
Кто-нибудь реализовывал какой-либо алгоритм фильтрации псевдо-случайного сигнала?

Я вот реализовал и мучаюсь smile.gif Может кто по-лучше знает метод?

Автор: Step 23.7.2003, 16:04
а какой у тебя метод

Автор: PostEr 23.7.2003, 20:55
А у меня такой метод...

Я не знаю как называется и кем придуман, но знаю что он имеет название.
В массив загоняются последовательно результаты считывания, и по окончании заполнения массива происходит суммирование всех величин таким образом for (i=0;i<max;i++)tt+=a[i]*exp((i+1)/max-1), потом tt = tt / max; и значения массива "сдвигаются" и в конец добавляется последнее считанное значение и т.д.
...
Можно без экспоненты

Автор: SCHEPA 26.7.2003, 00:57
Вопрос в том, что ты хочешь получить?

А метод если без экспоненты, то классическое мат. ожидание.

Автор: PostEr 26.7.2003, 10:40
Понятное дело. А если фильтровать периодичные величины? Например градусы.

Если я перехожу от 2* к 359* , то я вовсе не сдвигаюсь на 357*, а сдвигаюсь на 3* но против часовой стрелки. Как сделать, чтобы алгоритм это "понимал", а то такой "кривой" поворот получается smile.gif

Я пробовал делать условие: if (a[i]-a[i-1]>180)a[i]-=360; , но как-то оно странно работает

Автор: SCHEPA 27.7.2003, 01:51
Вообще, переход через ноль - самое больное место при обработке периодического сигнала. Не ты первый с этим мучаешься.

Цитата

Я пробовал делать условие: if (a[i]-a[i-1]>180)a[i]-=360;  ,  но как-то оно странно работает


А как странно?

Автор: PostEr 27.7.2003, 07:13
НИКАК! Может я где-то что-то забываю, а у меня сигнал постоянно одинаковый и без фильтрации sad.gif

Автор: SCHEPA 28.7.2003, 00:17
пиши подробнее если нужна помощь. А так сложно разобраться.

Автор: PostEr 30.7.2003, 17:41
Может, надо ещё елсе дописать? Вся проблема заключается в том, что при повороте "налево", то есть при изменении входного значения с 0* на 359* происходит поворот по большому кругу, то есть происходит плавный поворот: 0, 5, 15, 40, 100, 250, 359.... sad.gif Заколебался уже

Автор: podval 31.7.2003, 13:01
PostEr
По-моему, ты делаешь свертку.
Для того, чтобы правильно "поворачивать" градусы, их совсем необязательно "вертеть". Перед выполнением свертки заполни вспомогательный массив, где с нужной тебе дискретностью будут записаны значения тех самых экспонент на интервале от 0 до двух "пи". А в цикле свертки просто умножай на значения соответствующих элементов этого массива.

Автор: podval 31.7.2003, 13:05
Еще одна подсказка.

Convolution(x,y) = IFFT(FFT(x)*conj(FFT(y)))

FFT - прямое пряобразование Фурье
IFFT - обратное
conj(A) - комплексно-сопряженное А

Автор: PostEr 31.7.2003, 14:22
А чё такое преобразование Фурье? smile.gif

Что такое "свёртка"

Автор: SCHEPA 31.7.2003, 19:57
Преобразование Фурье - разложение функции в ряд по гармоническим функциям (sin, cos).

Свертка операция вида:

z=Sum(x(i)*y(N-i)), i=0...N, Sum - операция накопления

2Poster: не-а, не свертку. По-моему, умножение на экспоненту - это весовая обработка, то есть последний принятый элемент у него участвует в формировании результата с наибольшим весом.

Автор: PostEr 1.8.2003, 12:00
Умножение на экспоненту - действительно весовая обработка. Её можно было сделать линейной(вместо экспоненциальной), можно было сделать практически любой.

Какое вообще отношение Фурье имеет к этой задаче? smile.gif Получается, что мне нужно различать стороны поворота и различать знак, когда это нужно. То есть если я кручусь влево от 0*, то должно быть -1* -2* и т.д., если вправо, то просто прибавляться: 358* 359* 360* 365* и т.д. smile.gif Вроде так. Но проблема в том, что у меня невозможно (?) реализовать это.

Мне необходимо брать угол поврота с сельсинного датчика. Для этого я использую два сопряжённых круговых потенциометра, смещённых друг относительно друга на "зону нечувствительности", которая равна 30*. Для снятия параметров я использую АЦП, а точнее только 2 канала АЦП - соответственно первый и второй потенциометр. Характеристика каждого потенциометра U(alpha) пилообразна, но засчёт использования сопряжения и переключения между каналами мы получаем неразрывную прямую (?). Вроде всё так... ТАК! Дошло. Проблема в том, чо при повороте второго потенциометра в "обрыв" мы переключаемся на первый, на котором скажем 0*, а нам надо ещё к этому нулю добавлять "накрутку" первого!!!!!!!!!!!!!!!! ЭВРИКА!! smile.gif Всем спасибо, буду пробовать smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)