Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм нелинейной регрессии для AVR
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
nikolas_osu
Необходимо аппроксимировать 400 точек полиномом 11 степени, потом полиномы 11 степени будут передаваться по медленному каналу связи...
Есть ли какие-нибудь готовые алгоритмы для этого?..
Xenia
Цитата(nikolas_osu @ Nov 6 2009, 09:37) *
Необходимо аппроксимировать 400 точек полиномом 11 степени, потом полиномы 11 степени будут передаваться по медленному каналу связи...
Есть ли какие-нибудь готовые алгоритмы для этого?..


На платформе AVR, как и на любой другой, можно запрограммировать любые вычисления, если ... хватит места под данные. Особеность тут только та, что МК этой платформы не имеют аппаратного умножения чисел с плавающей точкой, а с использованием эмуляции сложный расчет может занять порядочное время.

Полином 11-ой степени уже не подарок, т.к. расчет в лоб потребует инвертирования матрицы, которая к тому же очень плохо определена (близка к матрице Гильберта). Поэтому такой расчет на AVR лучше не делать, а если и посылать в него данные, то не коэффициенты полинома, а уже готовую обращенную матрицу, чтобы тот только множил на нее вектор данных и больше ни о чем не заботился. А ту матрицу пусть хоть писюк посчитает. Только при этом нужно учесть, что такая матрица-сомножитель для вашего случая будет иметь размерность 400x11=4400 элементов, а если каждый по 4 байта (тип float), то выйдет 17.6 килобайт. Уже многонько, не каждая AVR-ка потянет. А с точностью double потребуется еще вдвое больше памяти. Да и само умножение получится не быстрым при такой большой матрице и медленной реализации умножения.

А если говорить об алгоритмах, то тут, полагаю, надо попытать расчет коэффициентов через полиномы Чебышева. Кажется где-то есть такой способ, отличающийся устойчивостью. Однако в любом случае AVR придется делать одну и ту же операцию умножения вектора длиной 400 на матрицу размером 400х12. А алгоритмы будут различаться между собой только тем, как такая матрица вычисляется. В любом случае вычислять ее надо будет не на AVR, а засылать ему уже готовую.
_Pasha
Цитата(nikolas_osu @ Nov 6 2009, 10:37) *
Необходимо аппроксимировать 400 точек полиномом 11 степени

Какое время выделяется на обсчет?
nikolas_osu
Цитата(_Pasha @ Nov 6 2009, 12:57) *
Какое время выделяется на обсчет?

0.7 секунды
Oldring
Цитата(nikolas_osu @ Nov 6 2009, 09:37) *
Необходимо аппроксимировать 400 точек полиномом 11 степени, потом полиномы 11 степени будут передаваться по медленному каналу связи...


Аппроксимировать полиномом 11-й степени?
Вы уверены, что это действительно хорошая идея?
Builder
Цитата(nikolas_osu @ Nov 6 2009, 09:37) *
Необходимо аппроксимировать 400 точек полиномом 11 степени, потом полиномы 11 степени будут передаваться по медленному каналу связи...
Есть ли какие-нибудь готовые алгоритмы для этого?..

А Вы для начала алгоритм в том-же матлабе или просто на С/С++ уже промоделировали?
Всё устойчиво и хорошо опраксимирует? Что-то подсказывает что будут проблемы с точностью опраксимации,
уж очень много точек на один полином. Если только у точек не какой хитрый закон, которых хорошо ляжет на
полином.
Если у Вас на руках есть алгоритм, как делали? Неужели там нет много матриччных вычислений?
Давно что-то похожее делал, подробности забыл, но для нахождения параметров полинома использовались множители Лагранжа.
Так помнится были проблемы, часто после апроксимации, при проверке качества апроксимации результат был плохой.
Хотя у меня было много граничных условий, в Вашем случае может всё лучше будет работать.
После чего участо разбивался на 2 части, и для них всё считалось одельно. И так дробил отрезок, покуда не получал нужной точности апроксимации.
Возможно этот алгоритм не очень хорошо работал, но тем не менее, есть сомнненя что 400 точек лягут на один полином.

Ну а по теме, 0,7 секунды на AVR для 400 точек, IMHO не реально, у вас будут большие матрыцы, не позубам так быстро считать для AVR.
_Pasha
Цитата(Builder @ Nov 7 2009, 01:40) *
Ну а по теме, 0,7 секунды на AVR для 400 точек, IMHO не реально, у вас будут большие матрыцы, не позубам так быстро считать для AVR.

+1 Не успеет sad.gif
Xenia
Вообще-то за 0.7 сек можно спокойно передать эти 400 точек даже по самому медленному из существующих каналов. И не мучить АВРку.
Tanya
Цитата(Oldring @ Nov 6 2009, 23:52) *
Аппроксимировать полиномом 11-й степени?
Вы уверены, что это действительно хорошая идея?

Я уверена в обратном.
анатолий
В мобильнике считается полином 10 степени и от ~ 270 точек, квантованных на 8000 Гц.
На обсчет полинома тратится где-то 1% времени 16-битного микропроцессора с производительностью 20MIPS.
Так что AVR, если будет только полином считать, то может и успеет.
Oldring
Цитата(анатолий @ Nov 7 2009, 18:10) *
В мобильнике считается полином 10 степени и от ~ 270 точек, квантованных на 8000 Гц.
На обсчет полинома тратится где-то 1% времени 16-битного микропроцессора с производительностью 20MIPS.
Так что AVR, если будет только полином считать, то может и успеет.


Ну еще полином 255-й степени в общеупотребимых кодах Рида-Соломона вспомни.
_pv
Цитата
Алгоритм нелинейной регрессии для AVR
Есть ли какие-нибудь готовые алгоритмы для этого?..

http://www.google.ru/search?&q=polynomial+fitting

только почему она нелинейная-то?

Цитата( @ Nov 6 2009, 14:16) *
На платформе AVR, как и на любой другой, можно запрограммировать любые вычисления, если ... хватит места под данные. Особеность тут только та, что МК этой платформы не имеют аппаратного умножения чисел с плавающей точкой, а с использованием эмуляции сложный расчет может занять порядочное время.
А ту матрицу пусть хоть писюк посчитает. Только при этом нужно учесть, что такая матрица-сомножитель для вашего случая будет иметь размерность 400x11=4400 элементов, а если каждый по 4 байта (тип float), то выйдет 17.6 килобайт.

Ну матрица будет всего 11х11, не так уж и много. Если даже по Гауссу занулять, за секунду вроде можно успеть, да и операции с плавающей запятой наверное можно ускорить немного, от точности зависит, никто же соответствия ieee-754 не требует.

Однако, целесообразность сего действа действительно крайне сомнительна.
vvs157
Цитата(_pv @ Nov 10 2009, 00:12) *
Ну матрица будет всего 11х11, не так уж и много. Если даже по Гауссу занулять, за секуну вроде можно успеть, да и операции с плавающей запятой наверное можно ускорить немного, от точности зависит, никто же соответствия ieee-754 не требует.
Но только еще эту матрицу надо заполнить суммами. Плюс отдельный вопрос про вычислительную устойчивость алгоритма. В общем случае если использовать метод "в лоб" при 32 битных float может терять устойчивость при степенях полинома >6
Oldring
Цитата(vvs157 @ Nov 10 2009, 01:20) *
Но только еще эту матрицу надо заполнить суммами. Плюс отдельный вопрос про вычислительную устойчивость алгоритма. В общем случае если использовать метод "в лоб" при 32 битных float может терять устойчивость при степенях полинома >6


По поводу вычислительной устойчивости на самом деле вопросов нет. Число обусловленности для матрицы составленной из векторов полиноминального базиса до 10 порядка для интервала 0-1 составляет порядка 22 миллионов. В такой ситуации о вычислительной устойчивости алгоритма говорить не приходится.
анатолий
Цитата(Oldring @ Nov 7 2009, 20:39) *
Ну еще полином 255-й степени в общеупотребимых кодах Рида-Соломона вспомни.

Это была оценка вычислительной сложности.Конкретнее следующее.
Если взять какой-нибудь стандарт компрессии речи типа G721, то там есть Си-программки,
в том числе и нахождение АР-модели кадра речи - ее можно взять за основу и даже странслировать в AVR.
Правда, степень полинома нужно будет увеличить с10 до 11.
В стандарте программа сделана очень профессионально -есть чему поучиться.
Oldring
Цитата(анатолий @ Nov 10 2009, 15:24) *
Это была оценка вычислительной сложности.


Неправильная. Обращать теплицевы матрицы на DSP это совсем не то же самое, что обращать матрицы общего вида на AVR.
И там полином по z, а не по x biggrin.gif
fontp
Цитата(Oldring @ Nov 10 2009, 15:40) *
И там полином по z, а не по x biggrin.gif



Действительно там - авторегрессия, а здесь линейная полиномиальная регрессия высокой степени. (нелинейна она разве только для AVR, поскольку по переменным задача линейна rolleyes.gif )

Ортогональность полиномов спасает, но с такими высокими степенями начинается подгонка под данные.
Поэтому математики предпочитают всегда полиномам степени 11 кусочно-непрерывные кубические сплайны
И вычислительно это значительно более "лёгкое" решение
анатолий
Цитата(Oldring @ Nov 10 2009, 15:40) *
Неправильная. Обращать теплицевы матрицы на DSP это совсем не то же самое, что обращать матрицы общего вида на AVR.
И там полином по z, а не по x biggrin.gif

Я понял, что смысл задачи - передача кривой с серьезной компрессией.
АР-метод действует-кодируется 400 точек кривой через найденный АР-полином и функцию его возбуждения.
А тут пусть попробуют аппроксимировать 400 точек полиномом, хоть и 11 степени.
Тогда действительно, для AVR задача неподъемная. Даже с плавающей запятой могут быть большие ошибки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.