КИХ-фильтрация с использованием оконной функции: проблема реализации - PullRequest
1 голос
/ 09 июня 2011

Я хочу сделать FIR-фильтр, используя оконную функцию.У меня есть некоторые данные выборки, а переменная size - это количество выборок.Переменная windowSize является размером оконной функции.Сначала я создаю оконную функцию (окно blackman): переменная window Затем мне нужно умножить ее на функцию sin (x) / x и свернуть с реальными данными (переменная data ):

for (int i = 0; i < size; ++i) {
for (j = 0; j < windowSize; ++j) {
    double arg = 2.0 * PI * ((double)j - (double)windowSize / 2.0) / (double)windowSize;
    if (i + j - windowSize / 2 < 0)
       continue;
    if (arg == 0) {
    filteredData[i] += data[i + j - windowSize / 2] * window[j] * 1.0 /  (double)windowSize;
    } else
        filteredData[i] += data[i + j - windowSize / 2] * window[j] * (sin(arg) / arg) / (double)windowSize;
    }
}

Проблема:

  1. В результате я получаю отфильтрованные данные со средним значением, которое сильно отличается от среднего значения исходных данных.Где ошибка?

  2. В книге DSP написано, что для создания КИХ-фильтра мы должны умножить функцию sin (x) / x на оконную функцию, а затем выполнитьсвертка, но ничего не написано о x в sin (x) / x , поэтому я использовал:

    double arg = 2.0 * PI * ((double) j - (double) windowSize / 2.0) / (double) windowSize;

для значения x , аргумент синуса, это правильно?

Ответы [ 2 ]

4 голосов
/ 09 июня 2011

Фильтр sin(x)/x является фильтром нижних частот. То есть он подавляет все частоты выше определенной частоты среза .

Если частота дискретизации равна Fs (Герц), и вы хотите, чтобы частота среза составляла fc (Герц), вам следует использовать x = 2*PI*fc/(2*Fs)*n, где n изменяется от -N до +N и N достаточно большой, чтобы функция sin (x) / x была близка к нулю. Не забывайте, что sin (x) / x равен 1, когда x равен нулю.

Чтобы сохранить среднее сигнала, вы должны нормализовать коэффициенты фильтра по их сумме. То есть, установите f_norm [k] = f [k] / sum (f [k], k = ...)

Это все, что я должен сказать на данный момент. Кажется, тебе есть чему поучиться. Предлагаю хорошую книгу по обработке сигналов.

1 голос
/ 09 июня 2011

Что касается реализации, похоже, вам нужно инициализировать filteredData[i], например,

for (int i = 0; i < size; ++i) {
    filteredData[i] = 0;
    for (j = 0; j < windowSize; ++j) {
        ...
...