Импульсный отклик режекторного фильтра - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь реализовать режекторный фильтр формы W (z) = N (z) / D (z) для назначения, где N = a + bz + cz ^ 2 и D = 1 + Bz + Cz^ 2.Для этого я применяю первый фильтр как прямую 3-кратную свертку, а затем второй фильтр как трехсимвольную обратную свертку.

Чтобы проверить этот фильтр, я затем создаю дискретную дельта-функцию и передаю ее в функцию в качестве входа.

Код, который я использую для своего фильтра и моего теста, выглядит следующим образом:

import numpy as np
import matplotlib.pyplot as plt

fs=12
f0=1
M=1.05
epsilon = 0.05

# Define rational filter:
def ratFilter(N, D, x):
    '''
    Apply two filters in succession to x
    :param N: 3-tuple parameters for numerator filter
    :param D: 3-tuple parameters for denominator inverse filter
    :param x:
    :return: y
    '''
    y = np.zeros(np.size(x))
    n = np.zeros(np.size(x)+np.size(D)) #middle value
    # apply first filter:
    for i in range(np.size(n)):
        for k in range(0, i+1):
            try:
                n[i]+=N[k]*x[i-k]
            except:
                pass
    for i in range(np.size(y)):
        y[i]=n[i]/D[0]
        for k in range(1, i+1):
            try:
                y[i]-=D[k]/D[0]*y[i-k]
            except:
                pass
    return y

# Impulse response:
delta = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

N = [0.952, -1.650, 0.952]
D = [1, -1.650, 0.907]

output = ratFilter(N, D, delta)

plt.plot(output)
plt.title("impulse response")
plt.show()

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

Выходимпульсный отклик:

enter image description here

Необходимо еще кое-что сделать - преобразовать импульсный отклик по Фурье для получения частотного отклика | W (f) |, ноИнтуитивно я сомневаюсь в связи между преобразованием Фурье и преобразованием z, и, следовательно, существует ли какая-либо специальная процедура, в отличие от принятия любого результата из np.fft.fft применительно к выводу.

1 Ответ

0 голосов
/ 21 марта 2019

Я не уверен, что заставляет вас думать, что результаты ваших одноклассников верны, а ваши нет, но похоже, что ваша реализация дает те же результаты, что и стандартная реализация из scipy.signal.lfilter с одни и те же входы.

Что касается |W(f)|, связь между z-преобразованием и np.fft.fft может быть получена из следующих наблюдений:

Таким образом, вычисление БПФ вашей импульсной характеристики даст вам частотный спектр этой последовательности при дискретных значениях частоты. Основная проблема в этом случае заключается в том, что из-за рекурсивного характера вашего фильтра импульсная характеристика имеет бесконечную длину. Итак, вам нужно убедиться, что вы учитываете достаточно длинную часть импульсного отклика, чтобы ошибка усечения была незначительной.

Подсказка : в качестве альтернативы следует учитывать, что происходит при оценке соотношения БПФ N и БПФ D.

...