使用python解决freqz格式以外的传递函数

时间:2019-02-20 18:22:40

标签: python signal-processing

我无法将函数转换为scipy freqz形式,因此我尝试直接在python中求解,但无法将复数转换为float变量。实施错误?

T = 1/(0.0001)
w_0 = m.pi/2
w = np.arange(-.005, .005, T)
j= 1j
h_num = 1-m.exp(j*w_0)-m.exp(-j*w_0)-2*m.exp(-j*w)+m.exp(-2*j*w)
h_den = 1-(0.9)*m.exp(j*w_0)-(0.9)*m.exp(-j*w_0)-(1.8)*m.exp(-j*w)+(0.81)*m.exp(-2*j*w)
mag = abs(h_num/h_den)
phase = np.angle(h_num)-np.angle(h_den)

给出以下错误:

TypeError: can't convert complex to float on the exp(j*w_0)

1 个答案:

答案 0 :(得分:0)

您可能正在使用math模块中的exp函数,如math module documentation

中所述
  

这些函数不能与复数一起使用;如果需要支持复数,请使用cmath模块中的同名函数。

因此,如建议的那样,您可以改用cmath.exp。这样可以解决您在评估exp(j*w0)时出现的当前错误。

不幸的是,在您发布的代码中,由于exp(j*w)不支持数组参数(cmath.exp也不支持),因此尝试计算数量math.exp时会遇到另一个错误。要解决第二个错误,您可以可以创建一个数组并评估每个数组元素的指数,一次循环一次。 但是,由于您已经在使用numpy,因此仅使用numpy.exp就会简单得多。

还要调整Tw的计算以覆盖整个频谱,您应该获得以下信息:

T = 0.0001
w_0 = np.pi/2
w = np.arange(-np.pi, np.pi, T)
j= 1j
h_num = 1-np.exp(j*w_0)-np.exp(-j*w_0)-2*np.exp(-j*w)+np.exp(-2*j*w)
h_den = 1-(0.9)*np.exp(j*w_0)-(0.9)*np.exp(-j*w_0)-(1.8)*np.exp(-j*w)+(0.81)*np.exp(-2*j*w)
mag = abs(h_num/h_den)
phase = np.angle(h_num)-np.angle(h_den)

请注意,scipy.freqz的相应计算如下所示:

b = [1-np.exp(j*w_0)-np.exp(-j*w_0), -2, 1]
a = [1-0.9*np.exp(j*w_0)-0.9*np.exp(-j*w_0), -1.8, 0.81]
w, h = freqz(b, a, whole=True)
mag = abs(h)
phase = np.angle(h)