Автор Тема: FIR фильтр на Си  (Прочитано 5564 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #15 : Сентябрь 18, 2020, 04:24:17 pm »
Вот видос , в сравнении с предыдущей записью что получилось. Скорость конечно в раз 5 выросла.

https://youtu.be/LMXk4uXw3CU
Да да, я знаю, у меня ничего не получится )))

Оффлайн r1tx

  • Sr. Member
  • ****
  • Сообщений: 490
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #16 : Сентябрь 18, 2020, 04:36:33 pm »
ну можно развернуть на весь экран

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #17 : Сентябрь 18, 2020, 04:40:35 pm »
А остальную инфу куда выводить?
Это просто проверка работы фильтра. В реалях, он естественно не будет обрабатываться FFT , поток сразу пойдет на ЦАП, а на экране будет панорама. попробовал 24кГц - спокойно влазит в такой прямоугольник. Можно и 48кГц отобразить. Всё это дела будущего.
Да да, я знаю, у меня ничего не получится )))

Оффлайн r1tx

  • Sr. Member
  • ****
  • Сообщений: 490
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #18 : Сентябрь 18, 2020, 04:48:07 pm »
ну тогда диагональ 7 нада :)

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #19 : Сентябрь 19, 2020, 11:47:46 am »
Вот такие возможности 2D ускорителя. Водопад через ДМА.
Медленно - это второстепенный поток.
Быстро - это если переключить вывод панорамы и водопада через основной поток (скоростной), но так делать нельзя, может не хватить ресурсов под i2s

видио:
https://youtu.be/vt87FsDzykc
Да да, я знаю, у меня ничего не получится )))

User

  • Гость
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #20 : Сентябрь 19, 2020, 12:22:57 pm »
Усреднение бы сделать

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #21 : Сентябрь 19, 2020, 01:10:57 pm »
Легко
Усреднение 4
Да да, я знаю, у меня ничего не получится )))

User

  • Гость
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #22 : Сентябрь 19, 2020, 01:16:22 pm »
На фото не поянтно что за столбы. Если будет время запишите видео  123123

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #23 : Октябрь 07, 2020, 09:23:45 pm »
РАСЧЕТ КОЭФФИЦИЕНТОВ для FIR фильтра с помощью весового окна

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

//расчет эквалайзера  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.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: FIR фильтр на С (без расчета коэф.)
« Ответ #24 : Октябрь 07, 2020, 09:24:15 pm »
еще

Окно Блэкмана — Харриса
Да да, я знаю, у меня ничего не получится )))