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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> DSP на STM32F4
Atlantis-
сообщение Aug 25 2016, 13:48
Сообщение #16


Местный
***

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



Цитата(DASM @ Aug 25 2016, 16:35) *
Не знаю что и сказать, SystemVue позволяет считать и флоат и дабл и фиксед с любой точностью коэфф. и кол-ва бит. Матлаб, уверен, тоже.

Да, я нашел где в матлабе посчитать коэффициенты с Single-precision floating-point
Хорошо, теперь, если я буду подавать на вход фильтра с такими коэффициентами случайный 24-битный сигнал, у меня на выходе будет всегда получаться 24-битное число и никакие переполнения невозможны? Я просто никогда не работал с плавающей точкой, у целых чисел понятно когда появится переполнение, а тут - не очень.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 25 2016, 13:53
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Atlantis- @ Aug 25 2016, 16:48) *
Да, я нашел где в матлабе посчитать коэффициенты с Single-precision floating-point
Хорошо, теперь, если я буду подавать на вход фильтра с такими коэффициентами случайный 24-битный сигнал, у меня на выходе будет всегда получаться 24-битное число и никакие переполнения невозможны? Я просто никогда не работал с плавающей точкой, у целых чисел понятно когда появится переполнение, а тут - не очень.

Если переполнения нет в таком же фильтре fixed, то откуда оно появится в значительно более точном и на много порядков с большим ДД float?? Чисто общие соображения.
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 25 2016, 15:32
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Atlantis- @ Aug 25 2016, 14:46) *
Еще у меня в фильтре получается очень большое соотношение частоты дискретизации и частоты среза.

Это плохо. Лучше перенести фильтрацию на низкую частоту дискретизации.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Aug 25 2016, 18:26
Сообщение #19


I WANT TO BELIEVE
******

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



Что нужно знать про арифметику с плавающей запятой
https://habrahabr.ru/post/112953/

Особо полезно прочесть вот эту часть
4. Подводные камни в арифметике с плавающей запятой


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Aug 26 2016, 06:04
Сообщение #20


Местный
***

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



Цитата(sigmaN @ Aug 25 2016, 21:26) *
Что нужно знать про арифметику с плавающей запятой
https://habrahabr.ru/post/112953/

да, я читал эту статью
Цитата(sigmaN @ Aug 25 2016, 21:26) *
Особо полезно прочесть вот эту часть
4. Подводные камни в арифметике с плавающей запятой

а в чем польза? какой вывод можно сделать из этого пункта? не считать фильтры во float-ах?
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 26 2016, 06:18
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Atlantis- @ Aug 26 2016, 09:04) *
а в чем польза? какой вывод можно сделать из этого пункта? не считать фильтры во float-ах?

Считать, но правильно.
Зачастую фильтрация - это сложение с накоплением произведений пар чисел.
Нужно все перемножить. Полученные значения расставить по возрастанию.
Суммировать от меньшего к большему. Так ошибка будет минимальна.
Go to the top of the page
 
+Quote Post
khach
сообщение Aug 26 2016, 08:06
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 3 439
Регистрация: 29-12-04
Пользователь №: 1 741



Начинать писание своего фильтра надо с того что скачать CMSIS-DSP последней версии, выбрать подходящий фильтр и скомпилить его. Потом изучить результат компиляции в асме, проверить работоспособность и ресурсы которые фильтр жрет и только тогда заниматься его оптимизацией. Там много неявных граблей связанных с превыборкой инструкций процессора из флеша или рама, компилятор о них знает лучше, чем неподготовленный армовский ассемблерописатель.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Aug 26 2016, 09:37
Сообщение #23


Местный
***

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



Цитата(adnega @ Aug 26 2016, 09:18) *
Считать, но правильно.
Зачастую фильтрация - это сложение с накоплением произведений пар чисел.
Нужно все перемножить. Полученные значения расставить по возрастанию.
Суммировать от меньшего к большему. Так ошибка будет минимальна.

Не понял, как суммировать от меньшего к большему? Коэффициенты фильтра у меня отличаются в два раза, а входной сигнал - рандомный. Знак тоже не угадаешь. Или что мне сначала сравнивать произведения между собой, а потом складывать?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Aug 26 2016, 09:44
Сообщение #24


I WANT TO BELIEVE
******

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



Цитата
Начинать писание своего фильтра надо с того что скачать CMSIS-DSP последней версии, выбрать подходящий фильтр и скомпилить его.
Скорее всего там даже будет использоваться "железная" реализация умножения с накоплением, которая вроде как есть в F4
http://www.compel.ru/lib/ne/2012/6/3-bogat...adre-cortex-m4/
Так что фильтры должны довольно шустро считаться )


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Aug 26 2016, 11:41
Сообщение #25


Местный
***

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



Цитата(khach @ Aug 26 2016, 11:06) *
Начинать писание своего фильтра надо с того что скачать CMSIS-DSP последней версии, выбрать подходящий фильтр и скомпилить его.

В этой библиотеке реализован только решетчатый фильтр IIR, а мне надо обычный.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Aug 26 2016, 16:41
Сообщение #26


I WANT TO BELIEVE
******

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



https://www.keil.com/pack/doc/CMSIS/DSP/htm...scade_d_f1.html Можно реализовтаь фильтр любого порядка.
Если нужен первый то делаете b2=0 and a2=0. Впрочем там всё хорошо описано по ссылке


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Aug 27 2016, 16:25
Сообщение #27


Местный
***

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



Цитата(sigmaN @ Aug 26 2016, 19:41) *
https://www.keil.com/pack/doc/CMSIS/DSP/htm...scade_d_f1.html Можно реализовтаь фильтр любого порядка.
Если нужен первый то делаете b2=0 and a2=0. Впрочем там всё хорошо описано по ссылке

Спасибо, это я как то пропустил...
Изучаю, не понял одно требование
Цитата
Pay careful attention to the sign of the feedback coefficients. Some design tools use the difference equation
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]
In this case the feedback coefficients a1 and a2 must be negated when used with the CMSIS DSP Library.

Что то странное, у меня только а1 отрицательный, а2 - положительный.
Или это правильно переводится как "а1 и а2 должны нейтрализовываться" и у меня все правильно?

Сообщение отредактировал Atlantis- - Aug 27 2016, 16:33
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Aug 28 2016, 08:37
Сообщение #28


I WANT TO BELIEVE
******

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



Читаем описание функци, реализует она следующее:
Цитата
Algorithm
Each Biquad stage implements a second order filter using the difference equation:
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]

Ниже заостряется внимание на том, что некоторые программы для моделирования фильтров подразумевают, что уравнение будет другим
Цитата
Some design tools use the difference equation
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]

Видите разницу? в первом случае +a1 +a2 а во втором -a1 -a2

Соответственно вам подсказывают, что если вы пользуетесь как раз таким софтом, то коэффициенты a1 и a2 must be negated.
Если по русски то перед применением коэффициенты a1 и a2 умножьте на -1, таким образом изменив их знак )


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Aug 29 2016, 11:56
Сообщение #29


Местный
***

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



Аааа, вон оно как...понял, спасибо большое!
Пока сам написал реализацию пары уравнений работающих с float, проверил анализатором спектра - похоже на правду. Смущает несколько моментов:
1) результат вычислений получается float, для вывода на ЦАП, естественно, преобразую его к int - теряется дробная часть, это нормально?
2) Отрицательные значения. Я подаю на вход фильтра белый шум, 24-битный. Соответственно, после фильтра у меня тоже должно получаться 24-битный результат. Но! Отрицательные значения в процессоре - это инвертированное положительное число + 1. А для ЦАП отрицательное значение получается простой инверсией положительного числа. Я отлавливаю в итоговом результате, если 23-й бит = 1, то я из всего числа вычитаю единицу. Это правильно?
3) Мне коэффициенты надо с компьютера передавать, а они у меня float теперь. Тут мне посоветовали, домножать, потом делить. Но как мне передать например число 0.99577337503433228 ? Чтобы целое получить, надо домножить на 10^17 и что потом с ним делать? Оно же даже в int не влезет.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Aug 29 2016, 14:24
Сообщение #30


Местный
***

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



Порылся в интернете, на последний вопрос вроде нашел ответ.
Сделал так, результат сходится
Код
float float_value=0.6543278;
char float_bytes[sizeof(float)];
float *ptr;
float new_value;

//разбиение на байты
float_bytes[0] = *((char *)&float_value + 0);//0x07
float_bytes[1] = *((char *)&float_value + 1);//0x82
float_bytes[2] = *((char *)&float_value + 2);//0x27
float_bytes[3] = *((char *)&float_value + 3);//0x3F
//http://floatingpoint.ru/online/dec2float.php - проверка

//собрали из байт float
ptr = (float*)float_bytes;
new_value = *ptr;
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th April 2024 - 15:08
Рейтинг@Mail.ru


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