|
ДПФ/БПФ/ДКП на Cortex-M3 (1986ВЕ94Т), Вычисление БПФ на ARM |
|
|
|
Aug 19 2013, 10:39
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 19-08-13
Пользователь №: 77 977

|
Господа! Есть необходимость решить задачу спектрального анализа квазипериодического сигнала. Частота дискретизации не менее 80 кГц (изначально 100 кГц, но возможно выбрать исходя из удобного числа отсчётов). Поступает сигнал непрерывно. Спектральный анализ проводится сначала приблизительный — на первой четверти выборки; затем точный — на всей выборке. Длина полной выборки 1 секунда. Для спектрального анализа следует выполнить одно из дискретных преобразований Фурье (как несведущий затрудняюсь определить). Для ЦОС собираюсь использовать микросхему (1986ВЕ94Т, 1986ВЕ93Т или 1986ВЕ92Т). Предварительно планирую систему следующим образом. Буфер для исходных отсчётов собираюсь организовать на отдельных двух микросхемах (1645РУ4АУ): первая хранит первую четверть выборки и результаты ДПФ, вторая — остаток выборки. Перенаправлять вывод с внешнего АЦП собираюсь внешней же логикой. Сразу после захвата первой четверти отсчётов МК следует начать ДПФ на первой четверти выборки. Закончить следует быстрее, чем 250 мс (соответствует времени захвата четверти выборки), при этом должно остаться немного времени на анализ спектра (поиск пиков). По завершении захвата остатка выборки, МК выполняет ДПФ на первой четверти и остатке менее, чем за секунду. Вопросы такие: - Успеет МК выполнить ДПФ?
- Какой случай ДПФ более предпочтителен (вход — действительные целые, выход — амплитуды целые/дробные)?
- Значительно ли повысит быстродействие количество отсчётов являющееся степенью числа 2?
- Возможно ли использовать внутренний АЦП микросхемы 1986ВЕ94Т и единственную микросхему СОЗУ и копировать из внутреннего АЦП во внешнее СОЗУ отсчёты по прерываниям АЦП во время вычисления ДПФ? Не сильно ли это притормозит основную программу (ДПФ)?
- Значительно ли вырастет производительность ДПФ при использовании внутренней СОЗУ микросхемы 1986ВЕ94Т для части операций?
Поправьте, если я неправильно задаю вопрос или не в тот раздел обращаюсь. Поиск использовал, но просветления не достиг. Заранее спасибо, джентльмены!
|
|
|
|
|
 |
Ответов
|
Aug 21 2013, 08:14
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911

|
Цитата(Golikov A. @ Aug 21 2013, 11:23)  как мне тут указали несколькими постами выше, что и 32 бит с фиксированной точкой должно хватить, и умножение у вас будет делаться за 1 такт, может попробовать так? Я не понимаю, как можно реализовать целочисленное БПФ с 32 разрядными числами и получить хоть какую-нить приемлемую точность?
|
|
|
|
|
Aug 21 2013, 17:22
|
Знающий
   
Группа: Свой
Сообщений: 869
Регистрация: 30-01-08
Из: СПб
Пользователь №: 34 595

|
Цитата(MSP430F @ Aug 21 2013, 12:14)  Я не понимаю, как можно реализовать целочисленное БПФ с 32 разрядными числами и получить хоть какую-нить приемлемую точность? Вообще-то, 32 разряда дают динамический диапазон, который в реальной практике не встречается. Ну, потеряются при БПФ несколько битов от 32-х, как это скажется на результате? Да никак. С 16-ю битами тоже не всё плохо. В своё время приходилось делать оценку 16-бит версий БПФ с групповой плавающей точкой для 8К. Потеря точности (оценка по шуму) - примерно 1...2 бита. При нормировании данных к 15-ти битам, шум от 8К 16-бит радикс-2 БПФ сопоставим с шумом 14-бит оцифровки. Т.е. SNR преобразования что-то около 86дБ для шумоподобного сигнала. А вот 4-й радикс шумней на 6дБ из-за дополнительной потери 1-го бита при постадийном нормировании. В том, что касается сабжа, на перемножителе 32*32 можно сделать вполне приемлимый вариант улучшенного 16-битного(16 данные+16 защита) БПФ на 64К с фикс. точкой. Лучше 90 дБ по шуму вполне достижимо. Потерь точности из-за нормирования данных ни на 2-м ни на 4-м радиксе не будет. А вот со временем выполнения всё несколько сложнее. Эффективность кода по сравнению с сигнальниками будет существенно ниже. 8К 16-бит радикс-2 БПФ с групповой плавающей точкой на 533МГц блэкфине, со всем что можно в L1-памяти, выполняется за 1мс. Грубая прикидка для 64К на 80МГц М3 даёт что-то около 350мс (1*10*7*5, где 5 - опять же, грубая оценка эффективности к блэкфину). Так что, выбор 1986ВЕ94Е для данной задачи ТС несколько сомнителен. Но что бы сказать наверняка, можно попробовать найти готовый радикс-4 и проверить на реальной железке или симуляторе. Если искать что-нибудь другое, следует учитывать большой объём данных. Если не размещать данные и коэффициенты в памяти/кэше первого уровня, производительность может очень сильно упасть. На том же 533МГц блэкфине для 64к будет использоваться внешняя SDRAM. Результат будет на уровне 100мс вместо ожидаемых 10мс. Цитата(MSP430F @ Aug 21 2013, 11:22)  ...Надо посчитать БПФ для 4096 точек за 1 секунду. Чувствую, что МК справится. Хочу считать на float (32 бита), double не нужен, АЦП у меня 16 бит. В этой работе www.rf.unn.ru/NATO/1ws/SfP_Perov.pdf люди посчитали, что для АЦП с разрядность от 11 до 23 float достаточно. Фикс точка на 32 бита (20 данные + 12 защита) Вам более чем хватит. 1986ВЕ94Е сгодится. float (32 бита) - 24 значащих бита и экспонента. Это явно избыточно и слишком затратно. Проще разобраться с фикс. точкой.
Сообщение отредактировал prig - Aug 21 2013, 17:23
|
|
|
|
|
Aug 21 2013, 17:45
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911

|
Цитата(prig @ Aug 21 2013, 21:22)  Вообще-то, 32 разряда дают динамический диапазон, который в реальной практике не встречается. Ну, потеряются при БПФ несколько битов от 32-х, как это скажется на результате? Да никак. С 16-ю битами тоже не всё плохо.
Фикс точка на 32 бита (20 данные + 12 защита) Вам более чем хватит. 1986ВЕ94Е сгодится. float (32 бита) - 24 значащих бита и экспонента. Это явно избыточно и слишком затратно. Проще разобраться с фикс. точкой. Вот здесь человек пишет буквально следующее " Перед автором стояла задача написать преобразование Фурье на 2048 точек при разрядности исходных данных 16 бит. Из-за отсутствия арифметического сопроцессора пришлось делать целочисленное преобразование, что создало некоторые трудности. При разрядности исходных данных 16 бит разрядность коэффициентов должна быть не менее 16, чтобы не происходило потери точности. Их произведение содержит 32 разряда. 2048 точек дают еще 11 дополнительных разрядов, а это значит, что в 32-разрядное процессорное слово промежуточные данные не помещаются. Вычисление каждой “бабочки” ведется с точностью 64 разряда, а результат округляется до 32 разрядов. " Как Вы тогда можете это прокомментировать ?
|
|
|
|
|
Aug 22 2013, 07:01
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911

|
Цитата(_pv @ Aug 21 2013, 22:21)  были данные 16 разрядов сделали преобразование Фурье, стало вдруг 32 разряда, если теперь обратное сделать чтобы исходные данные получить для результата уже 64 бита понадобится? кто мешал по ходу округлять чтобы из 32 бит не вылезать. Я не понял, здесь люди что-нибудь в теме понимают, или, как часто на форумах бывает, дилетанты от нечего делать язык чешут.  Чуток хоть надо в топике понимать. Итак, имеем БПФ на 4096 точек. Используем целочисленную арифметику. Это 12 этапов (log 2 4096) умножений в общем случае комплексных (это сейчас не принципиально) чисел. Если АЦП на 16 разрядов, то, чтобы не потерять точность при умножениях, коэффициенты должны быть не хуже по разрядности, пусть тоже будет 16 бит. Первый этап. Умножаем два таких числа. В худшем случае получается 32 битное число. А впереди еще 11 этапов. Чтобы не потерять точность при округлениях, результат надо разделить на 2 в 15, и мы получили промежуточный результат уже 17-ти разрядный. Умножаем его на коэффициент, который опять-таки 16-разрядный и получаем 33-разярядное число. К концу этапов, коих 12, имеем 44 разряда. Если округлять на каждом этапе до 32 бит, это будет эквивалентно в итоге использованию 4-разрядных коэффициентов ! Круто, да ? И кому будет нужна такая точность ?
|
|
|
|
|
Aug 22 2013, 10:17
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(MSP430F @ Aug 22 2013, 11:01)  Я не понял, здесь люди что-нибудь в теме понимают, или, как часто на форумах бывает, дилетанты от нечего делать язык чешут.  Чуток хоть надо в топике понимать. Итак, имеем БПФ на 4096 точек. Используем целочисленную арифметику. Это 12 этапов (log 2 4096) умножений в общем случае комплексных (это сейчас не принципиально) чисел. Если АЦП на 16 разрядов, то, чтобы не потерять точность при умножениях, коэффициенты должны быть не хуже по разрядности, пусть тоже будет 16 бит. Первый этап. Умножаем два таких числа. В худшем случае получается 32 битное число. А впереди еще 11 этапов. Чтобы не потерять точность при округлениях, результат надо разделить на 2 в 15, и мы получили промежуточный результат уже 17-ти разрядный. Умножаем его на коэффициент, который опять-таки 16-разрядный и получаем 33-разярядное число. К концу этапов, коих 12, имеем 44 разряда. Если округлять на каждом этапе до 32 бит, это будет эквивалентно в итоге использованию 4-разрядных коэффициентов ! Круто, да ? И кому будет нужна такая точность ? да это верно, и не верно одновременно... 4 разрядные коэффициенты это 0 1 2 3 хотим посчитать 1/2 + 1/2 + 1/2 + 1/2 = 0.5 + 0.5 + 0.5 + 0.5= 2; в этих терминах 4 разрядных чисел 0.5 == 1 1/2 + 1/2 + 1/2 + 1/2 = 0.5 + 0.5 +0.5 + 0.5 = 1 + 1 + 1 + 1 = 4== 0; если мы возьмем 3 разрядный 0 1 2 3 4 5 6 7 и будем считать что у нас младший разряд после точки, то получим 0 0.5 1 1.5 2 2.5 3 3.5 берем наш пример 1/2 + 1/2 + 1/2 + 1/2 переводим его в 3 разрядные числа 1/2 + 1/2 + 1/2 + 1/2 = 0.5 + 0.5 +0.5 + 0.5 = 1 + 1 + 1 + 1 = 4 переводим результат обратно в 2 разрядные 4 == 2 . посчитано точно, причем в начале и конце 2 разрядные числа в середине 3 разрядные. так что считать в 32 битных числах 16 битные значения, а потом нормировать обратно в 16 бит, это не тоже самое что сразу отрезать начало. Хотя я думаю вы тоже это знаете, это я так на всякий случай... Теперь что происходит с флоат. если вы возьмете 2 здоровенных флотовских числа и перемножите, получите ооочень большое число, и добавление к нему чего угодно маленького из того же флота, просто будет игнорироваться, порядок первого столь большой, что мелкие на его фоне не видно... Так что флоат тоже не спасет если части суммы будут очень сильно отличаться от друг друга по порядкам, а вот если порядок будет примерно один, то на него можно будет разделить все числа, сложить их, а потом обратно вернуть порядок. то есть это как 2 + 4 + 8 + 4 == 2*(1+2+4+2) именно этим и пользуются при счете в целых, как я понимаю....
|
|
|
|
|
Aug 22 2013, 14:00
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911

|
Цитата(prig @ Aug 22 2013, 17:18)  Вообще без потери точности? Такого не найдёте, т.к. с точки зрения реальных задач это полный абсурд. Я имею ввиду, что, если на входе даные с разрядностью 16 бит, то хотелось бы и на выходе иметь данные с той же и разрядностью и точностью. Все что я смог найти, лишь на 1024 точки. Думаю, что все-таки сделать БПФ на 4096 точки с честными 16 разрядами на целочисленной 32-битной орифметике невозможно в принципе, потому и прошу, покажите мне такой код, а то больше смахивает на троллинг.
Сообщение отредактировал MSP430F - Aug 22 2013, 14:01
|
|
|
|
|
Aug 22 2013, 16:20
|
Знающий
   
Группа: Свой
Сообщений: 869
Регистрация: 30-01-08
Из: СПб
Пользователь №: 34 595

|
Цитата(MSP430F @ Aug 22 2013, 18:00)  Я имею ввиду, что, если на входе даные с разрядностью 16 бит, то хотелось бы и на выходе иметь данные с той же и разрядностью и точностью.
Все что я смог найти, лишь на 1024 точки. Думаю, что все-таки сделать БПФ на 4096 точки с честными 16 разрядами на целочисленной 32-битной орифметике невозможно в принципе, потому и прошу, покажите мне такой код, а то больше смахивает на троллинг. Любой код с фикс. точкой 1.31 (нотация по ADI; с форматом и тем, как с ним работать, предлагаю разобраться самому). Размещаете данные в младших 19-ти битах и знаковом разряде (не забыв правильно заполнить биты, куда не попали исходные данные). Коэффициенты 32 бита. После преобразования данные нормализуются в нужный формат. 20 бит - это 122дБ. ДД преобразования будет примерно на уровне 110дБ. Это эквиваленто снижению SNR исходного идеального 16-бит сигнала(98дБ) на величину менее 1 дБ. Для сигнала на уровне 90дБ о привнесённом шуме можно будет вообще забыть. Вы собираетесь работать со значениями SNR 98дБ? Сильно сомневаюсь. Это моё понимание вопроса. Могу несколько ошибаться в значениях (таки, лучше промоделировать для конкретной системы). Опустил некоторые детали. Подход достаточно стандартный. Работает на 100%. Проверено на реальном железе. А вот что Вы понимаете под "той же точностью" и чего хотите добиться, вопрос тёмный. ПС Естественно, для 64К надо будет использовать 16 бит из 32 или прикручивать дополнительную нормализацию между стадиями, что и есть групповая плавающая точка.
Сообщение отредактировал prig - Aug 22 2013, 16:47
|
|
|
|
Сообщений в этой теме
uwboy ДПФ/БПФ/ДКП на Cortex-M3 (1986ВЕ94Т) Aug 19 2013, 10:39 Golikov A. А вы с преобразование Фурье хорошо знакомы?
там ... Aug 19 2013, 11:01 uwboy Цитата(Golikov A. @ Aug 19 2013, 15:01) А... Aug 19 2013, 12:42  Aleksandr Baranov Цитата(uwboy @ Aug 19 2013, 08:42) Резуль... Aug 19 2013, 20:38 DASM Цитата(Golikov A. @ Aug 19 2013, 15:01) А... Aug 20 2013, 04:01 prig Цитата(Golikov A. @ Aug 19 2013, 15:01) А... Aug 20 2013, 08:35  Golikov A. Цитата(prig @ Aug 20 2013, 12:35) А Вы са... Aug 20 2013, 11:53   DASM Цитата(Golikov A. @ Aug 20 2013, 15:53) Я... Aug 20 2013, 19:14    Golikov A. Цитата(DASM @ Aug 20 2013, 23:14) Вы цену... Aug 21 2013, 03:46  MSP430F Всем доброго времени суток!
Не балует гугл отв... Aug 21 2013, 07:22   Ruslan1 Цитата(MSP430F @ Aug 21 2013, 10:22) У ме... Aug 22 2013, 11:06    uwboy Цитата(Ruslan1 @ Aug 22 2013, 15:06) сишн... Aug 22 2013, 11:54     Ruslan1 Цитата(uwboy @ Aug 22 2013, 14:54) Прямо ... Aug 22 2013, 14:46 Aleksandr Baranov Цитата(uwboy @ Aug 19 2013, 06:39) Господ... Aug 19 2013, 12:21 Golikov A. скажу что нужен сопроцессор, ПЛИС какую нибудь, и ... Aug 19 2013, 13:27 Lmx2315 QUOTE (uwboy @ Aug 19 2013, 14:39) Законч... Aug 19 2013, 15:08 uwboy Цитата(Lmx2315 @ Aug 19 2013, 19:08) ..ес... Aug 20 2013, 07:16 Alex11 Про степень 2, что тут говорили - это относится не... Aug 19 2013, 21:31 Golikov A. я не говорил только, но исходил из того что дабл н... Aug 20 2013, 04:55 uwboy Спасибо, господа, за ваши советы.
Уже прочёл про п... Aug 20 2013, 12:02 _pv http://www.embeddedsignals.com/ARM.htm
там бенчмар... Aug 20 2013, 20:03   _pv Цитата(prig @ Aug 22 2013, 00:22) А вот с... Aug 21 2013, 17:41      prig Цитата(MSP430F @ Aug 22 2013, 11:01) Я не... Aug 22 2013, 08:52        Aleksandr Baranov Цитата(MSP430F @ Aug 22 2013, 07:11) Кто-... Aug 22 2013, 13:09           Golikov A. Цитата(prig @ Aug 22 2013, 20:20) Любой к... Aug 23 2013, 05:32            prig Цитата(Golikov A. @ Aug 23 2013, 09:32) .... Aug 23 2013, 09:46             Golikov A. Цитата(prig @ Aug 23 2013, 13:25) Знаете,... Aug 23 2013, 09:53           MSP430F Цитата(prig @ Aug 22 2013, 20:20) Любой к... Aug 23 2013, 08:24        Maverick Цитата(MSP430F @ Aug 22 2013, 14:11) Кто-... Aug 23 2013, 10:55         MSP430F Цитата(Maverick @ Aug 23 2013, 14:55) пос... Aug 23 2013, 11:19          prig Цитата(MSP430F @ Aug 23 2013, 15:19) То е... Aug 23 2013, 11:32           MSP430F Цитата(prig @ Aug 23 2013, 15:32) Не исхо... Aug 23 2013, 11:57           MSP430F Цитата(prig @ Aug 23 2013, 15:32)
Если ... Aug 23 2013, 15:43            Maverick Цитата(MSP430F @ Aug 23 2013, 18:43)
еще... Aug 23 2013, 18:11          Maverick Цитата(MSP430F @ Aug 23 2013, 14:19) Так ... Aug 23 2013, 12:47           MSP430F Цитата(Maverick @ Aug 23 2013, 16:47) а э... Aug 23 2013, 13:22    Golikov A. Цитата(MSP430F @ Aug 21 2013, 21:45) Вот ... Aug 22 2013, 05:52 Golikov A. 32 инт это
от +- 2 147 483 648
соответственно можн... Aug 21 2013, 10:46 Alex11 По поводу дополнительной обработки спектра после Ф... Aug 22 2013, 22:20 prig -Обращаться к программным кодам ADI не обязательно... Aug 23 2013, 11:09 Golikov A. Наконец то понял что куда сдвигается...
то есть е... Aug 23 2013, 12:16 Golikov A. это если вы 16 бит умножая на 16 бит, пытаетесь н... Aug 23 2013, 17:45 MSP430F Цитата(Golikov A. @ Aug 23 2013, 21:45) э... Aug 25 2013, 19:53  Golikov A. Цитата(MSP430F @ Aug 25 2013, 23:53) И я ... Aug 26 2013, 04:46 prig Ну что, все, кто "ниасилил" фикс. точку,... Aug 30 2013, 10:38 Golikov A. Ну или опять кто-то не понятно объяснил
Я имел в ... Aug 30 2013, 10:48 prig Цитата(Golikov A. @ Aug 30 2013, 14:48) Н... Aug 30 2013, 11:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|