Компиляция кодов WinFilter в Arduino IDE

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Информация для тех, кто, подобно мне, захочет воспользоваться программой 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"

Тогда всё отлично получится. Успехов!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дополнение, забыл приписать: разумется, предпочтительнее так не делать, а полезть в текст фильтра и аккуратно вставить преобразование к int32_t там, где это реально нужно, а не везде, как в моём совете. Но, тем, кто умеет это делать, мой совет не нужен вовсе, а для тех, кто не умеет - это решение.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Честно говоря, когда-то смотрел эту программу (судя по тому, что последняя версия датируется 2004 годом, смотрел именно ее) и тогда меня ее результаты откровенно разочаровали. Потом, когда сам начал разбираться с цифровыми фильтрами, пришел к выводу, что для промежуточных резултатов минимальной разрядностью является 56. (имеется в виду звуковой диапазон с частотой дискретизации 48 кГц) Поэтому сам предпочитаю на ПК обрабатывать звук исключительно в double, а на микроконтроллерах использую 64-разрядные помежуточные данные. В частности на этом форуме: http://arduino.ru/forum/proekty/analog-analogovogo-sintezatora#comment-380023

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, как всегда, всё от задачи зависит. У меня частота дискретизации 2кГц, понадобился фильтр с частотой среза 300Гц, взял Чебышева 4-го порядка из этой программы на int16 - очень доволен, срез крутой - для моей задачи подошло очень хорошо.

Кстати, в double она тоже умеет (ну, Вы это и без меня знаете).

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нет, ну если частота дискретизации и частота фильтра отличаются только в 7 раз, тогда нет никаких предпосылок для проблем. 

А если, скажем, пи частоте дискретизации 48 кГц фильтр нужно сделать на нижнюю частоту звукового диапазона т.е. на 16 Гц, то разница по частоте уже 3000 раз. В формулу входит коэффициент "бета", зависящий от частоты. При этом входит он в квадрате. Т.е. наши числа уже должны покрывать диапазон никак не менее 9000000, а это уже чуть больше 24 разрядов. Если еще необходимо, чтобы погрешность составляла не плюс-минус октаву, а хотя бы до полутона, получается что у числа кроме порядка е-7 еще и на мантиссу должно приходиться хотя бы 4 разряда. Всего получается 28. Ну а для промежуточных умножений-делений - удвоенное значение т.е. уже упоминавшиеся 56 разрядов.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, так ото ж.

Впрочем, это уже оффтоп.  Топик-то для тех,  для кого проблема это добро скомпилировать - уж точно не для нас с Вами :)))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

andriano пишет:
с частотой дискретизации 48 кГц

Я правильно понимаю, что это не ардуиновская (по крайней мере, на аvr'дуиновская) тема? Или как-то можно?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ворота пишет:

andriano пишет:
с частотой дискретизации 48 кГц

Я правильно понимаю, что это не ардуиновская (по крайней мере, на аvr'дуиновская) тема? Или как-то можно?

Ну я же привел ссылку, по которой видно, что в данном пректе использовалась самая что ни на есть Ардуино Дуэ.

А что касается AVR, то когда я экспериментировал влуруг дрнгого проекта (на всякий случай приведу ссылку и на него: http://arduino.ru/forum/proekty/floppy-hdd-music ), то выяснил, что и там (конкретно При Мини) можно поднять частоту дискретизации до 110 кГц. Правда, тогда ресурсов хватит лишь на один голос.

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

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

понадобился фильтр с частотой среза 300Гц

Не пульсметр, случаем? А то я его как раз сейчас делаю.