реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
prig
сообщение Aug 23 2013, 11:32
Сообщение #46


Знающий
****

Группа: Свой
Сообщений: 869
Регистрация: 30-01-08
Из: СПб
Пользователь №: 34 595



Цитата(MSP430F @ Aug 23 2013, 15:19) *
То есть для 16-разрядных данных в 4096 точках "фактическая" разрядность БПФ = 16 - 12 = 4. Так по Вашему ?


Не исходных данных.
Для 32-х разрядной арифметики с фикс. точкой (напоминаю про 32*32 и проч.) "фактическая" разрядность БПФ = 32 - 12 = 20.
Шум преобразования, приведённый ко входу, приблизительно 6*(20-2)+2дБ.

Сообщение отредактировал prig - Aug 23 2013, 11:35
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Aug 23 2013, 11:57
Сообщение #47


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



Цитата(prig @ Aug 23 2013, 15:32) *
Не исходных данных.
Для 32-х разрядной арифметики с фикс. точкой (напоминаю про 32*32 и проч.) "фактическая" разрядность БПФ = 32 - 12 = 20.
Шум преобразования, приведённый ко входу, приблизительно 6*(20-2)+2дБ.


Вкусно звучит! Может код приведете для примера такого чудо-алгоритма ? (Это без иронии).
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 23 2013, 12:16
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Наконец то понял что куда сдвигается...

то есть если у нас есть считалка 32 битная
и мы хотим сделать на ней 4К фурье, то нам надо в нее пихать числа не более 20 бит.
а для 64К - 16 бит.

Да я чет как-то тупанул...

Бабочка то никогда не даст больше чем в 2 раза от входа (я помню вы это говорили, но я думал с учетом вида сигнала), Y = X1 + X2 * w
w, X1 и X2 в пределах [-1 : 1], так что ответ 2 в худшем случае...

А весь путь что пройдет сигнал это как раза Log2(N) бабочей, так что больше чем 2^N запас не нужен...
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 23 2013, 12:47
Сообщение #49


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(MSP430F @ Aug 23 2013, 14:19) *
Так там на ASM, к тому же 32-бита не под Cortex M3, а только для ARM 9E. sad.gif

а это?
и это?

как я понимаю это должно отвечать Вашим требованиям
Цитата(MSP430F @ Aug 22 2013, 17:00) *
Я имею ввиду, что, если на входе даные с разрядностью 16 бит, то хотелось бы и на выходе иметь данные с той же и разрядностью и точностью.

Все что я смог найти, лишь на 1024 точки. Думаю, что все-таки сделать БПФ на 4096 точки с честными 16 разрядами на целочисленной 32-битной орифметике невозможно в принципе, потому и прошу, покажите мне такой код, а то больше смахивает на троллинг.

но я сильно не вникал в код...



--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Aug 23 2013, 13:22
Сообщение #50


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



Цитата(Maverick @ Aug 23 2013, 16:47) *
а это?
и это?

как я понимаю это должно отвечать Вашим требованиям

но я сильно не вникал в код...


К сожалению, в аннотации к эти кодам сказано
"16 bit FFT precision comparable with other fixed point implementation – precision determined by necessary scaling by 0.5 in every FFT stage",
то есть точность НИКАКАЯ ! А "32 bit FFT increases dynamic range by 90 dB , needs extra 20% to 50% cycles" - только на ARM 9E.
Да мне бы просто код на С без ассемблера...
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Aug 23 2013, 15:43
Сообщение #51


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



Цитата(prig @ Aug 23 2013, 15:32) *


Если поворочивающие коэффициенты 16-разрядные, то на каждом этапе БПФ идет накопление ошибки 1/32768 = 0,00003. За 12 этапов (для 4096 точек) получим уже 0,00037 (= 12 * 0,00003), что эквивалентно использованию 12-битного АЦП вместо 16-битного!
Чтобы обеспечить достойную точность, разрядность коэффициентов должна быть больше 16 разрядов. В этом случае результат умножения превысит 32 разряда, что я и пытаюсь доказать. Вот здесь, для примера, человек пишет "32 bit FFT increases dynamic range by 90 dB". Посмотрите код. Там используются 32-разрядные коэффициенты и специфическое умножение SMULL (Sign Long Multiply) с 64-разрядным результатом.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 23 2013, 17:45
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



это если вы 16 бит умножая на 16 бит, пытаетесь на 16 битах остаться.

имея умножитель 32 на 32 бита, вы можете за 1 такт считать в 32 битах, для 4К фурье можно считать в 32-12 = 20 битах величинах, и потеряв 4 бита, останетесь в своих 16 битах...

в 16 битах считать естественно смысла нет...



Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 23 2013, 18:11
Сообщение #53


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(MSP430F @ Aug 23 2013, 18:43) *

еще это посмотрите
и это
Мне кажется Вам нужно будет писать функции для работы с большими числами, иначе высокую точность не получите при использовании целочисленной арифметики (мое мнение)


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Aug 25 2013, 19:53
Сообщение #54


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



Цитата(Golikov A. @ Aug 23 2013, 21:45) *
это если вы 16 бит умножая на 16 бит, пытаетесь на 16 битах остаться.

имея умножитель 32 на 32 бита, вы можете за 1 такт считать в 32 битах, для 4К фурье можно считать в 32-12 = 20 битах величинах, и потеряв 4 бита, останетесь в своих 16 битах...

в 16 битах считать естественно смысла нет...


И я о том же. Однако, prig, как я понял, сватал мне именно 64-разрядную арифметику, называя ее почему-то 32-х разрядной. Я было даже повелся wink.gif , думая человек какую-то военную, не иначе, тайну знает. laugh.gif Да, я и говорю, совет экспертов тут, а не форум электронщиков. wink.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 26 2013, 04:46
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(MSP430F @ Aug 25 2013, 23:53) *
И я о том же. Однако, prig, как я понял, сватал мне именно 64-разрядную арифметику, называя ее почему-то 32-х разрядной. Я было даже повелся wink.gif , думая человек какую-то военную, не иначе, тайну знает. laugh.gif Да, я и говорю, совет экспертов тут, а не форум электронщиков. wink.gif


он просто очень плохо объясняет... он предлагал 16 битный вход, и 32 битная арифметика, и
коэффиценты считать в 20 битах для 4К фурье
Go to the top of the page
 
+Quote Post
prig
сообщение Aug 30 2013, 10:38
Сообщение #56


Знающий
****

Группа: Свой
Сообщений: 869
Регистрация: 30-01-08
Из: СПб
Пользователь №: 34 595



Ну что, все, кто "ниасилил" фикс. точку, пошли искать процессоры с плавающей?
Ну, а если желание разобраться ещё осталось, могу дать ещё пару подсказок.

- Умножение формата 1.31*1.31 в стандартном "С" реализуется только с использованием целочисленного умножения формата 64*64. Большого смысла в такой реализации нет по причине низкой эффективности. Лучше поискать поддержку фикс. точки (для сигнальников - без проблем) или "прикрутить" её самому.
- Если компилятор "не понимает" формат и "не умеет" выполнять операции с фикс. точкой, простейший и наиболее эффективный путь реализации умножения - ассемблерный код.
Для умножения формата 1.31*1.31 с результатом в формате 1.31 используется целочисленное умножение в формате 32*32 с результатом в формате 64 (на ассемблере - без проблем). Промежуточный 64-битный целочисленный результат нормализуется (сдвиг точки и округление) в 32-битный результат с фикс. точкой.
- Даже если компилятор поддерживает типы с фикс. точкой, рекомендуется реализовать на ассемблере, с использованием промежуточных 64-бит, хотя бы "бабочку" БПФ.

П.С.
Способ реализации умножения 1.31*1.31 с результатом в формате 1.31 не отменяет того, что это 32-битная арифметика.
То же самое касается 32-битного формата с плавающей точкой.


Цитата(Golikov A. @ Aug 26 2013, 08:46) *
он просто очень плохо объясняет... он предлагал 16 битный вход, и 32 битная арифметика, и
коэффиценты считать в 20 битах для 4К фурье

М.б., плохо объясняю. М.б., кое-кто невнимательно читает или не слишком точен в том, что пишет. Предлагал я несколько иное.

Сообщение отредактировал prig - Aug 30 2013, 11:38
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 30 2013, 10:48
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Ну или опять кто-то не понятно объяснилsm.gif
Я имел в виду фикс точка нормированная в 20 бит, промежуточные операции 32 битные...
Go to the top of the page
 
+Quote Post
prig
сообщение Aug 30 2013, 11:34
Сообщение #58


Знающий
****

Группа: Свой
Сообщений: 869
Регистрация: 30-01-08
Из: СПб
Пользователь №: 34 595



Цитата(Golikov A. @ Aug 30 2013, 14:48) *
Ну или опять кто-то не понятно объяснилsm.gif
Я имел в виду фикс точка нормированная в 20 бит, промежуточные операции 32 битные...

Ну да, исходные данные, нормированные в 20 бит формата с фикс. точкой. Скажем так. Для 4К, естественно.

Сообщение отредактировал prig - Aug 30 2013, 11:36
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 18:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016