Вопрос

Программы для редактирования и обработки графики и аудио часто содержат функции, называемые "Фильтр верхних частот" и "Фильтр нижних частот".Что именно они делают и каковы алгоритмы их реализации?

Это было полезно?

Решение

Википедия:

Эти термины "высокий", "низкий" и "диапазон" относятся к частоты.При высоких частотах вы пытаетесь убрать низкие частоты.При низких частотах вы пытаетесь убрать высокие.В режиме band pass вы сохраняете только непрерывный частотный диапазон.

Выбор частоты среза зависит от вашего применения.Кодирование этих фильтров может быть выполнено либо путем моделирования RC-схем, либо путем игры с преобразованиями Фурье ваших временных данных.Примеры кода смотрите в статьях Википедии.

Другие советы

Вот как вы реализуете фильтр нижних частот с помощью свертки:

double[] signal = (some 1d signal);
double[] filter = [0.25 0.25 0.25 0.25]; // box-car filter
double[] result = new double[signal.Length + filter.Length + 1];

// Set result to zero:
for (int i=0; i < result.Length; i++) result[i] = 0;

// Do convolution:
for (int i=0; i < signal.Length; i++) 
  for (int j=0; j < filter.Length; j++)
    result[i+j] = result[i+j] + signal[i] * filter[j];

Обратите внимание, что пример чрезвычайно упрощен. Это не делает проверки диапазона и не обрабатывает края должным образом. Используемый фильтр (box-car) является особенно плохим фильтром нижних частот, потому что он вызовет много артефактов (звон). Ознакомьтесь с дизайном фильтра.

Вы также можете реализовать фильтры в частотной области. Вот как вы реализуете фильтр верхних частот, используя FFT:

double[] signal = (some 1d signal);
// Do FFT:
double[] real;
double[] imag;
[real, imag] = fft(signal)

// Set the first quarter of the real part to zero to attenuate the low frequencies
for (int i=0; i < real.Length / 4; i++) 
  real[i] = 0;

// Do inverse FFT:
double[] highfrequencysignal = inversefft(real, imag);

Опять же, это упрощено, но вы поняли идею. Код выглядит не так сложно, как математика.

Обычно это электрические цепи, которые обычно пропускают части аналоговых сигналов. Высокие частоты имеют тенденцию передавать больше высокочастотных частей, а низкие частоты имеют тенденцию пропускать больше низкочастотных частей.

Они могут быть смоделированы в программном обеспечении. Например, скользящее среднее может действовать как фильтр низких частот, а разница между скользящим средним и его входом может работать как фильтр высоких частот.

Фильтр

High-pass позволяет высокой -частоте (подробная / локальная информация) проходить .
Фильтр нижних частот позволяет низкой -частоте (грубая / грубая / глобальная информация) проходить .

Фильтрация описывает процесс обработки данных способом, который применяет различные уровни ослабления к различным частотам в данных.

Фильтр верхних частот будет применять минимальное затухание (т.е. оставлять уровни неизменными) для высоких частот, но применяет максимальное затухание к низким частотам.

Фильтр нижних частот работает наоборот - он не применяет затухание к низким частотам, применяя затухание к высоким частотам.

Существует несколько различных алгоритмов фильтрации. Двумя простейшими являются, вероятно, фильтр с конечной импульсной характеристикой (также известный как КИХ-фильтр) и фильтр с бесконечной импульсной характеристикой (также известный как БИХ-фильтр).

КИХ-фильтр работает, сохраняя последовательность выборок и умножая каждую из этих выборок на фиксированный коэффициент (который основан на положении в серии). Результаты каждого из этих умножений накапливаются и являются выходными данными для этого образца. Это называется Multiply-Accumulate - и в выделенном оборудовании DSP для этого есть специальная инструкция MAC.

Когда берется следующий образец, он добавляется в начало серии, а самый старый образец в серии удаляется, и процесс повторяется.

Поведение фильтра фиксируется выбором коэффициентов фильтра.

Одним из самых простых фильтров, который часто предоставляется программным обеспечением для обработки изображений, является фильтр усреднения. Это можно реализовать с помощью КИХ-фильтра, установив все коэффициенты фильтра на одно и то же значение.

Вот очень простой пример фильтра нижних частот в C ++, который обрабатывает сигнал по одной выборке за раз:

float lopass(float input, float cutoff) {
 lo_pass_output= outputs[0]+ (cutoff*(input-outputs[0])); 
outputs[0]= lo_pass_output;
return(lo_pass_output);
}

Здесь в значительной степени то же самое, за исключением того, что это высокий проход:

float hipass(float input, float cutoff) {
 hi_pass_output=input-(outputs[0] + cutoff*(input-outputs[0]));
 outputs[0]=hi_pass_output;
 return(hi_pass_output);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top