我无法将函数转换为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)
答案 0 :(得分:0)
您可能正在使用math
模块中的exp
函数,如math
module documentation
这些函数不能与复数一起使用;如果需要支持复数,请使用cmath模块中的同名函数。
因此,如建议的那样,您可以改用cmath.exp
。这样可以解决您在评估exp(j*w0)
时出现的当前错误。
不幸的是,在您发布的代码中,由于exp(j*w)
不支持数组参数(cmath.exp
也不支持),因此尝试计算数量math.exp
时会遇到另一个错误。要解决第二个错误,您可以可以创建一个数组并评估每个数组元素的指数,一次循环一次。
但是,由于您已经在使用numpy
,因此仅使用numpy.exp
就会简单得多。
还要调整T
和w
的计算以覆盖整个频谱,您应该获得以下信息:
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)