|
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 29 2016, 19:11
|

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() на стороне приемника  Либо определяйтесь, что между компьютером и устройством коэффициенты передаются в формате с фиксированной точкой, чтобы всё было чётко определено и задокументировано. Еше стоит учесть, что бывают машины с разным порядком байт https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%...%82%D0%BE%D0%B2
--------------------
The truth is out there...
|
|
|
|
|
Aug 30 2016, 07:22
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(sigmaN @ Aug 29 2016, 22:11)  Корректнее наверно тут использвоать округление вместо простого отбрасывания дробной части http://www.cplusplus.com/reference/cmath/ceil/Нашел в интернете округление - просто прибавление 0.5 к float. Жалко с отрицательными не прокатит, там надо вычитать, снова if надо городить Цитата(sigmaN @ Aug 29 2016, 22:11)  Что это за ЦАП то такой у вас? Прям с двухполярным питанием и честной выдачей наружу напряжения ниже нуля? Очень сомневаюсь. Регистр ЦАПа скорее всего беззнаковый от 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]; И не надо заморачиваться как там это будет посчитано и как в системе хранится отрицательное значение. Тестировать там какие-то биты в данном случае - дичайший говнокод. ЦАП - CS4344, пробовал на AD1852. Ни в том ни в другом даташите не нашел, как же представлять отрицательные числа. Но это как то должно наверно быть обозначено? Для AD1852 написал тестовую синусоиду, сначала я не парился, думал, что максимальное отрицательное значение - это 0х000000. Проверил - какая то фигулька получилась, а не синусоида. Потом вот просто начал инвертировать положительные значения - получилась синусоида, размах вроде как и должен быть. А для CS4344 я просто подал тот же массив - получилась синусоида, ну и хорошо. А вообще мне интересно, как обозначается в доке, каким способом кодируется отрицательные значения в ЦАП? Цитата(sigmaN @ Aug 29 2016, 22:11)  Учитывая, что большинство машин сейчас уважают IEEE 754 стандарт ваш хак с вычленением байт конечно будет работать, но назвать этот подход правильным нельзя. Если делать правильно и портабельно, то в том числе передают даже в виде строки. sprintf() на стороне передатчика, sscanf() на стороне приемника  Либо определяйтесь, что между компьютером и устройством коэффициенты передаются в формате с фиксированной точкой, чтобы всё было чётко определено и задокументировано. Еше стоит учесть, что бывают машины с разным порядком байт https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%...%82%D0%BE%D0%B2Да мне главное правильно собрать float из байтов на микроконтроллере. А разобрать его на компе - чисто для проверки. Хотя зачем, я могу даже сразу вручную разобрать все нужные float-ы на байты, на этом сайте http://floatingpoint.ru/online/dec2float.php Хранить и передавать в виде байт. Тем более коэффициенты у меня все уже вычислены. Наверно так будет наиболее надежно))
|
|
|
|
Сообщений в этой теме
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 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
|
|
|