Комплексные числа: быстрое декартово преобразование в полярное

Я ищу быстрый способ превратить массив комплексных чисел в полярное представление.

Например, учитывая комплексное число X, я хочу превратить его в полярное представление следующим образом:

  Q.phase    = atan2 (X.imag / X.real);
  Q.magniude = sqrt  (X.imag * X.imag + X.real * X.real);

Мне нужно сделать это преобразование около 400 тысяч раз в секунду на DSP с фиксированной точкой. Мои числа в формате с фиксированной точкой 1.15.16, и я хотел бы сохранить его таким.

DSP работает очень быстро, когда я выполняю действия в безусловных циклах, например. когда количество циклов известно заранее. Он ползает, когда ему приходится выполнять вызовы подпрограмм и деления. Кэш-промахи также очень медленные, поэтому я бы не хотел использовать большие справочные таблицы, если это возможно (4 КБ было бы хорошо. Я могу выделить немного встроенной памяти для этой задачи).

В настоящее время я обрабатываю atan2 как полиномиальную аппроксимацию и использую хорошо известный побитовый алгоритм для целочисленного квадратного корня. Это недостаточно быстро.

У меня такое чувство, что должен быть более эффективный способ получить результат. Может быть, некоторые вычисления из sqrt и atan можно использовать совместно? Или есть итеративный способ получить мои результаты?


person Nils Pipenbrinck    schedule 22.11.2009    source источник


Ответы (1)


Ознакомьтесь с этой оптимизацией CORDIC DSP. Трудно сказать, поможет ли она в вашем случай однако.

person MaR    schedule 22.11.2009
comment
Хорошая статья! Мне нравится идея использовать множители для ускорения вычислений и удаления ветвей. Я попробую. - person Nils Pipenbrinck; 22.11.2009
comment
Это то, что я искал .. Большое спасибо. - person Nils Pipenbrinck; 23.11.2009