[uquote="KorbenDallas",url="/forum/viewtopic.php?p=3646549#p3646549"]Во-первых, среднее у вас вычисляется не из `N_MAX` значений, как написано в комментарии, а из `2^N_MAX` значений.
Во-вторых, вышеприведенная функция возвращает новое среднее только на каждой `2^N_MAX` итерации. На остальных итерациях возвращается последнее вычисленное среднее. Это так и задумано?[/uquote]
1. Да, я забыл обновить комментарий после обновления кода.
2. Да, так и задумано, я ведь не получу новое среднее значение раньше, чем через 2^N_MAX операций. Наверно, можно было добавить флаг "обновлено/не обновлено" и записывать значение в OC1A, только если оно обновилось, но мне показалось это лишним в этом случае. В векторах прерываний тут ничего важного не происходит (может, индикатор потом прикручу), остановка прерываний раз в цикл не критична.
Не знал о существовании спец. библиотеки атомарных операций для AVR-GCC. Но какая разница - в датащите универсальный сишный вариант под любую среду разработки, насколько я понимаю. А атомарность операций нужна здесь "чтоб была" - в процессе борьбы ловли багов Протеуса добавил для надежности, Atmel ведь рекомендует.
baron_P писал(а):Но какая разница - в датащите универсальный сишный вариант под любую среду разработки, насколько я понимаю.
разница очень большая: если вы делаете атомарное ЧТЕНИЕ, то вам придется совершать без этого библиотечного макроса достаточно много "лишних" телодвижений - я привел код функции, возвращающей атомарно считанное значение регистра, попробуйте написать аналог без этого макроса
baron_P писал(а):я ведь не получу новое среднее значение раньше, чем через 2^N_MAX операций
да легко! только это будет не среднее за N_MAX семплов, а среднее за N_MAX предыдущих семплов. метод называется "скользящее среднее" и является простейшим вариантом какого-то там КИХ/БИХ (я нихрена в этом не понимаю) фильтра.
алгоритм вам ранее был описан словесно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="ARV",url="/forum/viewtopic.php?p=3646774#p3646774"]разница очень большая: если вы делаете атомарное ЧТЕНИЕ, то вам придется совершать без этого библиотечного макроса достаточно много "лишних" телодвижений - я привел код функции, возвращающей атомарно считанное значение регистра, попробуйте написать аналог без этого макроса
да легко! только это будет не среднее за N_MAX семплов, а среднее за N_MAX предыдущих семплов. метод называется "скользящее среднее" и является простейшим вариантом какого-то там КИХ/БИХ (я нихрена в этом не понимаю) фильтра.
алгоритм вам ранее был описан словесно[/uquote]
А чем плох этот пример чтения?
unsigned int TIM16_ReadTCNT1( void )
{
unsigned char sreg;
unsigned int i;
/* Save Global Interrupt Flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Read TCNT1 into i */
i = TCNT1;
/* Restore Global Interrupt Flag */
SREG = sreg;
return i;
}
Я слышал про этот метод, но мне он не нужен в данном случае - частота входного сигнала очень низкая.
хотя бы тем, что он в 3 раза объемнее по строкам соответственно, в 3 раза выше вероятность где-то ошибиться.
baron_P писал(а):мне он не нужен в данном случае - частота входного сигнала очень низкая
фильтр нужен практически всегда, и с частотой это не связано. первое, для чего он нужен - это сгладить "естественный" шум АЦП в младшем разряде.
но, разумеется, хозяин - барин
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
хотя бы тем, что он в 3 раза объемнее по строкам соответственно, в 3 раза выше вероятность где-то ошибиться.
baron_P писал(а):мне он не нужен в данном случае - частота входного сигнала очень низкая
фильтр нужен практически всегда, и с частотой это не связано. первое, для чего он нужен - это сгладить "естественный" шум АЦП в младшем разряде.
но, разумеется, хозяин - барин [/uquote]
Это копипаста из датащита - в нажатии двух кнопок ошибиться трудно
Я не использую АЦП - это обработка цифровых сигналов очень низкой частоты. Усреднение - чтобы минимизировать влияние внезапных импульсных помех, если оные проберутся в сигнал.
[uquote="baron_P",url="/forum/viewtopic.php?p=3646805#p3646805"]Я не использую АЦП - это обработка цифровых сигналов очень низкой частоты. Усреднение - чтобы минимизировать влияние внезапных импульсных помех, если оные проберутся в сигнал.[/uquote]
может лучше контрольные суммы использовать?
[uquote="ozonn",url="/forum/viewtopic.php?p=3646821#p3646821"][uquote="baron_P",url="/forum/viewtopic.php?p=3646805#p3646805"]Я не использую АЦП - это обработка цифровых сигналов очень низкой частоты. Усреднение - чтобы минимизировать влияние внезапных импульсных помех, если оные проберутся в сигнал.[/uquote]
может лучше контрольные суммы использовать?[/uquote]
Не соображу, как это можно сделать здесь. Железка с 12-ю открытыми коллекторами соединена со входами контроллера. Иногда, значения на входах меняются по желанию этой железки. Куда тут контрольную сумму можно воткнуть?
[uquote="ozonn",url="/forum/viewtopic.php?p=3646826#p3646826"]т.е. за входной сигнал ты не в ответе? Ну, а о нем хоть что-то известно?[/uquote]
Не в ответе. О том, какие значения будут выставлены в конкретный момент - нет, не известно. Есть еще тринадцатый бит, который говорит о том, что сигнал с 12 остальных можно читать. Я собираю значения со входов только когда активен этот бит.
Код (лишнее выкинулЮ нужное добавил):
Спойлер
[uquote="baron_P",url="/forum/viewtopic.php?p=3646836#p3646836"]Не в ответе. О том, какие значения будут выставлены в конкретный момент - нет, не известно.[/uquote]
а частота тоже неизвестна?
[uquote="ozonn",url="/forum/viewtopic.php?p=3646843#p3646843"][uquote="baron_P",url="/forum/viewtopic.php?p=3646836#p3646836"]Не в ответе. О том, какие значения будут выставлены в конкретный момент - нет, не известно.[/uquote]
а частота тоже неизвестна?[/uquote]
Частота тоже неизвестна. Известно, что имеют место быть импульсные помехи около 10 кГц частотой. На входах будет подаваться 24 В через делитель 20 кОм - 3,9 кОм. Параллельно 3,9 кОм будут конденсаторы 0,01 мкФ, чтобы срезать все, что выше 1 кГц.
[uquote="ozonn",url="/forum/viewtopic.php?p=3647026#p3647026"]тогда отфильтровать весьма непросто. Усреднения может ничего не дать. А какова длительность импульса на 13 контакте?[/uquote]
И того я, пока, не знаю. Документации нет, вопрос прояснится, когда получится добраться до железки с осциллографом.
baron_P, от импульсных помех избавляются медианный фильтром, а не усреднением. То бишь, формируем скользящее окно из N показаний. N - нечётное. Окно лучше формировать списком. В списке держим N последних показаний в отсортированном порядке. Среднее показание - наша медиана. При поступлении нового показания удаляем из списка самое старое показание и вставляем в список, сохраняя сортировку по значениям показаний, новое показание. Средний элемент списка снова наша медиана.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3647130#p3647130"]baron_P, от импульсных помех избавляются медианный фильтром, а не усреднением. То бишь, формируем скользящее окно из N показаний. N - нечётное. Окно лучше формировать списком. В списке держим N последних показаний в отсортированном порядке. Среднее показание - наша медиана. При поступлении нового показания удаляем из списка самое старое показание и вставляем в список, сохраняя сортировку по значениям показаний, новое показание. Средний элемент списка снова наша медиана.[/uquote]
короче, надо знать, что представляют собой эти самые показания и можно ли их вообще фильтровать
ozonn, так ТС же явно сказал, что "имеют место быть импульсные помехи". Если только импульсные помехи - то медианного фильтра достаточно. Если не столько ипульсные, сколько шум при известном спектре полезного сигнала - то уравнение Винера.
В общем случае - собираем мегабайты статистики, берем R в зубы, находим функцию распределения и от нее уже пляшем.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3648578#p3648578"]ozonn, так ТС же явно сказал, что "имеют место быть импульсные помехи". Если только импульсные помехи - то медианного фильтра достаточно. Если не столько ипульсные, сколько шум при известном спектре полезного сигнала - то уравнение Винера.
В общем случае - собираем мегабайты статистики, берем R в зубы, находим функцию распределения и от нее уже пляшем.[/uquote]
а теперь представь, что полезная информация - это буквы. И ты бльшую часть из них фильтруешь. Короче, надо знать, какую инфу нисут в себе принимаемые числа