CORDIC

редактировать
Алгоритм для вычисления тригонометрических, гиперболических, логарифмических и экспоненциальных функций

CORDIC (для CO ордината R otation DI gital C компьютер), также известный как алгоритм Волдера, включая Circular CORDIC (Jack E. Volder), Linear CORDIC, Hyperbolic CORDIC (John Stephen Walther) и Generalized Hyperbolic CORDIC (GH CORDIC ) (Yuanyong Luo et al.), представляет собой простой и эффективный алгоритм для вычисления тригонометрических функций, гиперболических функций, квадратных корней, умножений., деления и экспоненты и логарифмы с произвольной базой, обычно сходящиеся с одной цифрой (или битом) на итерацию. Таким образом, CORDIC также является примером цифровых алгоритмов. CORDIC и близкие к нему методы, известные как псевдоумножение и псевдоделение или комбинирование множителей, обычно используются, когда нет аппаратного умножителя. (например, в простых микроконтроллерах и FPGA ), поскольку единственные операции, которые требуются, это сложение, вычитание, битовый сдвиг и таблицы поиска. Таким образом, все они принадлежат к классу алгоритмов сдвига и сложения. В информатике CORDIC часто используется для реализации арифметики с плавающей запятой, когда на целевой платформе не хватает аппаратного умножения по причинам стоимости или места.

Содержание
  • 1 История
  • 2 Приложения
    • 2.1 Аппаратное обеспечение
    • 2.2 Программное обеспечение
  • 3 Режимы работы
    • 3.1 Режим вращения
    • 3.2 Режим векторизации
  • 4 Реализация
    • 4.1 Пример программного обеспечения
    • 4.2 Пример оборудования
  • 5 Связанные алгоритмы
  • 6 См. Также
  • 7 Ссылки
  • 8 Дополнительная литература
  • 9 Внешние ссылки
История

Похожие математические методы были опубликованы Генри Бриггсом еще в 1624 г. и Робертом Флауэром в 1771 г., но CORDIC лучше оптимизирован для ЦП с конечным состоянием низкой сложности.

CORDIC был разработан в 1956 году отделом аэроэлектроники компании Convair из-за необходимости замены аналогового преобразователя в B -58 бомбардировщик с более точным и производительным цифровым решением в реальном времени. Поэтому CORDIC иногда называют a.

В своем исследовании Волдер был вдохновлен формулой из издания 1946 года Справочника по химии и физике CRC :

K n R sin ⁡ (θ ± φ) = R sin ⁡ (θ) ± 2 - n R cos ⁡ (θ), K n R cos ⁡ (θ ± φ) = R cos ⁡ (θ) ∓ 2 - n R sin ⁡ (θ), { \ Displaystyle {\ begin {align} K_ {n} R \ sin (\ theta \ pm \ varphi) = R \ sin (\ theta) \ pm 2 ^ {- n} R \ cos (\ theta), \\ K_ {n} R \ cos (\ theta \ pm \ varphi) = R \ cos (\ theta) \ mp 2 ^ {- n} R \ sin (\ theta), \\\ конец {выровнено}}}{\ displaystyle {\ begin {align} K_ {n} R \ sin (\ theta \ pm \ varphi) = R \ sin (\ theta) \ pm 2 ^ {- n} R \ cos (\ theta), \\ K_ {n} R \ cos (\ theta \ pm \ varphi) = R \ cos (\ theta) \ mp 2 ^ {- n} R \ sin (\ theta), \\\ конец {выровнено}}}

с К n = 1 + 2 - 2 n {\ displaystyle K_ {n} = {\ sqrt {1 + 2 ^ {- 2n}}}}{\ displaystyle K_ {n} = {\ sqrt {1 + 2 ^ {- 2n}}}} , загар ⁡ (φ) = 2 - n {\ displaystyle \ tan (\ varphi) = 2 ^ {- n}}{\ displaystyle \ tan (\ varphi) = 2 ^ {- n}} .

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

В 1958 году, наконец, начал работу Convair. создать демонстрационную систему для решения проблем с исправлением радара под названием CORDIC I, завершенную в 1960 году без Волдера, который уже покинул компанию. Более универсальные модели CORDIC II A (стационарные) и B (бортовые) были построены и испытаны Даггеттом и Гарри Шуссом в 1962 году.

Алгоритм CORDIC Волдера был впервые публично описан в 1959 году, что заставило его включить в навигационные компьютеры от компаний, включая: Computer Control, Litton, Kearfott, Lear-Siegler, Sperry, Raytheon и Collins Radio в ближайшее время.

Волдер объединился с Малкольмом Макмилланом для создания Athena, фиксированной точки настольного калькулятора используя свой двоичный алгоритм CORDIC. Этот дизайн был представлен на Hewlett-Packard в июне 1965 г., но не принят. Тем не менее, Макмиллан представил (HP) алгоритм Волдера, и когда Кокран позже встретил Волдера, он направил его к аналогичному подходу (IBM), предложенному в 1961 году как псевдоумножение и псевдоделение. Метод Меггитта также предлагал использовать основание 10, а не чем основание 2, которое до сих пор использовалось Volder's CORDIC. Эти усилия привели к логической реализации ROMable прототипа десятичной машины CORDIC внутри Hewlett-Packard в 1966 году, построенной и концептуально выведенной из прототипа Green Machine, четырехфункционального плавающего устройства. Point настольный калькулятор он завершил в логике DTL в декабре 1964 года. Результатом этого проекта стала публичная демонстрация первого настольного калькулятора Hewlett-Packard с научными функциями, hp 9100A в Март 1968 года, серийное производство началось позже в том же году.

Когда Wang Laboratories обнаружили, что hp 9100A использовала подход, аналогичный методу комбинирования факторов в их более раннем ( Сентябрь 1964) и (январь 1965) настольные калькуляторы Logarithmic Computing Instrument, они безуспешно обвинили Hewlett-Packard в нарушении одного из патентов An Wang в 1968 году.

в Hewlett-Packard обобщили. алгоритм в алгоритм Unified CORDIC в 1971 году, позволяющий вычислить h аперболические функции, натуральные экспоненты, натуральные логарифмы, умножения, деления и квадратные корни. Подпрограммы CORDIC для тригонометрических и гиперболических функций могут использовать большую часть своего кода. Результатом этой разработки стал первый научный портативный калькулятор, HP-35 в 1972 году. На основе гиперболического CORDIC, et al. далее предложил обобщенный гиперболический CORDIC (GH CORDIC) для прямого вычисления логарифмов и экспонент с произвольной фиксированной базой в 2019 году. Теоретически гиперболический CORDIC является частным случаем GH CORDIC.

Первоначально CORDIC был реализован только с использованием двоичная система счисления и, несмотря на то, что Меггитт предлагал использовать десятичную систему для своего подхода псевдоумножения, десятичная система CORDIC оставалась в основном неслыханной еще несколько лет, так что Герман Шмид и Энтони Богацки все еще предлагал его как новинку еще в 1973 году, и только позже выяснилось, что Hewlett-Packard реализовала его уже в 1966 году.

Десятичный CORDIC стал широко использоваться в карманных калькуляторах, большинство из которых работают в двоично-десятичном формате (BCD), а не в двоичном формате. Это изменение формата ввода и вывода не повлияло на основные алгоритмы вычислений CORDIC. CORDIC особенно хорошо подходит для портативных калькуляторов, в которых низкая стоимость - и, следовательно, малое количество микросхем - гораздо важнее скорости.

CORDIC был реализован в ARM- на основе STM32G4, Intel 8087, 80287, 80387 до серии сопроцессоров 80486, а также в Motorola 68881 и 68882 для некоторых видов команд с плавающей запятой, в основном как способ уменьшить количество вентилей (и сложность) подсистемы FPU.

Приложения

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

Аппаратное обеспечение

Алгоритм использовался в навигационной системе программы Apollo Лунный вездеход для вычисления пеленга и дальности или расстояния от лунного модуля. CORDIC использовался для реализации математического сопроцессора Intel 8087 в 1980 году, что позволило избежать необходимости реализации аппаратного умножения.

CORDIC обычно работает быстрее, чем другие подходы, когда аппаратный умножитель недоступен (например, микроконтроллер), или когда количество вентилей, необходимых для реализации поддерживаемых им функций, должно быть минимизировано (например, в FPGA или ASIC ).

С другой стороны, когда доступен аппаратный умножитель (например, в микропроцессоре DSP ), методы поиска по таблице и ряды степеней обычно быстрее, чем CORDIC. В последние годы алгоритм CORDIC широко используется в различных биомедицинских приложениях, особенно в реализациях FPGA.

Программное обеспечение

Многие старые системы с ЦП только для целых чисел реализовали CORDIC в различной степени как часть своих библиотек с плавающей запятой IEEE. Поскольку большинство современных процессоров общего назначения имеют регистры с плавающей запятой с общими операциями, такими как сложение, вычитание, умножение, деление, синус, косинус, квадратный корень, log 10, натуральный логарифм, необходимость реализации CORDIC в их с ПО практически не существует. Только микроконтроллер или специальные приложения, обеспечивающие безопасность и ограниченные по времени, должны рассматривать возможность использования CORDIC.

Режимы работы

Режим вращения

CORDIC можно использовать для вычисления ряда различных функций. Это объяснение показывает, как использовать CORDIC в режиме вращения для вычисления синуса и косинуса угла, предполагая, что желаемый угол задан в радианах и представлен в формате с фиксированной точкой. Чтобы определить синус или косинус для угла β {\ displaystyle \ beta}\ beta , координата y или x точки на единичной окружности, соответствующей желаемому углу, должна быть найденным. Используя CORDIC, можно начать с вектора v 0 {\ displaystyle v_ {0}}v_ {0} :

v 0 = [1 0]. {\ displaystyle v_ {0} = {\ begin {bmatrix} 1 \\ 0 \ end {bmatrix}}.}{\ displaystyle v_ {0} = {\ begin {bmatrix} 1 \\ 0 \ end {bmatrix}}. }
Иллюстрация выполняющегося алгоритма CORDIC

В первой итерации этот вектор повернут на 45 ° против часовой стрелки, чтобы получить вектор v 1 {\ displaystyle v_ {1}}v_ {1} . Последовательные итерации поворачивают вектор в том или ином направлении путем уменьшения размера, пока не будет достигнут желаемый угол. Шаг i {\ displaystyle i}я размер arctan ⁡ (2 - i) {\ displaystyle \ arctan {(2 ^ {- i})}}{\ displaystyle \ arctan {(2 ^ {- i})}} for i = 0, 1, 2,… {\ displaystyle i = 0,1,2, \ dots}{ \ displaystyle i = 0,1,2, \ dots} .

Более формально, каждая итерация вычисляет поворот, который выполняется путем умножения вектора vi - 1 {\ displaystyle v_ {i-1}}v_ {i-1} с матрицей поворота R i {\ displaystyle R_ {i}}R_ {i} :

vi = R ivi - 1. {\ displaystyle v_ {i} = R_ {i} v_ {i-1}.}{\ displaystyle v_ {i} = R_ {i} v_ {i-1}.}

Матрица вращения задается как

R i = [cos ⁡ (γ i) - sin ⁡ (γ i) sin ⁡ (γ i) cos ⁡ (γ i)]. {\ Displaystyle R_ {я} = {\ begin {bmatrix} \ cos (\ gamma _ {i}) - \ sin (\ gamma _ {i}) \\\ sin (\ gamma _ {i}) \ cos (\ gamma _ {i}) \ end {bmatrix}}.}{\ displaystyle R_ {i} = {\ begin {bmatrix} \ cos (\ gamma _ {i}) - \ sin (\ gamma _ {i}) \\\ sin (\ gamma _ {i}) \ cos (\ gamma _ {i}) \ конец {bmatrix}}.}

Используя следующие два тригонометрических тождества :

cos ⁡ (γ i) = 1 1 + tan 2 ⁡ (γ i), грех ⁡ (γ я) знак равно загар ⁡ (γ я) 1 + загар 2 ⁡ (γ я), {\ displaystyle {\ begin {align} \ cos (\ gamma _ {i}) = {\ frac {1} {\ sqrt {1+ \ tan ^ {2} (\ gamma _ {i})}}}, \\\ sin (\ gamma _ {i}) = {\ frac {\ tan (\ gamma _ {i })} {\ sqrt {1+ \ tan ^ {2} (\ gamma _ {i})}}}, \ end {align}}}{\ displaystyle {\ begin {align ed} \ cos (\ gamma _ {i}) = {\ frac {1} {\ sqrt {1+ \ tan ^ {2} (\ gamma _ {i})}}}, \\\ sin (\ gamma _ {i}) = {\ frac {\ tan (\ gamma _ {i})} {\ sqrt {1+ \ tan ^ {2} (\ gamma _ {i})}}}, \ end { выровнено}}}

матрица поворота принимает вид

R i = 1 1 + tan 2 ⁡ (γ i) [1 - tan ⁡ (γ i) tan ⁡ (γ i) 1]. {\ displaystyle R_ {i} = {\ frac {1} {\ sqrt {1+ \ tan ^ {2} (\ gamma _ {i})}}} {\ begin {bmatrix} 1 - \ tan (\ gamma _ {i}) \\\ tan (\ gamma _ {i}) 1 \ end {bmatrix}}.}{\ displaystyle R_ {i} = {\ frac {1 } {\ sqrt {1+ \ tan ^ {2} (\ gamma _ {i})}}} {\ begin {bmatrix} 1 - \ tan (\ gamma _ {i}) \\\ tan (\ gamma _ {i}) 1 \ end {bmatrix}}.}

Выражение для повернутого вектора vi = R ivi - 1 {\ displaystyle v_ {i } = R_ {i} v_ {i-1}}v_ {i} = R_ {i} v_ {i-1} тогда становится

vi = 1 1 + tan 2 ⁡ (γ i) [1 - tan ⁡ (γ i) tan ⁡ (γ i) 1] [xi - 1 yi - 1], {\ displaystyle v_ {i} = {\ frac {1} {\ sqrt {1+ \ tan ^ {2} (\ gamma _ {i})}}} { \ begin {bmatrix} 1 - \ tan (\ gamma _ {i}) \\\ tan (\ gamma _ {i}) 1 \ end {bmatrix}} {\ begin {bmatrix} x_ {i-1} \\ y_ {i-1} \ end {bmatrix}},}{\ displaystyle v_ {i} = {\ frac {1} {\ sqrt {1+ \ tan ^ {2} (\ gamma _ {i})}}} {\ begin {bmatrix} 1 - \ tan (\ gamma _ {i}) \\\ tan (\ gamma _ {i}) 1 \ end {bmatrix}} {\ begin {bmatrix} x_ {i-1} \\ y_ { i-1} \ end {bmatrix}},}

где xi - 1 {\ displaystyle x_ {i-1}}x_ { i-1} и yi - 1 {\ displaystyle y_ {i-1}}y_ {i-1} - компоненты vi - 1 {\ displaystyle v_ {i-1}}v_ {i-1} . Ограничение углов γ i {\ displaystyle \ gamma _ {i}}\ gamma _ {i} таким образом, чтобы tan ⁡ (γ i) = ± 2 - i {\ displaystyle \ tan (\ gamma _ { i}) = \ pm 2 ^ {- i}}{\ displaystyle \ tan (\ gamma _ {i}) = \ pm 2 ^ {- i}} , умножение на тангенс можно заменить делением на степень двойки, что эффективно выполняется в аппаратном обеспечении цифрового компьютера с использованием битовый сдвиг. Тогда выражение принимает вид

vi = K i [1 - σ i 2 - i σ i 2 - i 1] [xi - 1 yi - 1], {\ displaystyle v_ {i} = K_ {i} {\ begin {bmatrix} 1 - \ sigma _ {i} 2 ^ {- i} \\\ sigma _ {i} 2 ^ {- i} 1 \ end {bmatrix}} {\ begin {bmatrix} x_ {i-1} \\ y_ {i-1} \ end {bmatrix}},}{\ displaystyle v_ {i} = K_ {i} {\ begin {bmatrix} 1 - \ sigma _ {i} 2 ^ {- i} \\\ sigma _ {i} 2 ^ {- i} 1 \ end {bmatrix}} {\ begin {bmatrix} x_ {i-1} \\ y_ {i-1} \ end {bmatrix}},}

где

K i = 1 1 + 2-2 i, {\ displaystyle K_ {i} = {\ frac {1} {\ sqrt {1 + 2 ^ {- 2i}}}},}{\ displaystyle K_ {i} = {\ frac {1} {\ sqrt {1 + 2 ^ {- 2i}}}},}

и σ i {\ displaystyle \ sigma _ {i}}\ sigma _ {i} используется для определения направления вращения: если угол γ i {\ displaystyle \ gamma _ {i}}\ gamma _ {i} положительный, то σ i {\ displaystyle \ sigma _ {i}}\ sigma _ {i} равно +1, в противном случае - -1.

K i {\ displaystyle K_ {i}}K_ {i} можно игнорировать в итеративном процессе, а затем применять после этого с коэффициентом масштабирования

K (n) = ∏ i = 0 n - 1 K я знак равно ∏ я знак равно 0 N - 1 1 1 + 2 - 2 я, {\ Displaystyle К (п) = \ prod _ {я = 0} ^ {п-1} K_ {я} = \ prod _ {я = 0} ^ {n-1} {\ frac {1} {\ sqrt {1 + 2 ^ {- 2i}}}},}{\ displaystyle K ( n) = \ prod _ {i = 0} ^ {n-1} K_ {i} = \ prod _ {i = 0} ^ {n-1} {\ frac {1} {\ sqrt {1 + 2 ^ {-2i}}}},}

который вычисляется заранее и сохраняется в таблице или как отдельная константа, если количество итераций фиксировано. Это исправление также можно сделать заранее, масштабируя v 0 {\ displaystyle v_ {0}}v_ {0} и, следовательно, сохраняя умножение. Кроме того, можно отметить, что

K = lim n → ∞ K (n) ≈ 0,6072529350088812561694 {\ displaystyle K = \ lim _ {n \ to \ infty} K (n) \ приблизительно 0,6072529350088812561694}{\ displaystyle K = \ lim _ {n \ to \ infty} K (n) \ приблизительно 0.6072529350088812561694}

, чтобы разрешить дальнейшее снижение сложности алгоритма. Некоторые приложения могут вообще не исправлять K {\ displaystyle K}K , что дает выигрыш при обработке A {\ displaystyle A}A :

A = 1 K = lim n → ∞ ∏ i = 0 n - 1 1 + 2 - 2 i ≈ 1,64676025812107. {\ displaystyle A = {\ frac {1} {K}} = \ lim _ {n \ to \ infty} \ prod _ {i = 0} ^ {n-1} {\ sqrt {1 + 2 ^ {- 2i}}} \ приблизительно 1.64676025812107.}{\ displaystyle A = {\ frac {1} {K}} = \ lim _ {n \ to \ infty} \ prod _ {i = 0} ^ {n-1} {\ sqrt {1 + 2 ^ {- 2i}}} \ приблизительно 1.64676025812107.}

После достаточного количества итераций угол вектора будет близок к желаемому углу β {\ displaystyle \ beta}\ beta . Для большинства обычных целей 40 итераций (n = 40) достаточно, чтобы получить правильный результат с точностью до 10-го знака после запятой.

Осталось только определить, следует ли вращать по часовой стрелке или против часовой стрелки на каждой итерации (выбирая значение σ {\ displaystyle \ sigma}\ sigma ). Это делается путем отслеживания того, на сколько угол был повернут на каждой итерации, и вычитания этого из желаемого угла; затем, чтобы приблизиться к желаемому углу β {\ displaystyle \ beta}\ beta , если β n + 1 {\ displaystyle \ beta _ {n + 1}}\ beta _ {п + 1} положительно, вращение - по часовой стрелке, в противном случае - отрицательное, и вращение - против часовой стрелки:

β i = β i - 1 - σ i γ i, γ i = arctan ⁡ (2 - i). {\ displaystyle \ beta _ {i} = \ beta _ {i-1} - \ sigma _ {i} \ gamma _ {i}, \ quad \ gamma _ {i} = \ arctan (2 ^ {- i}).}{\ displaystyle \ beta _ {i} = \ beta _ {i-1} - \ sigma _ {i } \ gamma _ {i}, \ quad \ gamma _ {i} = \ arctan (2 ^ {- i}).}

Значения γ n {\ displaystyle \ gamma _ {n}}\ gamma _ {n} также должны быть предварительно вычислены и сохранены. Но для малых углов arctan ⁡ (γ n) = γ n {\ displaystyle \ arctan (\ gamma _ {n}) = \ gamma _ {n}}{\ displaystyle \ arctan (\ gamma _ {n}) = \ gamma _ {n}} в представлении с фиксированной точкой, уменьшение размера стола.

Как видно на иллюстрации выше, синус угла β {\ displaystyle \ beta}\ beta является координатой y конечного вектора vn, { \ displaystyle v_ {n},}{\ displaystyle v_ { n},} , а координата x - это значение косинуса.

Режим векторизации

Алгоритм режима вращения, описанный выше, может повернуть любой вектор (не только единичный вектор, выровненный по оси x) на угол между -90 ° и + 90 °. Решения о направлении вращения зависят от положительного или отрицательного значения β i {\ displaystyle \ beta _ {i}}\ beta _ {i} .

Режим работы с векторизацией требует небольшой модификации алгоритма. Он начинается с вектора, координата x которого положительна, а координата y произвольна. Последовательные повороты имеют цель повернуть вектор к оси x (и, следовательно, уменьшить координату y до нуля). На каждом шаге значение y определяет направление вращения. Конечное значение β i {\ displaystyle \ beta _ {i}}\ beta _ {i} содержит общий угол поворота. Конечное значение x будет величиной исходного вектора, масштабированного с помощью K. Таким образом, очевидное использование режима векторизации - это преобразование прямоугольных координат в полярные.

Реализация

Пример программного обеспечения

Ниже приведена реализация CORDIC MATLAB / GNU Octave, которая не полагается ни на какие трансцендентные функции, за исключением предварительного вычисления таблиц. Если количество итераций n заранее определено, то вторая таблица может быть заменена одной константой. С помощью стандартной арифметики с двойной точностью и распечатки «длинного формата» в MATLAB точность результатов увеличивается для n примерно до 48.

function v = cordic (beta, n)% Эта функция вычисляет v = [cos (beta), sin (beta)] (beta в радианах)% с использованием n итераций. Увеличение n увеличит точность. если бета < -pi/2 || beta>пи / 2, если бета < 0 v = cordic(beta + pi, n); else v = cordic(beta - pi, n); end v = -v; % flip the sign for second or third quadrant return end % Initialization of tables of constants used by CORDIC % need a table of arctangents of negative powers of two, in radians: % angles = atan(2.^-(0:27)); angles = [... 0.78539816339745 0.46364760900081 0.24497866312686 0.12435499454676... 0.06241880999596 0.03123983343027 0.01562372862048 0.00781234106010... 0.00390623013197 0.00195312251648 0.00097656218956 0.00048828121119... 0.00024414062015 0.00012207031189 0.00006103515617 0.00003051757812... 0.00001525878906 0.00000762939453 0.00000381469727 0.00000190734863... 0.00000095367432 0.00000047683716 0.00000023841858 0.00000011920929... 0.00000005960464 0.00000002980232 0.00000001490116 0.00000000745058 ]; % and a table of products of reciprocal lengths of vectors [1, 2^-2j]: % Kvalues = cumprod(1./abs(1 + 1j*2.^(-(0:23)))) Kvalues = [... 0.70710678118655 0.63245553203368 0.61357199107790 0.60883391251775... 0.60764825625617 0.60735177014130 0.60727764409353 0.60725911229889... 0.60725447933256 0.60725332108988 0.60725303152913 0.60725295913894... 0.60725294104140 0.60725293651701 0.60725293538591 0.60725293510314... 0.60725293503245 0.60725293501477 0.60725293501035 0.60725293500925... 0.60725293500897 0.60725293500890 0.60725293500889 0.60725293500888 ]; Kn = Kvalues(min(n, length(Kvalues))); % Initialize loop variables: v = [1;0]; % start with 2-vector cosine and sine of zero poweroftwo = 1; angle = angles(1); % Iterations for j = 0:n-1; if beta < 0 sigma = -1; else sigma = 1; end factor = sigma * poweroftwo; % Note the matrix multiplication can be done using scaling by powers of two and addition subtraction R = [1, -factor; factor, 1]; v = R * v; % 2-by-2 matrix multiply beta = beta - sigma * angle; % update the remaining angle poweroftwo = poweroftwo / 2; % update the angle from table, or eventually by just dividing by two if j+2>длина (углы) угол = угол / 2; иначе угол = углы (j + 2); end end% Настройте длину выходного вектора на [cos (beta), sin (beta)]: v = v * Kn; return endfunction

Умножение матриц два на два может быть выполнено парой простых сдвигов и сложений.

x = v [0] - сигма * (v [1] * 2 ^ (- j)); y = сигма * (v [0] * 2 ^ (- j)) + v [1]; v = [x; y];

В Java класс Math имеет метод scalb (double x, int scale)для выполнения такого сдвига, C имеет функцию ldexp, а класс процессоров x86 имеет операция fscaleс плавающей запятой.

Пример оборудования

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

Связанные алгоритмы

CORDIC является частью класса алгоритмов «сдвиг-и-сложение», как являются логарифмическими и экспоненциальными алгоритмами, полученными из работы Генри Бриггса. Другой алгоритм сдвига и сложения, который может использоваться для вычисления многих элементарных функций, - это алгоритм BKM, который является обобщением логарифмических и экспоненциальных алгоритмов на комплексную плоскость. Например, BKM можно использовать для вычисления синуса и косинуса действительного угла x {\ displaystyle x}x (в радианах) путем вычисления экспоненты 0 + ix {\ displaystyle 0 + ix}{\ displaystyle 0 + ix} , что равно цис ⁡ (x) = соз ⁡ (x) + i sin ⁡ (x) {\ displaystyle \ operatorname {cis} (x) = \ соз (х) + я \ грех (х)}{\ displaystyle \ operatorname {cis} (х) = \ соз (х) + я \ грех (х)} . Алгоритм BKM немного сложнее, чем CORDIC, но имеет то преимущество, что ему не нужен коэффициент масштабирования (K).

См. Также
Ссылки
Дополнительная литература
Внешние ссылки
Последняя правка сделана 2021-05-13 11:38:58
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте