Компиляция кодов WinFilter в Arduino IDE
- Войдите на сайт для отправки комментариев
Сб, 27/10/2018 - 19:35
Информация для тех, кто, подобно мне, захочет воспользоваться программой WinFilter, вернее, сгенерированными ею кодами для цифровых фильтров.
Если выбрать там 16-бит представление, то получаются неплохие фильтры (Чебышева, Бесселя и т.п.) для фильтрации analogRead. Выдаются всехарактеристики - по частоте, фазе и т.п. Всё здорово!
При этом она использует типы __int16 и __int32. Казалось бы, сохраняй её результат в файл (например, filter.h) и включай в скетч как
#define __int16 int16_t #define __int32 int32_t #include "filter.h"
а вот хренушки! Из-за промежуточных вычислений, в которых нужно 32 бита, она будет врать.
Потому делать надо вот так:
#define __int16 int32_t #define __int32 int32_t #include "filter.h"
Тогда всё отлично получится. Успехов!
Дополнение, забыл приписать: разумется, предпочтительнее так не делать, а полезть в текст фильтра и аккуратно вставить преобразование к int32_t там, где это реально нужно, а не везде, как в моём совете. Но, тем, кто умеет это делать, мой совет не нужен вовсе, а для тех, кто не умеет - это решение.
Честно говоря, когда-то смотрел эту программу (судя по тому, что последняя версия датируется 2004 годом, смотрел именно ее) и тогда меня ее результаты откровенно разочаровали. Потом, когда сам начал разбираться с цифровыми фильтрами, пришел к выводу, что для промежуточных резултатов минимальной разрядностью является 56. (имеется в виду звуковой диапазон с частотой дискретизации 48 кГц) Поэтому сам предпочитаю на ПК обрабатывать звук исключительно в double, а на микроконтроллерах использую 64-разрядные помежуточные данные. В частности на этом форуме: http://arduino.ru/forum/proekty/analog-analogovogo-sintezatora#comment-380023
Ну, как всегда, всё от задачи зависит. У меня частота дискретизации 2кГц, понадобился фильтр с частотой среза 300Гц, взял Чебышева 4-го порядка из этой программы на int16 - очень доволен, срез крутой - для моей задачи подошло очень хорошо.
Кстати, в double она тоже умеет (ну, Вы это и без меня знаете).
Нет, ну если частота дискретизации и частота фильтра отличаются только в 7 раз, тогда нет никаких предпосылок для проблем.
А если, скажем, пи частоте дискретизации 48 кГц фильтр нужно сделать на нижнюю частоту звукового диапазона т.е. на 16 Гц, то разница по частоте уже 3000 раз. В формулу входит коэффициент "бета", зависящий от частоты. При этом входит он в квадрате. Т.е. наши числа уже должны покрывать диапазон никак не менее 9000000, а это уже чуть больше 24 разрядов. Если еще необходимо, чтобы погрешность составляла не плюс-минус октаву, а хотя бы до полутона, получается что у числа кроме порядка е-7 еще и на мантиссу должно приходиться хотя бы 4 разряда. Всего получается 28. Ну а для промежуточных умножений-делений - удвоенное значение т.е. уже упоминавшиеся 56 разрядов.
Ну, так ото ж.
Впрочем, это уже оффтоп. Топик-то для тех, для кого проблема это добро скомпилировать - уж точно не для нас с Вами :)))
Я правильно понимаю, что это не ардуиновская (по крайней мере, на аvr'дуиновская) тема? Или как-то можно?
Я правильно понимаю, что это не ардуиновская (по крайней мере, на аvr'дуиновская) тема? Или как-то можно?
А что касается AVR, то когда я экспериментировал влуруг дрнгого проекта (на всякий случай приведу ссылку и на него: http://arduino.ru/forum/proekty/floppy-hdd-music ), то выяснил, что и там (конкретно При Мини) можно поднять частоту дискретизации до 110 кГц. Правда, тогда ресурсов хватит лишь на один голос.
В общем, при правильном соизмерении желаний и возможностей можно получить весьма интересные результаты.
понадобился фильтр с частотой среза 300Гц
Не пульсметр, случаем? А то я его как раз сейчас делаю.