|
|
  |
ДПФ/БПФ/ДКП на Cortex-M3 (1986ВЕ94Т), Вычисление БПФ на ARM |
|
|
|
Aug 23 2013, 11:32
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 23 2013, 11:57
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911

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

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

|
Цитата(MSP430F @ Aug 23 2013, 14:19)  Так там на ASM, к тому же 32-бита не под Cortex M3, а только для ARM 9E.  а это?и это?как я понимаю это должно отвечать Вашим требованиям Цитата(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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 23 2013, 13:22
|
Частый гость
 
Группа: Участник
Сообщений: 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. Да мне бы просто код на С без ассемблера...
|
|
|
|
|
Aug 23 2013, 15:43
|
Частый гость
 
Группа: Участник
Сообщений: 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-разрядным результатом.
|
|
|
|
|
Aug 25 2013, 19:53
|
Частый гость
 
Группа: Участник
Сообщений: 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-х разрядной. Я было даже повелся  , думая человек какую-то военную, не иначе, тайну знает.  Да, я и говорю, совет экспертов тут, а не форум электронщиков.
|
|
|
|
|
Aug 26 2013, 04:46
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(MSP430F @ Aug 25 2013, 23:53)  И я о том же. Однако, prig, как я понял, сватал мне именно 64-разрядную арифметику, называя ее почему-то 32-х разрядной. Я было даже повелся  , думая человек какую-то военную, не иначе, тайну знает.  Да, я и говорю, совет экспертов тут, а не форум электронщиков.  он просто очень плохо объясняет... он предлагал 16 битный вход, и 32 битная арифметика, и коэффиценты считать в 20 битах для 4К фурье
|
|
|
|
|
Aug 30 2013, 10:38
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|