QUOTE (JohnKorsh @ Mar 11 2012, 11:30)

Добрый день!
Ещё вопрос. Как я говорил - при попытке выполнить преобразование Фурье на микроконтроллере с фиксированной точкой я закладывал поворачивающие множители в виде:
W_re (k,N) = 32768 * cos (- 2 * Pi * k/N)
W_im (k,N) = 32768 * sin (- 2 * Pi * k/N)
Множитель 32768 – для того, чтобы sin и cos представить в виде, большем 1.
При таком подходе приходится делить (ну, понятно, просто сдвигать) часть результата в “бабочке” на 32768 (15 разрядов “вправо”), иначе FFT “разваливается” (простое преобразование Фурье не чувствительно к умножению = там просто общий результат возрастает в 32768 раз):
A_re = A_re + (W_re * B_re – W_im * B_im)/32768
A_im = A_im + (W_re * B_im + W_im * B_re)/32768
B_re = A_re - (W_re * B_re – W_im * B_im)/32768
B_im = A_im - (W_re * B_im + W_im * B_re)/32768
(Потом, понятно, идёт масштабирование результата, чтобы не было переполнения по алгоритму “блочной плавающей точки”.)
Наверное, есть какое-то общеизвестное более изящное решение. В Интернете пока не нашёл, может кто посоветует статью или исходник?
А это ничего что
32768 * sin (- 2 * Pi * (N/4)/N) = 32768 * cos (- 2 * Pi * 0/N) = -1.0 вместо 1.0?
Попробуйте что нибудь типа
W_re (k,N) = floor(32767 * cos (- 2 * Pi * k/N) + 0.5)
W_im (k,N) = floor(32767 * sin (- 2 * Pi * k/N) + 0.5)
floor() это стандартная функция отсечения влево, соответственно floor(*+0/5) - округление
Блочная экспонента - это как раз самое изящное решение для вычислений с фиксированой точкой, не заморачивайтесь