РАСЧЕТ КОЭФФИЦИЕНТОВ для 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.