Тригонометрические функции во встроенной системе

Определенно легче поддержать, если Вы помещаете его в хранимую процедуру. Если существует трудная логика, включенная, который потенциально изменится в будущем, это - определенно хорошая идея поместить его в базу данных, когда у Вас есть несколько клиентов, соединяющихся. Например, я работаю над приложением прямо сейчас, которое имеет веб-интерфейс конечного пользователя и административное настольное приложение, оба из которых совместно используют базу данных (очевидно), и я пытаюсь сохранить как можно больше логики на базе данных. Это - идеальный пример принцип DRY .

9
задан starblue 15 October 2009 в 11:21
поделиться

8 ответов

Для вычисления ряда Тейлора или Фурье всегда требуется много времени.

Во встроенной системе вы должны подумать о справочные таблицы .

В сети также может быть интересная информация о том, как Hewlett-Packard оптимизировал такие вычисления в своих ранних научных калькуляторах.

Я припоминаю, что видел такие вещи в то время

16
ответ дан 4 December 2019 в 06:30
поделиться

Кажется, есть хороший пример псевдокода здесь и явный код здесь .

Однако, как предлагает @unwind, вы можете попытаться предварительно вычислить эти таблицы на приличном компьютере и загрузить таблицы во встроенное устройство.

Если ваш ответ не должен быть очень точным, таблица поиска будет довольно маленьким, и вы сможете сохранить его в памяти вашего устройства. Если вам нужна более высокая точность, вам нужно будет рассчитать ее на устройстве. Это компромисс между памятью, временем и требуемой точностью; ответ зависит от специфики вашего проекта.

вы можете попытаться предварительно вычислить эти таблицы на приличном компьютере и загрузить таблицы во встроенное устройство.

Если ваш ответ не должен быть очень точным, таблица поиска будет довольно маленькой, и вы будете возможность сохранить его в памяти вашего устройства. Если вам нужна более высокая точность, вам нужно будет рассчитать ее на устройстве. Это компромисс между памятью, временем и требуемой точностью; ответ зависит от специфики вашего проекта.

вы можете попытаться предварительно вычислить эти таблицы на приличном компьютере и загрузить таблицы на встроенное устройство.

Если ваш ответ не должен быть очень точным, таблица поиска будет довольно маленькой, и вы будете возможность сохранить его в памяти вашего устройства. Если вам нужна более высокая точность, вам нужно будет рассчитать ее на устройстве. Это компромисс между памятью, временем и требуемой точностью; ответ зависит от специфики вашего проекта.

время и требуемая точность; ответ зависит от специфики вашего проекта.

время и требуемая точность; ответ зависит от специфики вашего проекта.

0
ответ дан 4 December 2019 в 06:30
поделиться

См. Вопрос о переполнении стека Как работают тригонометрические функции? В принятом там ответе объясняются некоторые детали того, как уменьшить диапазон, затем использовать CORDIC, а затем выполнить некоторые дальнейшие оптимизации .

2
ответ дан 4 December 2019 в 06:30
поделиться

Зависит от того, для чего он вам нужен. Если вас не очень беспокоит точность угла (например, если округлить до ближайшего градуса, то все в порядке), тогда просто используйте справочную таблицу значений. Если у вас нет FPU, работайте с фиксированной точкой .

Один простой способ вычислить функции sin / cos - использовать ряд Тейлора (как показано в разделе «Тригонометрические функции здесь ). Чем меньше терминов вы используете, тем менее точны значения, но тем быстрее вычисления.

Для вычислений ряда Фурье необходимо знать некоторые значения sin / cos. Если вы храните данные в частотной области большую часть времени, вы потенциально можете сэкономить на вычислениях - в зависимости от того, что вы делаете.

4
ответ дан 4 December 2019 в 06:30
поделиться
  1. Таблицы поиска
  2. Серия Тейлора , как вы говорите

Обратите внимание, что с помощью таблиц поиска вы часто можете оптимизировать вещи, ограничивая область, например, представляя угол как беззнаковый символ, дающий вам только 256 шагов по кругу, но также очень компактную таблицу. Аналогичные вещи можно сделать и со значением, например, используя фиксированную точку.

2
ответ дан 4 December 2019 в 06:30
поделиться

Таблица поиска с интерполяцией, без сомнения, была бы наиболее эффективным решением. Однако, если вы хотите использовать меньше памяти, CORDIC - довольно эффективный алгоритм для вычисления значений триггерных функций, который обычно реализуется в портативных калькуляторах.

Как побочный момент, он не делает никаких Имеет смысл представлять эти функции с помощью рядов Фурье, поскольку вы просто создаете круговую проблему того, как вы затем оцениваете члены ряда sin / cos. Ряд Тейлора - это хорошо известный метод приближения, но во многих случаях ошибка оказывается неприемлемо большой.

Вы также можете проверить этот вопрос и ответы на него , касающиеся быстрых тригонометрических функций. для Java (таким образом код можно было легко перенести). В нем, среди прочего, упоминаются как CORDIC, так и приближения Чебышева. Один из них, несомненно, подойдет вам.

10
ответ дан 4 December 2019 в 06:30
поделиться

This Dr. Dobb's article: Optimizing Math-Intensive Applications with Fixed-Point Arithmetic has a good explanation of CORDIC algorithms and provides complete source code for the library discussed in the article.

3
ответ дан 4 December 2019 в 06:30
поделиться

В некоторых случаях можно обойтись только ИДК-фильтром, настроенным на резонанс на нужной частоте. Смотрите сюда: http://www.ee.ic.ac.uk/pcheung/teaching/ee3_Study_Project/Sinewave%20Generation(708).pdf

0
ответ дан 4 December 2019 в 06:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: