Dima1060 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Не знаю что и сказать, SystemVue позволяет считать и флоат и дабл и фиксед с любой точностью коэфф. и кол-ва бит. Матлаб, уверен, тоже. Да, я нашел где в матлабе посчитать коэффициенты с Single-precision floating-point Хорошо, теперь, если я буду подавать на вход фильтра с такими коэффициентами случайный 24-битный сигнал, у меня на выходе будет всегда получаться 24-битное число и никакие переполнения невозможны? Я просто никогда не работал с плавающей точкой, у целых чисел понятно когда появится переполнение, а тут - не очень. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Да, я нашел где в матлабе посчитать коэффициенты с Single-precision floating-point Хорошо, теперь, если я буду подавать на вход фильтра с такими коэффициентами случайный 24-битный сигнал, у меня на выходе будет всегда получаться 24-битное число и никакие переполнения невозможны? Я просто никогда не работал с плавающей точкой, у целых чисел понятно когда появится переполнение, а тут - не очень. Если переполнения нет в таком же фильтре fixed, то откуда оно появится в значительно более точном и на много порядков с большим ДД float?? Чисто общие соображения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Еще у меня в фильтре получается очень большое соотношение частоты дискретизации и частоты среза. Это плохо. Лучше перенести фильтрацию на низкую частоту дискретизации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Что нужно знать про арифметику с плавающей запятой https://habrahabr.ru/post/112953/ Особо полезно прочесть вот эту часть 4. Подводные камни в арифметике с плавающей запятой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 26 августа, 2016 Опубликовано 26 августа, 2016 · Жалоба Что нужно знать про арифметику с плавающей запятой https://habrahabr.ru/post/112953/ да, я читал эту статью Особо полезно прочесть вот эту часть 4. Подводные камни в арифметике с плавающей запятой а в чем польза? какой вывод можно сделать из этого пункта? не считать фильтры во float-ах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 26 августа, 2016 Опубликовано 26 августа, 2016 · Жалоба а в чем польза? какой вывод можно сделать из этого пункта? не считать фильтры во float-ах? Считать, но правильно. Зачастую фильтрация - это сложение с накоплением произведений пар чисел. Нужно все перемножить. Полученные значения расставить по возрастанию. Суммировать от меньшего к большему. Так ошибка будет минимальна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 45 26 августа, 2016 Опубликовано 26 августа, 2016 · Жалоба Начинать писание своего фильтра надо с того что скачать CMSIS-DSP последней версии, выбрать подходящий фильтр и скомпилить его. Потом изучить результат компиляции в асме, проверить работоспособность и ресурсы которые фильтр жрет и только тогда заниматься его оптимизацией. Там много неявных граблей связанных с превыборкой инструкций процессора из флеша или рама, компилятор о них знает лучше, чем неподготовленный армовский ассемблерописатель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 26 августа, 2016 Опубликовано 26 августа, 2016 · Жалоба Считать, но правильно. Зачастую фильтрация - это сложение с накоплением произведений пар чисел. Нужно все перемножить. Полученные значения расставить по возрастанию. Суммировать от меньшего к большему. Так ошибка будет минимальна. Не понял, как суммировать от меньшего к большему? Коэффициенты фильтра у меня отличаются в два раза, а входной сигнал - рандомный. Знак тоже не угадаешь. Или что мне сначала сравнивать произведения между собой, а потом складывать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 26 августа, 2016 Опубликовано 26 августа, 2016 · Жалоба Начинать писание своего фильтра надо с того что скачать CMSIS-DSP последней версии, выбрать подходящий фильтр и скомпилить его. Скорее всего там даже будет использоваться "железная" реализация умножения с накоплением, которая вроде как есть в F4 http://www.compel.ru/lib/ne/2012/6/3-bogat...adre-cortex-m4/ Так что фильтры должны довольно шустро считаться ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 26 августа, 2016 Опубликовано 26 августа, 2016 · Жалоба Начинать писание своего фильтра надо с того что скачать CMSIS-DSP последней версии, выбрать подходящий фильтр и скомпилить его. В этой библиотеке реализован только решетчатый фильтр IIR, а мне надо обычный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 26 августа, 2016 Опубликовано 26 августа, 2016 · Жалоба https://www.keil.com/pack/doc/CMSIS/DSP/htm...scade_d_f1.html Можно реализовтаь фильтр любого порядка. Если нужен первый то делаете b2=0 and a2=0. Впрочем там всё хорошо описано по ссылке Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 27 августа, 2016 Опубликовано 27 августа, 2016 (изменено) · Жалоба 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 должны нейтрализовываться" и у меня все правильно? Изменено 27 августа, 2016 пользователем Atlantis- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 28 августа, 2016 Опубликовано 28 августа, 2016 · Жалоба Читаем описание функци, реализует она следующее: 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, таким образом изменив их знак ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 29 августа, 2016 Опубликовано 29 августа, 2016 · Жалоба Аааа, вон оно как...понял, спасибо большое! Пока сам написал реализацию пары уравнений работающих с float, проверил анализатором спектра - похоже на правду. Смущает несколько моментов: 1) результат вычислений получается float, для вывода на ЦАП, естественно, преобразую его к int - теряется дробная часть, это нормально? 2) Отрицательные значения. Я подаю на вход фильтра белый шум, 24-битный. Соответственно, после фильтра у меня тоже должно получаться 24-битный результат. Но! Отрицательные значения в процессоре - это инвертированное положительное число + 1. А для ЦАП отрицательное значение получается простой инверсией положительного числа. Я отлавливаю в итоговом результате, если 23-й бит = 1, то я из всего числа вычитаю единицу. Это правильно? 3) Мне коэффициенты надо с компьютера передавать, а они у меня float теперь. Тут мне посоветовали, домножать, потом делить. Но как мне передать например число 0.99577337503433228 ? Чтобы целое получить, надо домножить на 10^17 и что потом с ним делать? Оно же даже в int не влезет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 29 августа, 2016 Опубликовано 29 августа, 2016 · Жалоба Порылся в интернете, на последний вопрос вроде нашел ответ. Сделал так, результат сходится 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться