Я ищу быстрый способ превратить массив комплексных чисел в полярное представление.
Например, учитывая комплексное число 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 можно использовать совместно? Или есть итеративный способ получить мои результаты?