Комрады-програмеры, помощь зала нужна.
Mar. 22nd, 2008 02:13 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Простейшая задача, но я почему-то не могу нащупать элегантное решение.
Есть такая задачечка: сделать генератор сигналов Совершенно Произвольной Формы. Техническое обеспечение: микропроцессор и ЦАП. Всё работает, иного и не следовало ожидать.
Подзадача, на которой я торможу: генератор линейных (в смысле - буквально линейшых, вида A*x+B) сигналов. Нет, сделать её "в лоб" можно, и ничего тут такого нет. Но мне совсем не хочется заставлять проц считать в плавающей точке - просто потому, что это отнюдь не Атлон64, не Пентиум и даже не 386 - это восьмибитный микроконтроллер, и вычислительные способности у него далеко не самые выдающиеся. Можно, конечно, ещё на fixed point попробовать, но это неспортивно...
Частично задача решена при помощи алгоритма Брезенхама. Он прекрасно работает, но у него есть исключение - если наклон линии больше 45 градусов (по модулю, т.е. наклон и отрицательный может быть), то алгоритм перестаёт работать. В принципе, его можно было бы перевернуть зеркально относительно этих 45 градусов, если бы не одно ограничение - выходной-то сигнал, фактически, одномерный! Т.е. сам алгоритм генерации идёт вдоль оси t, она же ось x. Нет возможности поменять местами x и y, нет возможности забабахать огромные массивы и т.п., и т.д. Нет так же возможности долго думать между отсчётами - сигнал должен генериться без провалов и потерь выборок. Т.е. алгоритм должен быть строго итерационным, простым и без рекурсий.
Есть ли какие-нибудь общие соображения на эту тему? Или безнадёга и придётся, блин, всё-таки решать "в лоб"?
Есть такая задачечка: сделать генератор сигналов Совершенно Произвольной Формы. Техническое обеспечение: микропроцессор и ЦАП. Всё работает, иного и не следовало ожидать.
Подзадача, на которой я торможу: генератор линейных (в смысле - буквально линейшых, вида A*x+B) сигналов. Нет, сделать её "в лоб" можно, и ничего тут такого нет. Но мне совсем не хочется заставлять проц считать в плавающей точке - просто потому, что это отнюдь не Атлон64, не Пентиум и даже не 386 - это восьмибитный микроконтроллер, и вычислительные способности у него далеко не самые выдающиеся. Можно, конечно, ещё на fixed point попробовать, но это неспортивно...
Частично задача решена при помощи алгоритма Брезенхама. Он прекрасно работает, но у него есть исключение - если наклон линии больше 45 градусов (по модулю, т.е. наклон и отрицательный может быть), то алгоритм перестаёт работать. В принципе, его можно было бы перевернуть зеркально относительно этих 45 градусов, если бы не одно ограничение - выходной-то сигнал, фактически, одномерный! Т.е. сам алгоритм генерации идёт вдоль оси t, она же ось x. Нет возможности поменять местами x и y, нет возможности забабахать огромные массивы и т.п., и т.д. Нет так же возможности долго думать между отсчётами - сигнал должен генериться без провалов и потерь выборок. Т.е. алгоритм должен быть строго итерационным, простым и без рекурсий.
Есть ли какие-нибудь общие соображения на эту тему? Или безнадёга и придётся, блин, всё-таки решать "в лоб"?
no subject
Date: 2008-03-21 11:41 pm (UTC)Другого не дано. ;)
Всякие оптимизации наподобие Брезенхема подходят только для двух определенных классов генераторов (линия и окружность). Но не в случае произвольной формы.
(no subject)
From:(no subject)
From: