我正在尝试实现形式W(z)= N(z)/ D(z)的陷波滤波器,其中N = a + bz + cz ^ 2和D = 1 + Bz + Cz ^ 2。为此,我将第一个滤波器应用为直接三项卷积,然后将第二个滤波器应用为三项逆卷积。
要测试此过滤器,然后创建一个离散的delta函数并将其作为输入传递给该函数。
我用于过滤器和测试的代码如下:
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的结果应用于输出的结果。
答案 0 :(得分:0)
我不确定是什么让您认为同学的结果正确,而您的结果却不正确,但是看来您的实现所产生的结果与scipy.signal.lfilter
中具有相同输入的标准实现所产生的结果相同。
就|W(f)|
而言,z变换和np.fft.fft
之间的关系可以从以下观察得出:
np.fft.fft
计算)是一种有效的算法,用于计算离散傅立叶变换。因此,计算脉冲响应的FFT将为您提供离散频率值下该序列的频谱。在这种情况下,主要问题是由于滤波器的递归特性,脉冲响应的长度是无限的。因此,您需要确保考虑足够长的脉冲响应,以使截断误差可以忽略不计。
提示:作为替代方案,您应该考虑在评估N
的FFT与D
的FFT之比时会发生什么。