Полная версия этой страницы:
Вычисление СКО
alexPec
Aug 22 2010, 09:16
Всем добрый день. Не сталкивался ли кто с подобной задачей:
надо вычислить среднеквадратичное отклонение массива в 1024 байта аппаратно. Получается, при решении задачи в лоб, надо сначала пробежаться по массиву (1024 такта), сложить все элементы, поделить на 1024 (сдвинуть результат на 10 бит), затем снова пробежаться по массиву, вычитая из каждого отсчета среднее (возведения в квадрат опускаю, полагаем, что это делатеся на лету, не затрачивая тактов). Проблема в том, что частота отсчетов - 8 мгц, то есть при решении задачи в лоб после каждого отсчета нужно производить пересчет (2048 тактов). при частоте 8 мгц умнодаем на 2048 тактовая частота должна быть около 1,6 ГГц - плохо. Допустим, среднее можно на лету вычислять, используя FIFO, после каждого осчета добавляя куже имеющейся сумме новый и вычитая 1025-й. А с СКО как быть? Придется чтоли таки пробегаться по массиву, вычисляя разность со средним? Это частота должна быть 800 МГц - тоже плохо...
SSerge
Aug 22 2010, 11:02
σ2 = (1/n) Σ(xi-ξ)2 = (1/n) Σ(xi2 - 2xiξ + ξ2) = (1/n) ( Σxi2 - 2ξΣxi + nξ2 )
Вспоминаем, что среднее это ξ = (1/n) Σxi после подстановки получается:
σ2 = (1/n) ( Σxi2 - (Σxi)2/n )
Таким образом получается что достаточно накапливать две суммы Σxi и Σxi2, остальное из них вычисляется.
alexPec
Aug 22 2010, 15:56
Вариант! Спасибо! Только сумма xi2 большое число будет (соответственно большой сумматор), но с этим уже ничего не поделаешь, я так понимаю?
SSerge
Aug 22 2010, 17:34
Если среднее заранее неизвестно, то да.
Если же оно изменяется не слишком быстро, то можно его более-менее точно отслеживать с помощью ФНЧ и использовать "на лету" при вычислении среднеквадратичного прямо по определению σ2 = (1/n) Σ(xi-ξi)2, где ξi есть текущая оценка среднего (выход ФНЧ).
Я делал подобное на AVR-ке для грубой оценки энергии сигнала с простейшим IIR 1-го порядка (аналог RC-цепочки). Вроде работало, но там дрейф среднего значения был очень медленный, поэтому проблем не было.
Вопрос о вносимых таким методом погрешностях я не исследовал, ничего определённого сказать не могу.
добавлено:
(xi-ξi)2 можно тоже не накапливать а пихать на вход второго ФНЧ, это может быть экономнее по расходу памяти и необходимой разрядности.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.