Когда я был в Питере, и мы сидели в кабаке, у нас с товарищами
microtrigger,
zyrg, и
vshmuk возникли дебаты про численное нахождение производной, снятой с АЦП. Грубо говоря, есть некоторый датчик, который снимает интегральный сигнал (ну к примеру путь S), а нам нужно построить производную этого сигнала (к примеру скорость V). Товарищ
zyrg с пеной у рта доказывал, что это весьма сложная задача, с которой могут быть великие проблемы, если не использовать специальных фильтров. Я решил отложить дебаты, пока сам не решу эту задачу. Приехав домой, я быстренько забабах это всё в Exel. При проверке, решил сразу убить двух зайцев - проверить ошибки квантования и убедится в верности нахождения производной. В двух словах вдадимся в подробности теории. Что есть производная:

Поскольку дельта икс у нас совершенно чёткая, или скорее равная отрезкам оцифровки, то производная значения снятого с АЦП будет нынешнее значение минус предыдущее, делённое на период квантования: df/dt=(f(t1) -f(t2))/(t1 -t2). Для опытов я выбрал функцию гармонического синуса sin(x). В дальнейшем проверил и на остальных функциях, но это самая красивая и в нашем случае самая актуальная.

Изначальный график для экспериментов
Для начала я составил таблицу, над которой начал издеваться. Первая строчка [ t= ] - это время от старта работы условного АЦП, который наращивается с шагом квантования (последняя строчка). Вторая - [ SIN(t) ]синус вычесленный от этого кванта времени, формула которого примитивна: =SIN(B1). Третья - [ dSIN(t)/dt ] это численное нахождение производной. Формула её проста: =(C2-B2)/C5 (первая ячейка). Предпоследняя строчка это [ COS(t) ], это нахождения косинуса от перменной t. Она нужна для того, чтобы сравнивать с истинным значением косинуса вычисленную производную (если помните, производная синуса - это косинус). Последняя строка - это квантование, т.е. проще говоря шаг изменения t. Внизу строиться график, который строит гибкую линию по точкам. Сейчас у нас выбран самый оптимальный шаг квантования 0,5 . Здесь всё ясно, дальше я двух разделах покажу сначала ошибки квантования, и следственные ошибки производных, затем ошибки дифференцирования при ошибочных входных данных. Если ваш мозг не вспух и вы готовы дальше пуститься в дебри математики и электроники,
Ошибки квантования
Как видно из самой первой картинки, производная практически полностью соответствует графику косинуса. Если мы ещё уменьшим "частоту дискретизации", или в нашем случае шаг до dt=0,1, то получим вообще практически совпадающие кривые, которые я проиллюстрирую ниже:

Полученный график с шагом 0,1
Как видно, при этом шаге квантования график производной (фиолетовая кривая), практически полностью совпадает с графиком косинуса (красная кривая). Маркерами показанны точки квантования. В этом случае всё ясно, но давайте увеличим шаг, от 0,5 до 1

Полученный график с шагом 1
Видно, что производная, да и все графики начинают "плыть".
Продолжим увеличение квантования до 2:

Полученный график с шагом 2
Всё начинает плыть и уходить, но ещё отдалённо напоминает синус. Однако уже видно, что численно рассчитанная производная СОВЕРШЕННО не соответствует своему значению. Да и вообще находится в противофазе. Напоследок возьмём квантование равное 5 (в 10 раз больше исходного).

Полученный график с шагом 10
Видно что в этом случае мы наблюдаем полную ересь. И в данном случае можно сказать, что высокие частоты и шумы, могут хорошо подпортить реальное значение производной. Теперь же посмотрим как влияет погрешность снятого сигнала, на численный рассчёт производной.
Численное вычисление производной, при неточности снятого сигнала (шумах, наводках, высших гармониках)
Добавим теперь в формулу вычисления синуса некоторую погрешность снятия сигнала, для этого прибавим к формуле вычисления синуса некоторое случайное число: =SIN(C1)+СЛЧИС()*0,1 . Данная формула внесёт 10% погрешность от амплитудного значения в вычисление сигнала, просто добавляя некоторое случайное число от нуля до 0,1. Я покажу несколько вариантов с разной погрешностью. Сначала покажем сигнал с 5% погрешностью:

Полученный график с погрешностью 5%
Как видно из графика, ни на синус, ни на производную такая погрешность не оказывает должного влияния. Возьмём тогда погрешность в 10%

Полученный график с погрешностью 10%
Вот, ярко видно, что на графике синуса погрешность сказалось мало. А вот на графике производной очень даже, в особенности хорошо раскорячило её концы. На последок покажу что будет если построить график производной с 20% погрешностью:

Полученный график с погрешностью 20%
График отдалённо напоминает косинус. Видно куча убеганий и прочего. Надо учитывать, что это ПСЕВДОслучайная велечина, в реальной жизни всё может быть гораздо хуже. Но всё же лучше смоделировать данные фишки, чтобы представлять себе что же может твориться на АЦП.
Вывод: Считать численно производную по снятым значениям с АЦП можно и нужно. Но необходимо оценивать уровень внешних помех, которые могут влиять на сигнул, и очень сильно его портить. Желательно использовать фильтрацию сигнала, выделяя полезный сигнал. Филтрация может быть как аналоговая, так цифровуя. Мне даже показали прекрасную формульную замену аналоговой фильтрацией прекрасной програмкой на си. И разумеется мы должны себе ЧЁТКО представлять какой сигнал цифруем, и не цифровать сигнал на пределах возможностей АЦП. 5 точек на период, как показала практика - не самый плохой вариант!

Поскольку дельта икс у нас совершенно чёткая, или скорее равная отрезкам оцифровки, то производная значения снятого с АЦП будет нынешнее значение минус предыдущее, делённое на период квантования: df/dt=(f(t1) -f(t2))/(t1 -t2). Для опытов я выбрал функцию гармонического синуса sin(x). В дальнейшем проверил и на остальных функциях, но это самая красивая и в нашем случае самая актуальная.

Изначальный график для экспериментов
Для начала я составил таблицу, над которой начал издеваться. Первая строчка [ t= ] - это время от старта работы условного АЦП, который наращивается с шагом квантования (последняя строчка). Вторая - [ SIN(t) ]синус вычесленный от этого кванта времени, формула которого примитивна: =SIN(B1). Третья - [ dSIN(t)/dt ] это численное нахождение производной. Формула её проста: =(C2-B2)/C5 (первая ячейка). Предпоследняя строчка это [ COS(t) ], это нахождения косинуса от перменной t. Она нужна для того, чтобы сравнивать с истинным значением косинуса вычисленную производную (если помните, производная синуса - это косинус). Последняя строка - это квантование, т.е. проще говоря шаг изменения t. Внизу строиться график, который строит гибкую линию по точкам. Сейчас у нас выбран самый оптимальный шаг квантования 0,5 . Здесь всё ясно, дальше я двух разделах покажу сначала ошибки квантования, и следственные ошибки производных, затем ошибки дифференцирования при ошибочных входных данных. Если ваш мозг не вспух и вы готовы дальше пуститься в дебри математики и электроники,
Ошибки квантования
Как видно из самой первой картинки, производная практически полностью соответствует графику косинуса. Если мы ещё уменьшим "частоту дискретизации", или в нашем случае шаг до dt=0,1, то получим вообще практически совпадающие кривые, которые я проиллюстрирую ниже:

Полученный график с шагом 0,1
Как видно, при этом шаге квантования график производной (фиолетовая кривая), практически полностью совпадает с графиком косинуса (красная кривая). Маркерами показанны точки квантования. В этом случае всё ясно, но давайте увеличим шаг, от 0,5 до 1

Полученный график с шагом 1
Видно, что производная, да и все графики начинают "плыть".
Продолжим увеличение квантования до 2:

Полученный график с шагом 2
Всё начинает плыть и уходить, но ещё отдалённо напоминает синус. Однако уже видно, что численно рассчитанная производная СОВЕРШЕННО не соответствует своему значению. Да и вообще находится в противофазе. Напоследок возьмём квантование равное 5 (в 10 раз больше исходного).

Полученный график с шагом 10
Видно что в этом случае мы наблюдаем полную ересь. И в данном случае можно сказать, что высокие частоты и шумы, могут хорошо подпортить реальное значение производной. Теперь же посмотрим как влияет погрешность снятого сигнала, на численный рассчёт производной.
Численное вычисление производной, при неточности снятого сигнала (шумах, наводках, высших гармониках)
Добавим теперь в формулу вычисления синуса некоторую погрешность снятия сигнала, для этого прибавим к формуле вычисления синуса некоторое случайное число: =SIN(C1)+СЛЧИС()*0,1 . Данная формула внесёт 10% погрешность от амплитудного значения в вычисление сигнала, просто добавляя некоторое случайное число от нуля до 0,1. Я покажу несколько вариантов с разной погрешностью. Сначала покажем сигнал с 5% погрешностью:

Полученный график с погрешностью 5%
Как видно из графика, ни на синус, ни на производную такая погрешность не оказывает должного влияния. Возьмём тогда погрешность в 10%

Полученный график с погрешностью 10%
Вот, ярко видно, что на графике синуса погрешность сказалось мало. А вот на графике производной очень даже, в особенности хорошо раскорячило её концы. На последок покажу что будет если построить график производной с 20% погрешностью:

Полученный график с погрешностью 20%
График отдалённо напоминает косинус. Видно куча убеганий и прочего. Надо учитывать, что это ПСЕВДОслучайная велечина, в реальной жизни всё может быть гораздо хуже. Но всё же лучше смоделировать данные фишки, чтобы представлять себе что же может твориться на АЦП.
Вывод: Считать численно производную по снятым значениям с АЦП можно и нужно. Но необходимо оценивать уровень внешних помех, которые могут влиять на сигнул, и очень сильно его портить. Желательно использовать фильтрацию сигнала, выделяя полезный сигнал. Филтрация может быть как аналоговая, так цифровуя. Мне даже показали прекрасную формульную замену аналоговой фильтрацией прекрасной програмкой на си. И разумеется мы должны себе ЧЁТКО представлять какой сигнал цифруем, и не цифровать сигнал на пределах возможностей АЦП. 5 точек на период, как показала практика - не самый плохой вариант!
no subject
Date: 2007-12-04 05:26 pm (UTC)no subject
Date: 2007-12-04 05:35 pm (UTC)no subject
Date: 2007-12-04 06:44 pm (UTC)no subject
Date: 2007-12-04 07:23 pm (UTC)no subject
Date: 2007-12-09 01:42 am (UTC)no subject
Date: 2007-12-09 01:53 am (UTC)Теорема Котельникова ничего не говорит о накопление ошибки при дальнейшем преобразовании сигнала.
no subject
Date: 2007-12-09 05:54 pm (UTC)Чтобы понять это, подумайте о физическом смысле параметра, который вы называете "шаг квантования". Подсказываю - он у вас получился в радианах.
no subject
Date: 2007-12-09 06:05 pm (UTC)no subject
Date: 2007-12-11 11:27 pm (UTC)Поскольку шаг оцифровки, выраженный фазой, равен 10 радианам, а период синуса, как известно, два пи радиан, получается, что на период синуса приходится менее одного отсчета, а именно 0,63. Согласно теореме Котельникова, отсчетов должно быть не менее 2. Поэтому этот график не может передавать первоначальную функцию.
На правом рисунке я построил по точкам правильный синус в соответствующем масштабе, взяв приращение фазы, равным 0,1 радиана. Это зеленая линия. Как видно, этот график имеет три периода на приблизительно 18 радиан, то есть период функции составляет два пи.
"Ваш" график имеет девять полупериодов на приблизительно 110 радиан. То есть период этой функции около 24 радиан, а частота соответственно - приблизительно в 4 раза меньше требуемой. Эта функция имеет очень далекое отношение к исходному синусу.
Дальнейшие вычисления и рассуждения, относящиеся к численному получению производной этой функции, базируются (в случае с 10-радианным шагом оцифровки) на неверных исходных данных...
no subject
Date: 2007-12-11 11:37 pm (UTC)no subject
Date: 2008-02-09 04:27 pm (UTC)