реклама на сайте
подробности

 
 
> Способы убрать шум (..апроксимировать), На ATMega обработать сигнал
roman_golovenkov
сообщение Apr 30 2011, 21:36
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 10-02-09
Пользователь №: 44 637



Доброе время суток!
Встала задача обработать сигнал (сейчас он регистрируется самописцем) АТМегой АВР, точнее для начала убрать "бороду" и выделить линейный сигнал. Амплитуда (размах) шума будет порядка 100-200 мВ, "горба" сигнала - где то 1 В. С отделением сигнала от шума практически не сталкивался.
Подскажите, пожалуйста, каким образов лучше это сделать. Пока в голову приходит только из АЦП меги (последовательного приближения) внешней обвеской сделать АЦП с двойным интегрированием, второй вариан - цифровой фильтр...
Вот что то на подобие входного сигнала (именно эта картинка рисована мышкой в пэинте).

Сообщение отредактировал roman_golovenkov - May 1 2011, 10:17
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
roman_golovenkov
сообщение May 14 2011, 22:15
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 10-02-09
Пользователь №: 44 637



Написал код для фильтра простого скользящего среднего. Покритикуйте, пожалуйста, мож что не правильно. Перед прошивкой хорошоб от ошибок избавиться (кол-во сэмплов avgLenght) буду подбирать на месте, практически. На этой неделе цель оцифровать сигнал без фильтра, с аналоговым rc. и передать по uart на комп (записать в файл, например эксель, если получится, пока не знаю как sad.gif ) Хорошо б и цифровой опробовать.

ЗЫ: Обрабатываю пока первую картинку.

CODE

#include <mega16.h>

#include <delay.h>

#include <stdio.h>

unsigned char i = 0;
float adc_data_volt;
const float k = 0.0025;
int avgLenght = 30;
float mass[avgLenght];

//Ring initialisation service routing
void initRing ()
{
unsigned int i;
for (i = 0; i < avgLenght; i++);
{
mass[i] = 0;
}
}

//Filter service routing
float movingAverage (float data_in)
{
static int i = 0;
int j,k;
float avg = 0.0;
int indexBegin = (i - avgLenght) < 0 ? 0 : (i - avgLenght);
for (k = indexBegin; k < (avgLenght - 1); k++)
{
mass[k] = mass[k+1];
}
mass[avgLenght-1] = data_in;
for (j = 0; j < avgLenght; j++)
{
avg += mass[j];
}
i++;
return avg = avg/avgLenght;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
i++;
if (i == 3) {
i = 0;
ADCSRA = 0xCE;

};

}

#define ADC_VREF_TYPE 0xC0

//#define NON_FILTER
#define D_FILTER

#ifdef NON_FILTER
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data = ADCW;
adc_data_volt = adc_data*k;
printf ("%f; ", adc_data_volt);
}
#endif

#ifdef D_FILTER
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
float data_out;
// Read the AD conversion result
adc_data = ADCW;
adc_data_volt = adc_data*k;
data_out = movingAverage(adc_data_volt);
printf ("%f; ", data_out);
}
#endif



Сообщение отредактировал roman_golovenkov - May 14 2011, 22:16
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 11:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016