Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Способы убрать шум (..апроксимировать)
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
roman_golovenkov
Доброе время суток!
Встала задача обработать сигнал (сейчас он регистрируется самописцем) АТМегой АВР, точнее для начала убрать "бороду" и выделить линейный сигнал. Амплитуда (размах) шума будет порядка 100-200 мВ, "горба" сигнала - где то 1 В. С отделением сигнала от шума практически не сталкивался.
Подскажите, пожалуйста, каким образов лучше это сделать. Пока в голову приходит только из АЦП меги (последовательного приближения) внешней обвеской сделать АЦП с двойным интегрированием, второй вариан - цифровой фильтр...
Вот что то на подобие входного сигнала (именно эта картинка рисована мышкой в пэинте).
Aner
а пассивными, активными фильтрами это не получается убрать?
Самурай
Цитата(roman_golovenkov @ May 1 2011, 01:36) *
Встала задача обработать сигнал (сейчас он регистрируется самописцем) АТМегой АВР, точнее для начала убрать "бороду" и выделить линейный сигнал.

Подскажите, пожалуйста, каким образов лучше это сделать. Пока в голову приходит только из АЦП меги (последовательного приближения) внешней обвеской сделать АЦП с двойным дифференцированием, второй вариан - цифровой фильтр...


Из внешней обвязке Вам максимум что нужно, так это простейший аналоговый RC фильтр 1-ого порядка. Все.
Ах да, цифровой фильтр... Да, его тоже можно. Можно вместо аналогового, но лучше и то и другоеsm.gif. У Вас, если верить картинке, спектры полезного сигнала и помехи разнесены на "космические" расстояния, в этом случае можно не заморачиваться Матлабом, окнами, оптимизацией и прочей фигней, а использовать банальный фильтр скользящего среднего. Порядок (длина фильтра) любая, какая Вам больше понравитсяподойдет. Формулы найдете в инете. Еще лучше использовать каскадное соединение нескольких таких фильтров (выход первого фильтра является входом второго и т.д.). Фильтры лучше реализовать по рекуррентной схеме. Вроде все. Ах да, частоту дискретизации после фильтрации можно понизить. Раз так в тыщуsm.gif.
V_G
В плане очистки от белого шума лучшим будет цифровой фильтр со скользящим средним. Считается быстро, в памяти в кольцевом буфере нужно постоянно хранить N последних входных отсчетов x[j] и 1 предыдущий выходной отсчет y.

y[i] = y[i-1] + x[i] - x[i-N];

Нормирование (деление на N) - после указанного вычисления. N лучше брать равным степеням двойки, чтобы деление заменить на сдвиг вправо. Чем больше N, тем лучше очистка от шума
andron86
Ой блин, 1-10nF и усё.
roman_golovenkov
Большое всем спасибо за помощь!

Сделал вывод, что следует использовать RC фильтр 1 порядка + скользящего среднего (читал, что при использовании цифрового все равно на до аналоговый с частотой среза равной частоте дискретизации).
А АЦП двойного интегрирования не следует? Чем плох?

И еще одна загвоздка, обрабатывать придется сигнал и другого типа (рис прилагается), Но первый нужный пик появляется за долисекунды (примерно 0,1) - на этой же частоте и дальнейшие шумы. Нужно снять амплитуды первого пика и вершины горба. Я думаю может примениь такой алгоритм: без фильтров снимаем первый пик, когда после появляется резкий скачок вниз - включаем цифровой фильтр, но тогда не получится подключить аналоговый фильт (который на частоту дискретизации) ((

И andron86, что значит 1-10 нФ?
V_G
1. Аналоговый фильтр, причем ОЧЕНЬ хорошего порядка, нужен на ПОЛОВИНУ частоты дискретизации. Т.е. чтобы на этой половине и выше обеспечивалось подавление помех до уровня, меньшего требуемой точности измерений.
2. Если форма сигнала заранее известна, можно применить согласованный фильтр. Его импульсная характеристика зеркальна по отношению к форме сигнала.
SPACUM
Цитата(roman_golovenkov @ May 2 2011, 21:02) *
И еще одна загвоздка, обрабатывать придется сигнал и другого типа (рис прилагается)

1.Для Вашего сигнала наиболее подходит аналоговый фильтр Бесселя. Сделайте его на частоту 10 Гц 3-го или 4-го порядка и попробуйте. Если сильно форму карежит - увеличьте частоту среза. Если шумов много - уменьшите. Так делают в кардиографах.
2.Если хочется чего-нибудь цифрового советую применить 24 разрядный сигма-дельта АЦП там фильтр на половину частоты дискретизации уже встроен так что норм Вы не нарушите. К сожалению он не Бесселя, поэтому частоту дискретизации придется выбрать немного повыше и доделать все в цифре.
3. Как правило встроенный АЦП для точных измерений неприменим, несколько младших бит только шумы, но вопрос точности не поднимался.
4. Обратите внимание на частоты 50 и 100Гц может их придется вырезать до АЦП, особенно если они выше половины частоты дискретизации а фильтра нет.
5. Вообще правильный ответ дается при приложении уже оцифрованного сигнала и его спектра.
EvgenyNik
Начинать надо с анализа - что является причиной шума. Может быть, у Вас питание "трясётся" или опорное напряжение (например, прибор работает на светодиодный индикатор и с частотой 10Гц обновляет информацию, дёргая питание)? Может, между источником сигнала и измерителем перетоки какие идут (один заземлён, другой нет; питаются от разных фаз и т.п.)?
roman_golovenkov
Цитата(EvgenyNik @ May 5 2011, 14:04) *
Начинать надо с анализа - что является причиной шума.


Эти сигналы идут с хемилюминографа (ФЭУ), и по факту - это не шум. Просто нужно "усреднить " данные, получить достаточно линейный график.
roman_golovenkov
Написал код для фильтра простого скользящего среднего. Покритикуйте, пожалуйста, мож что не правильно. Перед прошивкой хорошоб от ошибок избавиться (кол-во сэмплов 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

lux
Цитата(roman_golovenkov @ May 2 2011, 20:02) *
Большое всем спасибо за помощь!

Сделал вывод, что следует использовать RC фильтр 1 порядка + скользящего среднего (читал, что при использовании цифрового все равно на до аналоговый с частотой среза равной частоте дискретизации).
А АЦП двойного интегрирования не следует? Чем плох?

И еще одна загвоздка, обрабатывать придется сигнал и другого типа (рис прилагается), Но первый нужный пик появляется за долисекунды (примерно 0,1) - на этой же частоте и дальнейшие шумы. Нужно снять амплитуды первого пика и вершины горба. Я думаю может примениь такой алгоритм: без фильтров снимаем первый пик, когда после появляется резкий скачок вниз - включаем цифровой фильтр, но тогда не получится подключить аналоговый фильт (который на частоту дискретизации) ((

И andron86, что значит 1-10 нФ?

Есть такой фильтр, как медианный. Предназначен для устранения импульсных помех. Можно попробовать Ваш сигнал пропустить через него, в результате вы будете иметь сигнал без импульса (меряем горб). Если из исходного вычесть полученный после медианного фильтра, то будем иметь сигнал ввиде импульса, который дальше Вы измеряете (возможно прийдется скорректировать фазочастотную характеристику).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.