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

 
 
> DSP на STM32F4
Atlantis-
сообщение Aug 25 2016, 07:59
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Здравствуйте!
Помогите разобраться с DSP на STM32F429. Никогда раньше этой темой не занимался, не понимаю в какую сторону начинать копать. Задача такая: мне нужно генерировать белый шум, фильтровать его разными фильтрами и выдавать на аудио ЦАП (48 кГц). Фильтры нужны режекторный второго порядка и полосовой, четвертого порядка, с БИХ. Фильтры я посчитал в матлабе, приготовился уже реализовывать в целочисленной арифметике. Но в этом процессоре есть блок вычислений с плавающей точкой. Я с этим никогда дела не имел. В референс мануале описание этого блока не нашел. Есть некая библиотека CMSIS DSP, в которой реализованы фильтры, но я так понял она мне не подойдет, поскольку там какая то странная структура реализованного IIR фильтра и работает он с какими то блоками данных. А мне надо просто сгенерировать Х, посчитать Y, запомнить Х-1 и Y-1 для следующего отчета.
Скажите, какое преимущество мне даст работа с float и вообще, могу ли я так просто, без всяких библиотек взять и расписать свои фильтры во float?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sigmaN
сообщение Aug 29 2016, 19:11
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
1) результат вычислений получается float, для вывода на ЦАП, естественно, преобразую его к int - теряется дробная часть, это нормально?
Корректнее наверно тут использвоать округление вместо простого отбрасывания дробной части http://www.cplusplus.com/reference/cmath/ceil/

Цитата
2) Отрицательные значения. Я подаю на вход фильтра белый шум, 24-битный. Соответственно, после фильтра у меня тоже должно получаться 24-битный результат. Но! Отрицательные значения в процессоре - это инвертированное положительное число + 1. А для ЦАП отрицательное значение получается простой инверсией положительного числа.
Что это за ЦАП то такой у вас? Прям с двухполярным питанием и честной выдачей наружу напряжения ниже нуля?
Очень сомневаюсь. Регистр ЦАПа скорее всего беззнаковый от 0 до скольки там разрадность позволяет.
А потому за 0 надобно принять половинку разрядности ЦАПа. Если он например 16ти разрядный, то за 0 надо принять половинку 2^16 / 2 = 32768
Таким образом получившиеся после фильтра циферки перед передачей в ЦАП надо приготовить.
У вас будет еще одна задачка если в процессе цифровой обработки получились космические цифры, которые в диапазон ЦАПа(-32768 до +32767) не влазят.
Что с этим делать это решать вам(зависит от задачи).
Например можно организовать нормализацию https://ru.wikipedia.org/wiki/%D0%9D%D0%BE%...%83%D0%BA%D0%B0 или компрессию динамического диапазона https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%...%B0%D0%BB%D0%B0

Хорошей идеей было бы на выходе тракте цифровой обработки сигнала сделать так, чтобы данные были представлены числами от -1 до 1. Т.е. нормализовать их. Тогда вы будете знать, что 1 это максимальный уровень, а -1 минимальный. "Вписать" такой сигнал в нужный диапазон значений можно будет простым умножением на константу.

В общем потом, когда ваши данные так или иначе укладываются в диапазон ЦАПа(-32768 до +32767) применяете тот самый виртуальный 0.
DAC_REGISTER = 32768 + filter_data[i];
И не надо заморачиваться как там это будет посчитано и как в системе хранится отрицательное значение. Тестировать там какие-то биты в данном случае - дичайший говнокод.

Цитата
3) Мне коэффициенты надо с компьютера передавать, а они у меня float теперь.

Учитывая, что большинство машин сейчас уважают IEEE 754 стандарт ваш хак с вычленением байт конечно будет работать, но назвать этот подход правильным нельзя.
Если делать правильно и портабельно, то в том числе передают даже в виде строки. sprintf() на стороне передатчика, sscanf() на стороне приемника sm.gif
Либо определяйтесь, что между компьютером и устройством коэффициенты передаются в формате с фиксированной точкой, чтобы всё было чётко определено и задокументировано.
Еше стоит учесть, что бывают машины с разным порядком байт https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%...%82%D0%BE%D0%B2




--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Atlantis-   DSP на STM32F4   Aug 25 2016, 07:59
- - adnega   Цитата(Atlantis- @ Aug 25 2016, 10:5...   Aug 25 2016, 08:24
|- - Atlantis-   Цитата(adnega @ Aug 25 2016, 11:24) Я воо...   Aug 25 2016, 08:45
|- - aaarrr   Цитата(Atlantis- @ Aug 25 2016, 11:4...   Aug 25 2016, 08:50
|- - Atlantis-   Цитата(aaarrr @ Aug 25 2016, 11:50) Ничег...   Aug 25 2016, 09:30
|- - aaarrr   Цитата(Atlantis- @ Aug 25 2016, 12:2...   Aug 25 2016, 09:31
|- - 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
|- - 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


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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 01:31
Рейтинг@Mail.ru


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