Телеметрия (часть 1)
Делать вариометр на основе показаний высоты, усредненных по 16 пачкам по 64 измерения (как сделано сейчас)… По-хорошему, надо делать вариометр на основе неусредненных по 16 пачкам данных…
Не думали вместо усреднения по отдельным пачкам применить непрерывную фильтрацию ? Это т.наз Infinite Impulse Responce Filter (IIR).
Напр., пусть у нас есть последовательность отсчетов X0, X1, … Xn, Xn+1 … Тогда результат выражения Yn = A * Yn-1 + (1-A) * Xn будет фильтром НЧ первого порядка для последовательности Xn. Усреднение идет не по конкретному размеру пачки отсчетсчетов, а по непрерывной последовательности предыдущих.
В переводе на псевдокод :
[codebox]# define A (…) // заранее посчитанный параметр А в диапазоне -1…+1
float LowPassFilter(int X) // усредняемый X в диапазоне -1…+1
{
static float Y0;
float Y;
Y = A*Y0 + (1-A)*X;
Y0 = Y;
return Y;
}
// естественно, в реальных вычислениях float’ы заменяются на знаковые int’ы соответствующей разрядности
[/codebox]
При этом коэффициент A вычисляется из требуемой частоты среза фильтра и частоты отсчетов. Грубо говоря, это программно реализованная усредняющая RC-цепочка.
То же самое можно получить для фильтра 2-го порядка, только там будет Yn = A0 * Yn-2 + A1 * Yn-1 + A0 * Xn. При этом, играя с коэффициентами, можно получить разные типы фильтров. Здесь будет полезен фильтр Баттерворта, у которого ступенька на входе не приводит к дребезгу на выходе. Комбинируя такие фильтры последовательно, можно получить фильтр любого порядка. Например, фильтр 4-го из двух таких - это подавление -24 дб/октаву, то есть напр. 2 гц по сравнению с 1 гц подавятся в 16 раз. Я упоминал здесь работу с гироскопами - там, например, удавалось вытащить из-под шума прибора скорость вращения Земли.
Самое веселое здесь - вычисление коэффициентов An. Я их выводил (страшно вспомнить) 13 лет назад для другой задачи и не помню уже решительно ни хера. Если интересно - постараюсь перетряхнуть бекапы и папки с бумажками. Но сейчас наверняка быстрее набить в Яндексе “+IIR +дискретный +фильтр +расчет” и получить чей-нибудь реферат на ту же тему.
Не думали вместо усреднения по отдельным пачкам применить непрерывную фильтрацию ? Это т.наз Infinite Impulse Responce Filter (IIR).
Понял. У меня сейчас что-то похожее на “непрерывную фильтрацию” с фильтром НЧ первого порядка, только в сумму входит не Хn и Хn-1, а Хn…Хn-16 и все An равны 1/16.
Почитаю, что умные люди в Сети понаписали 😃
То есть у вас прямоугольное скользящее окно.
Это не совсем аналог RC-цепочки, форма переходной характеристики несколько другая.
Также прямоугольное скользящее окно (интегратор) можно получить формулой Yn=(Yn-1*(A-1)+Xn)
, что является модификацией формулы приведенной РД00 …
А здесь- ширина окна в отсчетах, и длина переходной характеристики, то есть если А=16, то результат на выходе после подачи “ступеньки” получим после 16-го отсчета.
единственный минус- это требуется плавающее умножение, которое жрет много.
с целочисленным умножением быстрее, но потребуется дополнительная ячейка ОЗУ.
А для высоты/скорости обычного интегратора вполне хватает.
Стало интересно самому. Залез в бэкап от 97 года, выдернул кусок кода и откомментировал. Это работоспособный IIR, реализующий ФНЧ второго порядка. Он применялся в обработке звука в рилтайме.
Вначале считаем коэффициенты дискретного фильтра, исходя из требуемых частоты, добротности и усиления. В данной задаче это разумно делать снаружи, перед компиляцией.
[codebox]// параметры фильтра :
double W; // частота среза фильтра в Гц
double q; // добротность фильтра, 0.71 - фильтр без всплеска на переходной характеристике
double C; // усиление фильтра. Обычно 1
double Fa; // частота дискретизации в Гц
.
// внутренние переменные
double b0,b1,b2; // коэффициенты дискретного фильтра, рассчитываются из W,q,C,Fa
.
double x1,x2; // хранилище для “прошлых состояний” фильтра
double y1,y2;
.
double k,an; // промежуточные коэффициенты
.
.
//-------------------------------------------------------------
// Инициализация фильтра. Рассчитываются коэффициенты b0,b1,b2,
// исходя из заданных частоты среза фильтра, добротности и усиления
//-------------------------------------------------------------
.
W = 2 * 3.14159 * W; // переводим частоту в круговую
.
k = 2*Fa*cos(W/(2*Fa)); // считаем промежуточные коэффициенты
an = C*W*W;
.
b0 = (W*W + W*k/q + k*k) / an; // получаем коэффициенты дискретного фильтра
b1 = 2 * (W*W - k*k) / an;
b2 = (W*W - W*k/q + k*k) / an;
[/codebox]
А теперь собственно фильтруем отсчеты :
[codebox]
//-------------------------------------------------------------
// Рабочая процедура фильтра. На основании заранее расчитанных b0,b1,b2
// входное значение X пересчитывается в выходное Y
//-------------------------------------------------------------
.
double X; // вход фильтра
double Y; // выход фильтра
.
Y = ((X + 2*x1 + x2) - b1*y1 - b2*y2) / b0; // считаем выход
.
y2 = y1; // сохраняем прошлые состояния входа и выхода
y1 = Y;
x2 = x1;
x1 = X;
[/codebox]
Для второго фрагмента есть и целочисленная 16-разрядная реализация, но она на ассемблере x86 с его аппаратным умножением и делением, так что толку от нее будет немного.
И, кстати, как фильтруют американские дядьки с большими бюджетами. Это запись с альтиметра покупного Eagle Tree E-Logger’a (слева высота в метрах, внизу время в секундах).
Общий вид :
и фрагмент набора высоты. Это не я, я по таким траекториям летать не умею. Здесь самолет равномерно лезет вверх с брошеной ручкой :
Синусы, плавающая точка с двойной точностью… Это всё слишком сложно, мне вот тут в голову пришла как обычно гениальная идея 😃
Для высоты у меня есть плавающее окно, и этого, действительно, более чем достаточно. А для скорости есть набор слегка зашумленных (без плавающего окна) данных. В секунду у меня выдается 8 отсчетов высоты. Так кто мешает с приходом каждого нового делать линейную аппроксимацию этого набора данных по методу наименьших квадратов? Это ж самое то! Физически корректно, быстро и просто! Это получается приближение движения самолета на интервале от “секунду назад” до “сейчас” вариантом прямолинейного движения. Из уравнения прямой y=at+b, где MHK находит а и b, для вариометра нужно только а, то есть, наклон прямой. Еще больше задачу упрощает то, что набор данных имеет фиксированный размер и временные интервалы dt всегда одинаковые.
В общем, сейчас пиво допью и сяду, поковыряюсь 😃
Синусы, плавающая точка с двойной точностью… Это всё слишком сложно, мне вот тут в голову пришла как обычно гениальная идея 😃
Взгляните еще раз на вычислительную сложность IIRа по сравнению с усреднением значений по окну или линейной аппроксимацией (что одно и тоже в плане частотной хар-ки). Предполагается, что заранее посчитаны коэффициенты b0, b1, b2 - хоть в Екселе, хоть на калькуляторе, хоть опубликованным фрагментом кода. А микроконтроллер с приходом каждого нового значения должен посчитать :
Y = ((X + 2*x1 + x2) - b1*y1 - b2*y2) / b0;
то есть линейную комбинацию текущего значения и еще 4х предварительно запомненных. При этом никакого предварительного усреднения по окну не требуется. При этом - это фильтр второго порядка, то есть с вдвое большим (на логарифмической шкале) подавлением компонент за полосой по отношению к простым способам усреднения.
Плавающая точка была приведена только для упрощения читаемости кода, чтобы можно было считать, что X и Y находятся в диапазоне -1…+1. Это несложно перевести в целочисленный 16-разрядный диапазон.
А какие же должны быть частота среза и добротность для того, чтобы по 8 отсчетам с частотой 1/8 секунды произвольной зашумленной функции правдоподобно восстановить первую производную исходной неизвестной функции? Меня просто смущает то, что мне нужно не гармоники верхние отфильтровывать, а шум. Шум, впрочем, тоже гармоники, но с непонятной частотой. Всё уже с институтских времен забыл 😃
И потом, по Вашему алгоритму я получу сглаженную функцию высоты от времени, по которой еще надо искать первую производную или просто разность, а с МНК по исходным отсчетам нужно всего около 20 целочисленных сложений и 10 умножений для получения конечного результата. Да, и усреднение значений по окну делается не для вариометра, а только для высоты, это я и не подумаю переделывать - слишком хорошо работает 😃
А какие же должны быть частота среза и добротность для того, чтобы по 8 отсчетам с частотой 1/8 секунды произвольной зашумленной функции правдоподобно восстановить первую производную исходной неизвестной функции?
Я бы выбрал частоту 0.3 - 0.5 Гц и добротность 0.71.
Меня с институтских времен интересовала проблема выбора количества разрядов для регистров и коэффициентов фильтров. Ну то есть умная теория из книг конечно есть, но что на практике получается, в 16 бит уложимся? Наверно прощще попробовать на исходных данных. Что там за диапазон измерений ( отсчетов)?
Меня с институтских времен интересовала проблема выбора количества разрядов для регистров и коэффициентов фильтров. Ну то есть умная теория из книг конечно есть, но что на практике получается, в 16 бит уложимся? Наверно прощще попробовать на исходных данных. Что там за диапазон измерений ( отсчетов)?
АЦП у Атмеги 10-битный, 64 измерения в сумме у меня дают полноценные 16-битные числа. Так что всю математику приходится писать для 16…32 бит. Умножение двух 16-битных, например, уже 32 бита.
32 уже весело Ж-) я бы все-таки попробовал сэмулировать фильтр на компе, есть что фильтровать то, какой то жизненный набор данных?
32 уже весело Ж-) я бы все-таки попробовал сэмулировать фильтр на компе, есть что фильтровать то, какой то жизненный набор данных?
Уже всё на бумажке рассчитано, осталось только вписать в код. Начну всё-таки с МНК, значение вариометра в метрах в секунду для 8 сэмплов в наборе после всех выкладок будет считаться по формуле
v=(2*summ(Yi*Xi)-7*summ(Yi))/12, при этом Yi = 8 последних не сглаженных в окне показаний высоты, а Xi = 0…7. Вуаля.
Yi - целые 16-битные, Xi - целые 8-битные.
Не устроит результат - буду возиться с фильтрами.
Сделал вариометр с линейной аппроксимацией по МНК, не уложился в 16-битные вычисления, пришлось делать 24 бита.
По ощущениям “на земле” работает хорошо, разрешение 0.1 м/сек, загрублено до 0.4 метра в секунду чтобы скрыть шумы. Теперь надо проверять в воздухе.
И последний рывок на этот раз: обработка PPM с индикацией качества приема RC сигнала и управление телеметрией в полете.
Тока не смейтесь. Помогите, плиз, разобраться с детальками для схемы уважаемого smalltim. 1. Датчик давления – то ли MPX5010, то ли MPX4115 ставить? И то и другое в Ч-Дипе с десяток с разными буквочками на конце : www.chip-dip.ru/search.aspx?searchtext=MPX5010 . Ткните меня, плиз, в конкретную позицию в Ч-Дипе. 2. То же самое с LM1881 : www.chip-dip.ru/search.aspx?searchtext=LM1881 . С остальным, вроде, разобрался.
Дядьки, толкните меня в нужную сторону. Как с помощью меги на видео чтото наложить. Я ещё только учусь, щас читаю книжку как программировать микроконтроллеры, но там на примере ATiny2313 и пока программирую диодики 😃. А вот как видео обработать ума не приложу. Направьте на путь истинный, дайти ссылку на то где можно это прочесть. А так же какую мегу лучше выбрать. Пока до съёма данных с GPS далеко, хотябы просто буковки вывести на экран 😛 . Жутко охото 😃 . В электронике сам на очень низком уровне, но есть дикое рвение его повысить.
просто буковки вывести на экран
Сюда гляньте.
- Датчик давления – то ли MPX5010, то ли MPX4115 ставить? И то и другое в Ч-Дипе с десяток с разными буквочками на конце : www.chip-dip.ru/search.aspx?searchtext=MPX5010 . Ткните меня, плиз, в конкретную позицию в Ч-Дипе. 2. То же самое с LM1881 : www.chip-dip.ru/search.aspx?searchtext=LM1881 . С остальным, вроде, разобрался.
Нужно два датчика:
- Датчик скорости: MPXV5010DP. Буковки отвечают за цоколевку и наличие трубочек для подвода давления.
- Датчик высоты: MPXA4115A6U. Буковки отвечают за цоколевку и наличие трубочек для подвода давления.
www.freescale.com/files/sensors/…/MPX4115A.pdf
www.freescale.com/files/sensors/…/MPX5010.pdf
LM1881: Пойдет с любым буквенным индексом. Для платы SMD нужна в корпусе SO8, для “якобы SMD” нужна в копусе DIP8.
Сюда гляньте.
А проще есть 😛 , из PAL в PAL, в принципе направление понятно, но из за отсутствия опыта воедино немогу собрать. И чтобы буквы поверх видео были 😃
А, ещё посоветуйте программатор по дешевле 😛 .
обработка PPM с индикацией качества приема RC сигнала
А как собираетесь по PPM оценивать качество ?
Идеально, конечно, было бы на ИМС приемника найти выход управляющего сигнала АРУ и мерять его, был бы объективный контроль уровня сигнала на антенне…
А как собираетесь по PPM оценивать качество ?
Идеально, конечно, было бы на ИМС приемника найти выход управляющего сигнала АРУ и мерять его, был бы объективный контроль уровня сигнала на антенне…
По вариации длительности импульсов в свободном канале. Ну, по-нашему, по рабоче-крестьянски - насколько сильно “дрожат” сервы 😃
Для PCM и для приемников с fail-safe не прокатит.