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

问题描述 投票:1回答:1

我无法将函数转换为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)
python signal-processing
1个回答
0
投票

您可能正在使用exp模块中的math函数,如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)
© www.soinside.com 2019 - 2024. All rights reserved.