Форум Радиолюбителей

FIR фильтр на Си

29561 просмотров, 25 ответов — стр. 2 из 2

ra0ahcra0ahc
Сообщений: 4868
18 сентября 2020 г. в 04:24#16
Вот видос , в сравнении с предыдущей записью что получилось. Скорость конечно в раз 5 выросла.

https://youtu.be/LMXk4uXw3CU
r1tx
Сообщений: 503
18 сентября 2020 г. в 04:36#17
ну можно развернуть на весь экран
ra0ahcra0ahc
Сообщений: 4868
18 сентября 2020 г. в 04:40#18
А остальную инфу куда выводить?
Это просто проверка работы фильтра. В реалях, он естественно не будет обрабатываться FFT , поток сразу пойдет на ЦАП, а на экране будет панорама. попробовал 24кГц - спокойно влазит в такой прямоугольник. Можно и 48кГц отобразить. Всё это дела будущего.
r1tx
Сообщений: 503
18 сентября 2020 г. в 04:48#19
ну тогда диагональ 7 нада
ra0ahcra0ahc
Сообщений: 4868
19 сентября 2020 г. в 11:47#20
Вот такие возможности 2D ускорителя. Водопад через ДМА.
Медленно - это второстепенный поток.
Быстро - это если переключить вывод панорамы и водопада через основной поток (скоростной), но так делать нельзя, может не хватить ресурсов под i2s

видио:
https://youtu.be/vt87FsDzykc
19 сентября 2020 г. в 12:22#21
Усреднение бы сделать
ra0ahcra0ahc
Сообщений: 4868
19 сентября 2020 г. в 01:10#22
Легко
Усреднение 4


19 сентября 2020 г. в 01:16#23
На фото не поянтно что за столбы. Если будет время запишите видео
ra0ahcra0ahc
Сообщений: 4868
7 октября 2020 г. в 09:23#24
РАСЧЕТ КОЭФФИЦИЕНТОВ для FIR фильтра с помощью весового окна

Как всегда вчерашний день провел в полном отупении от количество перерытой литературы и математики в ней.
Была попытка сделать методом ... вообщем рисую желаемую АЧХ умножаю на ФЧХ и делаю ОДПФурье. Нифига не заработало (усомнился в правильности роста рук у меня и место от куда они растут ).
Потом Геннадий дал наводку (да фактически готовые процедуры) и всё заработало. Метод называется Расчет коэффициентов методом весового окна. Все просто как грабли. Рисуем синус (или косинус в зависимости фнч или фвч) потом умножаем на весовое окно и дальше выравнивание амплитуд.
Вот процедура:

//расчет эквалайзера 24000
float32_t pi = 3.14159265359f;
uint32_t N = FIR_FILTER_TAP_NUM;//256
float32_t freqForCoeff = (float32_t) (2.0f * 3100 / 24000); //3100 - частота среза
uint32_t HalfLen = (N - 1) / 2;
firCoeff32dsp[HalfLen] = freqForCoeff;
for (int k = 1; k <= HalfLen; k++) {
float32_t TmpFloat = pi * k;
firCoeff32dsp[HalfLen + k] = arm_sin_f32(freqForCoeff * TmpFloat) / TmpFloat;
firCoeff32dsp[HalfLen - k] = firCoeff32dsp[HalfLen + k];
}
/*------------------------------*/
/* умножение на весовое окно */
/*------------------------------*/
float32_t TmpFloat = 2.0f * pi / (N - 1.0f);
float32_t Sum = 0;
for (int k = 0; k < N; k++) {

//Окно Хемминга
//firCoeff32dsp[k ] *= (0.54 - 0.46 * arm_cos_f32(TmpFloat * k));

//flaptop
// firCoeff32dsp[k ] *= (float32_t) (1.0
// - 1.93293488969227 * arm_cos_f32(k * 2.0f * pi / (N - 1))
// + 1.28349769674027 * arm_cos_f32(k * 2.0f * pi * 2.0f / (N - 1))
// - 0.38130801681619 * arm_cos_f32(k * 2.0f * pi * 3.0f / (N - 1))
// + 0.02929730258511 * arm_cos_f32(k * 2.0f * pi * 4.0f / (N - 1)));

//Окно Блэкмана — Харриса
firCoeff32dsp[k ] *= (float32_t) (0.35875
- 0.48829 * arm_cos_f32(k * 2.0f * pi / (N - 1))
+ 0.14128 * arm_cos_f32(k * 2.0f * pi * 2.0f / (N - 1))
- 0.01168 * arm_cos_f32(k * 2.0f * pi * 3.0f / (N - 1)));

Sum += firCoeff32dsp[k ];
}

/*------------------------------*/
/* нормализация амплитуд к 1 */
/*------------------------------*/
for (int k = 0; k < N; k++) {
firCoeff32dsp[k ] /= (float32_t) fabs(Sum);
}

//подготовка буферов к фир фильтрации
arm_fir_init_f32(&S_dsp, FIR_FILTER_TAP_NUM, (float32_t *) firCoeff32dsp, &firStateF32dsp[0], FRAME_SIZE);
......

Примеры разных окон. Палка это лом на частоте 3500.


ra0ahcra0ahc
Сообщений: 4868
7 октября 2020 г. в 09:24#25
еще

Окно Блэкмана — Харриса