Я использовал winfilter для генерации исходника
http://www.winfilter.20m.com/Код вставлял в Builder без изменений (FIR 4).
Исходно идет оцифровка сигнала 17300 Гц 4-х кратной чатотой.
Затем вычисляются sin/cos и суммирование за 64 периода
Код
balance_value = ADC_GetInjectedConversionValue(ADC3, ADC_InjectedChannel_1);
switch (i & 3)
{
case 0: Re += balance_value; break;
case 1: Im += balance_value; break;
case 2: Re -= balance_value; break;
case 3: Im -= balance_value; break;
}
i++;
if (i == MAX_AVERAGE_BALANCE_SIGNAL )
{
i = 0;
Re /= (MAX_AVERAGE_BALANCE_SIGNAL/4);
Im /= (MAX_AVERAGE_BALANCE_SIGNAL/4);
re_value = Re;
im_value = Im;
amp_series_samples = (Re * Re + Im * Im);
}
Чтобы результат
(Re * Re + Im * Im) поместился в 32 бита накопленные значение делятся на 4.
Но на расчет фильтра, по моему, не должны влиять
Для расчета фильтра нужна частота семплирования и верхняя граница пропускания.
Частоту семплирования я рассчитал как 17300 * 4 / 64 = 1082Гц.
Частоту верхней границы ставил от 1 до 10Гц но "красивого" гладкого сигнала не получил.
меньше 1 Гц программа не позволяет использовать
Пробовал 1082Гц увеличивать/уменьшать 2 и 4 раза - не помогло.
Пример плохого сигнала "small_fe.PNG", хорошего "big_cu.PNG", сдвоеного "1_cop_ua.PNG" в архиве.
В нем же csv данные.
Одну картинку прикладываю отделльно для оперативного просмотра
Эскизы прикрепленных изображений