andrewn 0 19 сентября, 2013 Опубликовано 19 сентября, 2013 · Жалоба Только умножение 32*32=32 - MULSДля пробразования размером 4К Х 16 этого хватит с избытком. N = 212 даёт рост 12 бит максимум. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Corner 0 24 сентября, 2013 Опубликовано 24 сентября, 2013 · Жалоба Для пробразования размером 4К Х 16 этого хватит с избытком. N = 212 даёт рост 12 бит максимум. 16+16+12=44, как тут в 32 укладываться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 24 сентября, 2013 Опубликовано 24 сентября, 2013 (изменено) · Жалоба 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 =~ плавать в "безошибочном" уютном озере :) Изменено 24 сентября, 2013 пользователем AndrewN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Corner 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 (изменено) · Жалоба А так и не делается, даже в флоатинг пойнт (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 =~ плавать в "безошибочном" уютном озере :) Забавно, но я округляю только после того как вырезал нужную полосу. Все биты сохраняю. Только целочисленная математика. Округление это нелинейная обработка сигнала. Изменено 29 сентября, 2013 пользователем Corner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться