Скользящее среднее как фильтр низких частот.
Скользящее среднее как фильтр низких частот.
Здравствуйте. Для анализа я захватываю 2048 семплов с микрофона при частоте 44100. Примем, что диапазон инструмента на самой высокой ноте около 2500Гц.
Для удаления шумов и высших частот я планирую применить функцию скользящего среднего. Но их несколько - простое, треугольное, экспоненциальное и другие.
Как определить, какую ширину окна брать для фильтрации?
И обратная задача. Как можно узнать полученную ачх при заданной ширине окна?
Алгоритмы фильтров могу написать на си. Матлаба нет.
Для удаления шумов и высших частот я планирую применить функцию скользящего среднего. Но их несколько - простое, треугольное, экспоненциальное и другие.
Как определить, какую ширину окна брать для фильтрации?
И обратная задача. Как можно узнать полученную ачх при заданной ширине окна?
Алгоритмы фильтров могу написать на си. Матлаба нет.
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Скользящее среднее как фильтр низких частот.
скользящее окно ничто иное как фнч. Просто рассчитайте фнч с частотой среза 2500.44100 и используйте его.
Как рассчитать фильтр смотрите
эту статью, а также эту статью
Чтобы получить АЧХ фильтра необходимо взять модуль комплексного коэффициента передачи. Этот вопрос можно найти здесь.
Как рассчитать фильтр смотрите
эту статью, а также эту статью
Чтобы получить АЧХ фильтра необходимо взять модуль комплексного коэффициента передачи. Этот вопрос можно найти здесь.
Re: Скользящее среднее как фильтр низких частот.
Вот как использую.
Ширину окна задаю простым
Вызов функции
Функцию сделал так. Создаём второй буфер, скидываем в него расчёты, потом переносим в первый.
Скрин двух волн, с фильтром и без.
Ширину окна задаю простым
Код: Выделить всё
#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 (7.68 КБ) 14654 просмотра
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Скользящее среднее как фильтр низких частот.
Получение АЧХ фильтра без взятия модуля комплексного коэффициента передачи:
Можно взять тестовый ЛЧМ сигнал 20Гц-20кГц и оценить свой фильтр.
Можно взять тестовый ЛЧМ сигнал 20Гц-20кГц и оценить свой фильтр.
Последний раз редактировалось Santik 20 янв 2015, 10:03, всего редактировалось 1 раз.
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Скользящее среднее как фильтр низких частот.
Вот так, например:
Частота среза 130 Гц (по уровню 0.5)
Усреднение по 200 выборкам. Fd=44100 HzЧастота среза 130 Гц (по уровню 0.5)
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Скользящее среднее как фильтр низких частот.
Fп=Fd / M, где Fd - частота дискретизации, M- число выборок в окне усреднения.
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Скользящее среднее как фильтр низких частот.
Так что вроде бы фильтр получается, но параметры его оставляют желать лучшего
Может быть последовать совету Сергея Бахурина и выбрать более "крутой" фильтр?
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Скользящее среднее как фильтр низких частот.
Подход с использованием ЛЧМ-сигнала прост и нагляден, но если Вас интересуют полные характеристики фильтра, без расчета комплексной передаточной характеристики не обойтись.
Постараюсь на этом простом примере показать, как это можно сделать в данном случае.
В дальнейшем я буду пользоваться обозначениями, принятыми в статье:
"Дискретные сигналы. Преобразование Лапласа дискретного сигнала.
Z-преобразование. Разностное уравнение дискретного фильтра."
http://www.dsplib.ru/content/filters/ch9/ch9.html
Комплексная передаточная характеристика дискретного фильтра в общем виде:
а разностное уравнение дискретного фильтра:
Пусть скользящее среднее вычисляется по формуле:
Нетрудно заметить, что это КИХ-фильтр, т.к. в формуле отсутствуют .
Теперь легко написать выражение для комплексной передаточной характеристики фильтра скользящего среднего:
Подставив
окончательно получим:
Постараюсь на этом простом примере показать, как это можно сделать в данном случае.
В дальнейшем я буду пользоваться обозначениями, принятыми в статье:
"Дискретные сигналы. Преобразование Лапласа дискретного сигнала.
Z-преобразование. Разностное уравнение дискретного фильтра."
http://www.dsplib.ru/content/filters/ch9/ch9.html
Комплексная передаточная характеристика дискретного фильтра в общем виде:
а разностное уравнение дискретного фильтра:
Пусть скользящее среднее вычисляется по формуле:
Нетрудно заметить, что это КИХ-фильтр, т.к. в формуле отсутствуют .
Теперь легко написать выражение для комплексной передаточной характеристики фильтра скользящего среднего:
Подставив
окончательно получим:
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Скользящее среднее как фильтр низких частот.
Последнее выражение настолько элементарно, что без труда может быть посчитано без применения алгоритмических языков высокого уровня.
Я всё сделал в Microsoft Office Excel:
Пример расчёта АЧХ фильтра при М=11, Fd=44100
В архиве *.xlsx файл.
Я всё сделал в Microsoft Office Excel:
Пример расчёта АЧХ фильтра при М=11, Fd=44100
В архиве *.xlsx файл.
Re: Скользящее среднее как фильтр низких частот.
Ой Спасибо, конечно. Я решил взять самое простое и быстрое, т.к. расчёт должен идти в реальном времени.