|
DSP на STM32F4 |
|
|
|
Aug 25 2016, 07:59
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Здравствуйте! Помогите разобраться с DSP на STM32F429. Никогда раньше этой темой не занимался, не понимаю в какую сторону начинать копать. Задача такая: мне нужно генерировать белый шум, фильтровать его разными фильтрами и выдавать на аудио ЦАП (48 кГц). Фильтры нужны режекторный второго порядка и полосовой, четвертого порядка, с БИХ. Фильтры я посчитал в матлабе, приготовился уже реализовывать в целочисленной арифметике. Но в этом процессоре есть блок вычислений с плавающей точкой. Я с этим никогда дела не имел. В референс мануале описание этого блока не нашел. Есть некая библиотека CMSIS DSP, в которой реализованы фильтры, но я так понял она мне не подойдет, поскольку там какая то странная структура реализованного IIR фильтра и работает он с какими то блоками данных. А мне надо просто сгенерировать Х, посчитать Y, запомнить Х-1 и Y-1 для следующего отчета. Скажите, какое преимущество мне даст работа с float и вообще, могу ли я так просто, без всяких библиотек взять и расписать свои фильтры во float?
|
|
|
|
|
 |
Ответов
|
Aug 25 2016, 08:24
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Atlantis- @ Aug 25 2016, 10:59)  Скажите, какое преимущество мне даст работа с float и вообще, Сам Матлаб может дать вам характеристики фильтра с учетом квантования. Целочисленная порой сильно уступает ПТ даже одинарной точности. Цитата(Atlantis- @ Aug 25 2016, 10:59)  могу ли я так просто, без всяких библиотек взять и расписать свои фильтры во float? Я вообще написал фильтр на asm CODE //--------------------------------------------- // fpu_iir //--------------------------------------------- .thumb .thumb_func .global fpu_iir .type fpu_iir, %function fpu_iir: .cfi_startproc cbnz r1, fpu_iir_load bx lr fpu_iir_load: push {r0-r4, lr} VPUSH {s0-s7} // load f VLDR.F32 s1, [r3, #0] // G VLDR.F32 s2, [r3, #4] // a1 VLDR.F32 s3, [r3, #8] // a2 VLDR.F32 s4, [r3, #12] // b VLDR.F32 s5, [r3, #16] // tn-1 VLDR.F32 s6, [r3, #20] // tn-2 fpu_iir_loop: // load ldr r4, [r0], #4 // s0 <- x VMOV.F32 s0, r4 // calc tn VMUL.F32 s7, s1, s0 // G * x VFMS.F32 s7, s2, s5 // -a1 * tn-1 VFMS.F32 s7, s3, s6 // -a2 * tn-2 // calc y VADD.F32 s0, s7, s6 // tn-2 VFMA.F32 s0, s4, s5 // b * tn-1 // save t VMOV.F32 s6, s5 // tn-2 VMOV.F32 s5, s7 // tn-1 // y -> r0 VMOV.F32 r4, s0 // store str r4, [r2], #4 subs r1, #1 bne fpu_iir_loop VSTR.F32 s5, [r3, #16] // tn-1 VSTR.F32 s6, [r3, #20] // tn-2 VPOP {s0-s7} pop {r0-r4, pc} .size fpu_iir, .-fpu_iir .cfi_endproc
|
|
|
|
|
Aug 25 2016, 08:45
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(adnega @ Aug 25 2016, 11:24)  Я вообще написал фильтр на asm На asm то понятно, компилятор никуда не денется. А на Си если писать, для операций с float надо что-то настраивать, подключать? Или просто задать коэффициенты float a,b; float x,y; и пошел их перемножать, складывать, вычитать, а компилятор сам подставит нужные команды, для работы с плавающей точкой? Под компилятором я подразумеваю Keil.
|
|
|
|
|
Aug 25 2016, 09:30
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(aaarrr @ Aug 25 2016, 11:50)  Ничего не надо настраивать, только ядро правильное указать. Да, я попробовал перемножить два int-a и два float-a, посмотрел дизассемблер, там отличие только в том, что в первом случае команда MULS, а во втором VMUL.F32 Судя из статьи, VMUL.F32 выполняется за 1 такт, как и обычное умножение. Круто! Тогда у меня еще один вопрос, на входе у меня генератор белого шума, который выдает int, а на выходе, для ЦАП мне надо 24-битное число. Как в первом случае быстро преобразовать int (сдвинутый на 6 разрядов, чтобы на входе тоже было 24 бита) во float, а во втором случае float в int? И я правильно понимаю, что используя float вместо int я нисколько не потеряю в скорости выполнения программы? Даже выиграю, с учетом того, что не надо будет масштабировать результат?
|
|
|
|
Сообщений в этой теме
Atlantis- DSP на STM32F4 Aug 25 2016, 07:59    adnega Цитата(Atlantis- @ Aug 25 2016, 12:3... Aug 25 2016, 10:40     Atlantis- Цитата(adnega @ Aug 25 2016, 13:40) Есть ... Aug 25 2016, 11:46      DASM Цитата(Atlantis- @ Aug 25 2016, 14:4... Aug 25 2016, 11:53       Atlantis- Цитата(DASM @ Aug 25 2016, 14:53) Насколь... Aug 25 2016, 12:04      adnega Цитата(Atlantis- @ Aug 25 2016, 14:4... Aug 25 2016, 15:32 DASM Так у флоат 23 бита мантиссы, как оно может быть м... Aug 25 2016, 12:31 Atlantis- Цитата(DASM @ Aug 25 2016, 15:31) Так у ф... Aug 25 2016, 12:36 DASM Понятно. Математик из меня никакой, может просто п... Aug 25 2016, 12:40 Atlantis- Цитата(DASM @ Aug 25 2016, 15:40) Понятно... Aug 25 2016, 13:09 DASM Не знаю что и сказать, SystemVue позволяет считать... Aug 25 2016, 13:35 Atlantis- Цитата(DASM @ Aug 25 2016, 16:35) Не знаю... Aug 25 2016, 13:48  DASM Цитата(Atlantis- @ Aug 25 2016, 16:4... Aug 25 2016, 13:53 sigmaN Что нужно знать про арифметику с плавающей запятой... Aug 25 2016, 18:26 Atlantis- Цитата(sigmaN @ Aug 25 2016, 21:26) Что н... Aug 26 2016, 06:04  adnega Цитата(Atlantis- @ Aug 26 2016, 09:0... Aug 26 2016, 06:18   Atlantis- Цитата(adnega @ Aug 26 2016, 09:18) Счита... Aug 26 2016, 09:37 khach Начинать писание своего фильтра надо с того что ... Aug 26 2016, 08:06 Atlantis- Цитата(khach @ Aug 26 2016, 11:06) Начина... Aug 26 2016, 11:41 sigmaN ЦитатаНачинать писание своего фильтра надо с того ... Aug 26 2016, 09:44 sigmaN https://www.keil.com/pack/doc/CMSIS/DSP/htm...scad... Aug 26 2016, 16:41 Atlantis- Цитата(sigmaN @ Aug 26 2016, 19:41) https... Aug 27 2016, 16:25 sigmaN Читаем описание функци, реализует она следующее:
Ц... Aug 28 2016, 08:37 Atlantis- Аааа, вон оно как...понял, спасибо большое!
По... Aug 29 2016, 11:56 Atlantis- Порылся в интернете, на последний вопрос вроде наш... Aug 29 2016, 14:24 sigmaN Цитата1) результат вычислений получается float, дл... Aug 29 2016, 19:11 Atlantis- Цитата(sigmaN @ Aug 29 2016, 22:11) Корре... Aug 30 2016, 07:22 sigmaN ЦитатаНашел в интернете округление - просто прибав... Aug 30 2016, 11:15 ig_z QUOTE (sigmaN @ Aug 30 2016, 14:15) Ну ка... Aug 30 2016, 12:00 sigmaN Не знал, не знал. Ну тогда даташит на ЦАП в помощь... Aug 30 2016, 12:05 Atlantis- Вот я смотрю даташиты на оба ЦАП и не нахожу даже ... Aug 30 2016, 14:02 Atlantis- Нашел ответ на свой вопрос
ЦитатаThe AD1852 accept... Aug 31 2016, 12:16 sigmaN Ну вот, значит отрицательные числа представлены та... Sep 1 2016, 10:24 ig_z QUOTE (sigmaN @ Sep 1 2016, 13:24) если B... Sep 1 2016, 17:34 Atlantis- Сделал полосовые фильтры, проверил - все нормально... Sep 5 2016, 13:51 Atlantis- Как то так получается, что при подаче на вход реже... Sep 6 2016, 07:45
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|