Я пытаюсь реализовать режекторный фильтр формы 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()
Полученный график имеет следующую форму, и я считаю, что он неправильный, поскольку у других моих знакомых наблюдается резкий всплеск вверх в начале, сопровождаемый линейным увеличением:
Выходимпульсный отклик:
Необходимо еще кое-что сделать - преобразовать импульсный отклик по Фурье для получения частотного отклика | W (f) |, ноИнтуитивно я сомневаюсь в связи между преобразованием Фурье и преобразованием z, и, следовательно, существует ли какая-либо специальная процедура, в отличие от принятия любого результата из np.fft.fft применительно к выводу.