Перейти к содержанию
    

Целочисленные алгоритмы ЦОС

Только умножение 32*32=32 - MULS
Для пробразования размером 4К Х 16 этого хватит с избытком. N = 212 даёт рост 12 бит максимум.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для пробразования размером 4К Х 16 этого хватит с избытком. N = 212 даёт рост 12 бит максимум.

 

16+16+12=44, как тут в 32 укладываться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16+16+12=44, как тут в 32 укладываться?
А так и не делается, даже в флоатинг пойнт (24 Х 24 -> 48 но младшие биты округляются до 24. Даже Пентиум - и тот ошибается, потому что внутренне он свои 64 Х 64 -> 128, но потом таки округляет обратно до 64).

 

Так и тут, 16 Х 16 -> 32, и округляются до 16. Умножения роста не дают, сложение может дать рост в 1 бит на одну фазу БПФ. В итоге 16 + 12 -> 28, укладывается в 32.

 

Но на самом деле и так поступают довольно редко. Обычно фаза БПФ завершается сдвигом вправо на 1, т.е. масштабированием - с округлением, конечно. Соответственно, результат остаётся тем же Q16.15 что и исходные данные.

 

Наихудший (в смысле потери точности) метод, это когда вместо масштабирования после бабочек, исходные данные "т..о" сдвигают вправо на число фаз БПФ перед преобразованием (N=256 - на 8, 4096 - на 12...), зато скорость вычислений существенно растёт, так что и так делают.

 

Конечно, любое умножение делается с округлением, и сложение, если результат масштабируется, тоже. Жизнь несовершенна, но если знать в чём, то жить можно :)

 

Если есть много времени, то можно данные обрабатывать, например, как Q64.32 =~ плавать в "безошибочном" уютном озере :)

Изменено пользователем AndrewN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А так и не делается, даже в флоатинг пойнт (24 Х 24 -> 48 но младшие биты округляются до 24. Даже Пентиум - и тот ошибается, потому что внутренне он свои 64 Х 64 -> 128, но потом таки округляет обратно до 64).

 

Так и тут, 16 Х 16 -> 32, и округляются до 16. Умножения роста не дают, сложение может дать рост в 1 бит на одну фазу БПФ. В итоге 16 + 12 -> 28, укладывается в 32.

 

Но на самом деле и так поступают довольно редко. Обычно фаза БПФ завершается сдвигом вправо на 1, т.е. масштабированием - с округлением, конечно. Соответственно, результат остаётся тем же Q16.15 что и исходные данные.

 

Наихудший (в смысле потери точности) метод, это когда вместо масштабирования после бабочек, исходные данные "т..о" сдвигают вправо на число фаз БПФ перед преобразованием (N=256 - на 8, 4096 - на 12...), зато скорость вычислений существенно растёт, так что и так делают.

 

Конечно, любое умножение делается с округлением, и сложение, если результат масштабируется, тоже. Жизнь несовершенна, но если знать в чём, то жить можно :)

 

Если есть много времени, то можно данные обрабатывать, например, как Q64.32 =~ плавать в "безошибочном" уютном озере :)

 

Забавно, но я округляю только после того как вырезал нужную полосу. Все биты сохраняю. Только целочисленная математика.

Округление это нелинейная обработка сигнала.

Изменено пользователем Corner

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...