Скользящее среднее как фильтр низких частот.

Все что касается фильтрации
Rem
Сообщения: 34
Зарегистрирован: 13 май 2014, 20:20

Скользящее среднее как фильтр низких частот.

Сообщение Rem »

Здравствуйте. Для анализа я захватываю 2048 семплов с микрофона при частоте 44100. Примем, что диапазон инструмента на самой высокой ноте около 2500Гц.
Для удаления шумов и высших частот я планирую применить функцию скользящего среднего. Но их несколько - простое, треугольное, экспоненциальное и другие.
Как определить, какую ширину окна брать для фильтрации?
И обратная задача. Как можно узнать полученную ачх при заданной ширине окна?
Алгоритмы фильтров могу написать на си. Матлаба нет.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1116
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Скользящее среднее как фильтр низких частот.

Сообщение Бахурин Сергей »

скользящее окно ничто иное как фнч. Просто рассчитайте фнч с частотой среза 2500.44100 и используйте его.
Как рассчитать фильтр смотрите
эту статью, а также эту статью

Чтобы получить АЧХ фильтра необходимо взять модуль комплексного коэффициента передачи. Этот вопрос можно найти здесь.

Rem
Сообщения: 34
Зарегистрирован: 13 май 2014, 20:20

Re: Скользящее среднее как фильтр низких частот.

Сообщение Rem »

Вот как использую.
Ширину окна задаю простым

Код: Выделить всё

#define WINDOWMA (10)
Вызов функции

Код: Выделить всё

SimpleMA( sampleBlock, FRAMES_PER_BUFFER, WINDOWMA); // фильтр скользящее среднее
Функцию сделал так. Создаём второй буфер, скидываем в него расчёты, потом переносим в первый.

Код: Выделить всё

void SimpleMA(float *buf_1, int buf_size, int window)
{
    int i;
    float buf_2[buf_size];
    float sum=0;
    // начальные данные
    for (i=0; i<window; i++)
    {
        sum+=buf_1[i];
        buf_2[i]=sum/(i+1);
    }
    //основной буфер
    for (i=window; i<buf_size; i++)
    {
        sum-=buf_1[i-window]; // рекурентно, вычитаем старое значение
        sum+=buf_1[i]; // прибавляем новое
        buf_2[i]=sum/window;
    }

    for (i=0; i<buf_size; i++) buf_1[i]=buf_2[i];
    return;
}
Скрин двух волн, с фильтром и без.
Вложения
2015-01-18 18 13 30.png
2015-01-18 18 13 30.png (7.68 КБ) 14668 просмотров

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Скользящее среднее как фильтр низких частот.

Сообщение Santik »

Получение АЧХ фильтра без взятия модуля комплексного коэффициента передачи:
:D
Можно взять тестовый ЛЧМ сигнал 20Гц-20кГц и оценить свой фильтр.
Последний раз редактировалось Santik 20 янв 2015, 10:03, всего редактировалось 1 раз.

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Скользящее среднее как фильтр низких частот.

Сообщение Santik »

Вот так, например:
Фильтр.JPG
Усреднение по 200 выборкам. Fd=44100 Hz
Частота среза 130 Гц (по уровню 0.5)

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Скользящее среднее как фильтр низких частот.

Сообщение Santik »

Фильтр2.JPG
Наиболее просто рассчитать первую частоту максимального подавления :
Fп=Fd / M, где Fd - частота дискретизации, M- число выборок в окне усреднения.

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Скользящее среднее как фильтр низких частот.

Сообщение Santik »

Фильтр3.JPG
При М=20 частота среза фильтра (по уровню -6 дБ) получилась 1300 Гц.
Так что вроде бы фильтр получается, но параметры его оставляют желать лучшего :cry:
Может быть последовать совету Сергея Бахурина и выбрать более "крутой" фильтр?

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Скользящее среднее как фильтр низких частот.

Сообщение Santik »

Подход с использованием ЛЧМ-сигнала прост и нагляден, но если Вас интересуют полные характеристики фильтра, без расчета комплексной передаточной характеристики не обойтись.
Постараюсь на этом простом примере показать, как это можно сделать в данном случае.
В дальнейшем я буду пользоваться обозначениями, принятыми в статье:
"Дискретные сигналы. Преобразование Лапласа дискретного сигнала.
Z-преобразование. Разностное уравнение дискретного фильтра."
http://www.dsplib.ru/content/filters/ch9/ch9.html
Комплексная передаточная характеристика дискретного фильтра в общем виде:

а разностное уравнение дискретного фильтра:


Пусть скользящее среднее вычисляется по формуле:


Нетрудно заметить, что это КИХ-фильтр, т.к. в формуле отсутствуют .






Теперь легко написать выражение для комплексной передаточной характеристики фильтра скользящего среднего:

Подставив

окончательно получим:

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: Скользящее среднее как фильтр низких частот.

Сообщение Santik »

Последнее выражение настолько элементарно, что без труда может быть посчитано без применения алгоритмических языков высокого уровня. :D
Я всё сделал в Microsoft Office Excel:

Пример расчёта АЧХ фильтра при М=11, Fd=44100
Скользящее среднее.JPG
В архиве *.xlsx файл.
Скользящее среднее.rar
(36.64 КБ) 689 скачиваний

Rem
Сообщения: 34
Зарегистрирован: 13 май 2014, 20:20

Re: Скользящее среднее как фильтр низких частот.

Сообщение Rem »

Ой :) Спасибо, конечно. Я решил взять самое простое и быстрое, т.к. расчёт должен идти в реальном времени.

Ответить