| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Фильтрация сигнала |
| Автор: PostEr 23.7.2003, 15:48 |
| Кто-нибудь реализовывал какой-либо алгоритм фильтрации псевдо-случайного сигнала? Я вот реализовал и мучаюсь |
| Автор: 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* но против часовой стрелки. Как сделать, чтобы алгоритм это "понимал", а то такой "кривой" поворот получается Я пробовал делать условие: if (a[i]-a[i-1]>180)a[i]-=360; , но как-то оно странно работает |
| Автор: SCHEPA 27.7.2003, 01:51 | ||
Вообще, переход через ноль - самое больное место при обработке периодического сигнала. Не ты первый с этим мучаешься.
А как странно? |
| Автор: PostEr 27.7.2003, 07:13 |
| НИКАК! Может я где-то что-то забываю, а у меня сигнал постоянно одинаковый и без фильтрации |
| Автор: SCHEPA 28.7.2003, 00:17 |
| пиши подробнее если нужна помощь. А так сложно разобраться. |
| Автор: PostEr 30.7.2003, 17:41 |
| Может, надо ещё елсе дописать? Вся проблема заключается в том, что при повороте "налево", то есть при изменении входного значения с 0* на 359* происходит поворот по большому кругу, то есть происходит плавный поворот: 0, 5, 15, 40, 100, 250, 359.... |
| Автор: 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 |
| А чё такое преобразование Фурье? Что такое "свёртка" |
| Автор: 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 |
| Умножение на экспоненту - действительно весовая обработка. Её можно было сделать линейной(вместо экспоненциальной), можно было сделать практически любой. Какое вообще отношение Фурье имеет к этой задаче? Мне необходимо брать угол поврота с сельсинного датчика. Для этого я использую два сопряжённых круговых потенциометра, смещённых друг относительно друга на "зону нечувствительности", которая равна 30*. Для снятия параметров я использую АЦП, а точнее только 2 канала АЦП - соответственно первый и второй потенциометр. Характеристика каждого потенциометра U(alpha) пилообразна, но засчёт использования сопряжения и переключения между каналами мы получаем неразрывную прямую (?). Вроде всё так... ТАК! Дошло. Проблема в том, чо при повороте второго потенциометра в "обрыв" мы переключаемся на первый, на котором скажем 0*, а нам надо ещё к этому нулю добавлять "накрутку" первого!!!!!!!!!!!!!!!! ЭВРИКА!! |