用python求解freqz格式外的传递函数
我无法将函数转换为scipy FREKZ形式,因此我尝试直接用python进行求解,但无法将复数转换为浮点变量。错误的实现用python求解freqz格式外的传递函数,python,signal-processing,Python,Signal Processing,我无法将函数转换为scipy FREKZ形式,因此我尝试直接用python进行求解,但无法将复数转换为浮点变量。错误的实现 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.ex
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)
给出以下错误:
您可能正在使用
数学
模块中的函数,如
这些函数不能用于复数;如果需要支持复数,请使用cmath模块中相同名称的函数
因此,正如建议的那样,您可以使用。这将解决在计算exp(j*w0)
时出现的当前错误
不幸的是,对于您发布的代码,您将在尝试计算数量exp(j*w)
时遇到另一个错误,因为cmath.exp
不支持数组参数(顺便说一句,math.exp
)。要解决第二个错误,您可以创建一个数组,并对每个数组元素计算指数,每次一个循环。
但是,由于您已经在使用numpy
,因此只使用它会简单得多
同时调整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)
您可能正在使用
数学
模块中的函数,如
这些函数不能用于复数;如果需要支持复数,请使用cmath模块中相同名称的函数
因此,正如建议的那样,您可以使用。这将解决在计算exp(j*w0)
时出现的当前错误
不幸的是,对于您发布的代码,您将在尝试计算数量exp(j*w)
时遇到另一个错误,因为cmath.exp
不支持数组参数(顺便说一句,math.exp
)。要解决第二个错误,您可以创建一个数组,并对每个数组元素计算指数,每次一个循环。
但是,由于您已经在使用numpy
,因此只使用它会简单得多
同时调整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)