Перейти к содержанию
    

Не знаю что и сказать, SystemVue позволяет считать и флоат и дабл и фиксед с любой точностью коэфф. и кол-ва бит. Матлаб, уверен, тоже.

Да, я нашел где в матлабе посчитать коэффициенты с Single-precision floating-point

Хорошо, теперь, если я буду подавать на вход фильтра с такими коэффициентами случайный 24-битный сигнал, у меня на выходе будет всегда получаться 24-битное число и никакие переполнения невозможны? Я просто никогда не работал с плавающей точкой, у целых чисел понятно когда появится переполнение, а тут - не очень.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, я нашел где в матлабе посчитать коэффициенты с Single-precision floating-point

Хорошо, теперь, если я буду подавать на вход фильтра с такими коэффициентами случайный 24-битный сигнал, у меня на выходе будет всегда получаться 24-битное число и никакие переполнения невозможны? Я просто никогда не работал с плавающей точкой, у целых чисел понятно когда появится переполнение, а тут - не очень.

Если переполнения нет в таком же фильтре fixed, то откуда оно появится в значительно более точном и на много порядков с большим ДД float?? Чисто общие соображения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще у меня в фильтре получается очень большое соотношение частоты дискретизации и частоты среза.

Это плохо. Лучше перенести фильтрацию на низкую частоту дискретизации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что нужно знать про арифметику с плавающей запятой

https://habrahabr.ru/post/112953/

 

Особо полезно прочесть вот эту часть

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что нужно знать про арифметику с плавающей запятой

https://habrahabr.ru/post/112953/

да, я читал эту статью

Особо полезно прочесть вот эту часть

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

а в чем польза? какой вывод можно сделать из этого пункта? не считать фильтры во float-ах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а в чем польза? какой вывод можно сделать из этого пункта? не считать фильтры во float-ах?

Считать, но правильно.

Зачастую фильтрация - это сложение с накоплением произведений пар чисел.

Нужно все перемножить. Полученные значения расставить по возрастанию.

Суммировать от меньшего к большему. Так ошибка будет минимальна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начинать писание своего фильтра надо с того что скачать CMSIS-DSP последней версии, выбрать подходящий фильтр и скомпилить его. Потом изучить результат компиляции в асме, проверить работоспособность и ресурсы которые фильтр жрет и только тогда заниматься его оптимизацией. Там много неявных граблей связанных с превыборкой инструкций процессора из флеша или рама, компилятор о них знает лучше, чем неподготовленный армовский ассемблерописатель.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Считать, но правильно.

Зачастую фильтрация - это сложение с накоплением произведений пар чисел.

Нужно все перемножить. Полученные значения расставить по возрастанию.

Суммировать от меньшего к большему. Так ошибка будет минимальна.

Не понял, как суммировать от меньшего к большему? Коэффициенты фильтра у меня отличаются в два раза, а входной сигнал - рандомный. Знак тоже не угадаешь. Или что мне сначала сравнивать произведения между собой, а потом складывать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начинать писание своего фильтра надо с того что скачать CMSIS-DSP последней версии, выбрать подходящий фильтр и скомпилить его.
Скорее всего там даже будет использоваться "железная" реализация умножения с накоплением, которая вроде как есть в F4

http://www.compel.ru/lib/ne/2012/6/3-bogat...adre-cortex-m4/

Так что фильтры должны довольно шустро считаться )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начинать писание своего фильтра надо с того что скачать CMSIS-DSP последней версии, выбрать подходящий фильтр и скомпилить его.

В этой библиотеке реализован только решетчатый фильтр IIR, а мне надо обычный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

https://www.keil.com/pack/doc/CMSIS/DSP/htm...scade_d_f1.html Можно реализовтаь фильтр любого порядка.

Если нужен первый то делаете b2=0 and a2=0. Впрочем там всё хорошо описано по ссылке

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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-

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Читаем описание функци, реализует она следующее:

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, таким образом изменив их знак )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Аааа, вон оно как...понял, спасибо большое!

Пока сам написал реализацию пары уравнений работающих с float, проверил анализатором спектра - похоже на правду. Смущает несколько моментов:

1) результат вычислений получается float, для вывода на ЦАП, естественно, преобразую его к int - теряется дробная часть, это нормально?

2) Отрицательные значения. Я подаю на вход фильтра белый шум, 24-битный. Соответственно, после фильтра у меня тоже должно получаться 24-битный результат. Но! Отрицательные значения в процессоре - это инвертированное положительное число + 1. А для ЦАП отрицательное значение получается простой инверсией положительного числа. Я отлавливаю в итоговом результате, если 23-й бит = 1, то я из всего числа вычитаю единицу. Это правильно?

3) Мне коэффициенты надо с компьютера передавать, а они у меня float теперь. Тут мне посоветовали, домножать, потом делить. Но как мне передать например число 0.99577337503433228 ? Чтобы целое получить, надо домножить на 10^17 и что потом с ним делать? Оно же даже в int не влезет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Порылся в интернете, на последний вопрос вроде нашел ответ.

Сделал так, результат сходится

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...