Форум программистов, компьютерный форум, киберфорум
Цифровая обработка сигналов
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Техник
314 / 172 / 25
Регистрация: 09.10.2009
Сообщений: 3,095
1

Избавиться от шума (фильтрация сигнала)

15.12.2014, 12:37. Просмотров 3213. Ответов 6
Метки нет (Все метки)

Доброго времени суток. Помогите пожалуйста с такой задачкой: с прибора по Com-порту приходит сигнал, например синусоида. Сигнал содержит шум и необходимо от него избавиться с помощью усреднения по такому принципу:

программа на Delphi:

есть массив Arraysinus: array [0..10000] of integer;

Начинаем с 5 элемента массива. Усредняем относительно него, для этого суммируем 5 элементов до и 5 после этого элемента, ну и разделить на 10 соответственно, результат записать в новый массив. И так с каждым элементом до 9 995.

Сообразить ни как не могу, как это воплотить в коде ... мысль вроде крутиться в голове, поймать не могу.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2014, 12:37
Ответы с готовыми решениями:

Фильтрация по Винеру при шумоподавлении и известном слепке шума
Здравствуйте! Вопрос, который мне необходимо решить, уже поднимался наверное не раз и не два, но я...

Определение оптимального порогового значения сигнала на фоне шума
Всем привет! Стоит задача декодировать сигнал со звукового файла. Для декодирования нужно выделить...

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

Фильтрация затухающего сигнала.
Есть затухающий сигнал записанный с частотой семплирования 4000Hz, длительность записи составляет...

6
10207 / 6588 / 494
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
15.12.2014, 23:22 2
простое скользящее среднее ru.wikipedia.org/wiki/Скользящая_средняя

Добавлено через 34 минуты
как это воплотить в коде
...если данные поступают непрерывно REALTIME, то простое скользящее среднее c базой 5:
Delphi
1
2
3
4
5
6
7
8
// скользящее окно с базой на три
 okno[0]: = okno[1];
 okno[1]: = okno[2];
 okno[2]: = okno[3];
 okno[3]: = okno[4];
 okno[4]: = adc; { ваши данные с порта }
 
 adc_average = (okno[0] + okno[1] + okno[2] + okno[3] + okno[4])/5;
Если же массив данных уже есть и накоплены, то достаточно применить усредненное арифметическое сглаживание V=(Vo+V)/K:
Delphi
1
2
3
4
 for i:= 0 to length(Arraysinus)-1 do begin
   z:=(Arraysinus[i]+z)/trunc(k);
   Arraysinus[i]:= z;
 end;
Но лучший эффект дает экспотенциальное сглаживание V=Vр*(1-K)+V*K:
Delphi
1
2
3
4
5
 for i:= 0 to length(Arraysinus)-1 do begin
 if k>1 then k:= k-trunc(k);
 z:= Arraysinus[i]*(1-k)+(z*k);
 Arraysinus[i]:= z;
end;
где: k - коэффициент сглаживания до 1.
2
Техник
314 / 172 / 25
Регистрация: 09.10.2009
Сообщений: 3,095
16.12.2014, 08:10  [ТС] 3
raxp, Спасибо!!
0
32 / 31 / 1
Регистрация: 04.07.2013
Сообщений: 232
Записей в блоге: 1
22.12.2014, 05:14 4
Пример КИХ фильтра нижних частот на С++
http://habrahabr.ru/post/128140/
0
1791 / 1121 / 109
Регистрация: 04.01.2010
Сообщений: 3,948
22.12.2014, 11:09 5
...это еще не все. Сглаживание окном хорошо себя покажет в тандеме с фильтрацией "пиков", это когда резкие отклонения от ожидаемой величины на следующем тике отсекаются. Главное - не переусердствовать. А так да, экспоненциальное сглаживание - наше всё . Очень удобный и быстрый метод фильтрации.
...еще для оптимального подсчета скользящего среднего удобно использовать FIFO. То есть при каждом новом значении считается текущее усредненное значение путем прибавления текущего значения к сумме и вычитании значения из FIFO.

...Предложенный вариант
Цитата Сообщение от raxp Посмотреть сообщение
усредненное арифметическое сглаживание V=(Vo+V)/K:
, имхо, очень смахивает на экспоненциальное сглаживание. По крайней мере ему присуща одно нехорошее свойство - при появлении откровенно ошибочных значений измерения на выходе получится мусор, и этот мусор может сохраняться довольно долго, даже если ошибочных значений всего одно-два.
0
10207 / 6588 / 494
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
22.12.2014, 21:44 6
Для фильтрации резких скачков используется скользящая медиана.
1
1791 / 1121 / 109
Регистрация: 04.01.2010
Сообщений: 3,948
23.12.2014, 10:25 7
Цитата Сообщение от raxp Посмотреть сообщение
скользящая медиана
...как частный случай кусочной аппроксимации. Просто все эти методы не подходят под реалтайм, потому что для них нужен "край". Если нет крайних достоверных значений - медианный фильтр или подобный дадут плохой результат.
ЗЫ: я также для отлавливания пиков делал привязку их порога к среднеквадратичному отклонению. То есть по характеру сигнала автоматом определялся порог сработки фильтрации пиков. Медианный же фильтр, как я понимаю, строит "свои догадки" по производной... Ну, и результат медианного фильтра в действии - это запаздывание на один такт, что иногда не сколько полезно, но и вредно.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2014, 10:25

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

Фильтрация зашумленого сигнала
Приятного времени суток, :) Записываю с микрофона, и в записи постоянно присутствуют какие-то...

ВЧ фильтрация звукового сигнала
Добрый день! Подскажите, пожалуйста, какой фильтр лучше использовать для ВЧ фильтрации звукового...

Фильтрация отраженного сигнала с задержкой
Всем доброго времени суток. Задача передо мной стоит следующая: есть сигнал записанный семплами...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.