Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Фильтрация аналоговых сигналов
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
KOT9RA
Доброго времени суток!

мне необходимо отфильтровать аналоговые сигналы методом скользящего среднего! сигнал подается на микроконтроллер. я использую ADUC842. написал программу, но не уверен что правильно реализовал метод скользящего среднего!
вот кусок кода, в котором происходит считывание сигналов преобразование их с помощью АЦП в код, далее код преобразуется в напряжение, и потом идет фильтрация:


ADCRead(3); //читаем порт P1.3 и запускаем АЦП
U21= (ADCDATAL+(ADCDATAH<<8))&0x0FFF; //снимаем код с АЦП
U11= U21/1638; //перевод кода в напряжение (FFF/2,5=1638.4) - для фильтрации
if(q==0)
{
Up1=Un1; //создание предыдущего зн-ия
q=1; //взводим флаг
}
else
{
Un1=Up1*(1-p)+ Un1*p; //фильтрация (р=1/n, где n-количество отсчетов)
Up1=Un1; //создание предыдущего зн-ия
U21=Un1*1638; //перевод обратно в код
}
на сколько я понимаю скользящее среднее используется для фильтрации данных которые заданны массивом. как это реализовать в данном случаи?

помогите пожайлуста! очень нужно!
bav
примерно так:
while(1)
{
u = ADCRead();

res = (u + du + ddu + dddu)/4;
dddu = ddu;
ddu = du;
du = u;
}


скользящее из 4-х точек
KalashKS
У Вас получился рекурсивный фильтр 1-го порядка. При больших значениях n, если жалко памяти, и если по линейности ФЧХ требований нет, можно использовать его.

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

if(init_flag==0)
{
for (k=0; k<n; k++)
sample_reg[k] = 0; //инициализация
U_filtered = 0;
init_flag = 1; //взводим флаг
}
else
{
U_filtered = U_filtered + Un1 - sample_reg[sample_reg_pntr]; //фильтрация
sample_reg[sampe_reg_pntr] = Un1;
sample_reg_pntr = (sample_reg_pntr+1) % n;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.