CZT#
- class scipy.signal.CZT(n, m=None, w=None, a=1 + 0j)[源代码][源代码]#
创建一个可调用的chirp z变换函数。
转换以计算螺旋周围的频率响应。此类对象是可调用的,可以在其输入上计算啁啾z变换。此对象预先计算给定变换中使用的恒定啁啾。
- 参数:
- n整数
信号的大小。
- mint, 可选
所需的输出点数量。默认值为 n。
- w复杂,可选
每个步骤中点之间的比率。这必须精确,否则累积误差将降低输出序列的尾部。默认在整个单位圆上等间距分布点。
- a复杂,可选
复平面中的起点。默认值为 1+0j。
方法
- 返回:
- fCZT
可调用对象
f(x, axis=-1)
用于计算 x 上的 chirp z-变换。
注释
默认设置使得
f(x)
等同于fft.fft(x)
,并且,如果m > len(x)
,那么f(x, m)
等同于 ``fft.fft(x, m)`。如果 w 不在单位圆上,那么变换将围绕一个半径呈指数增长的螺旋进行。无论如何,角度将线性增加。
对于那些确实位于单位圆上的变换,使用
ZoomFFT
时精度会更好,因为 w 中的任何数值误差都会在长数据长度上累积,从而偏离单位圆。chirp z-变换可以比带有零填充的等效FFT更快。尝试使用您自己的数组大小来查看效果。
然而,chirp z-变换的精度明显低于等效的零填充FFT。
由于此CZT是使用Bluestein算法实现的,它可以在O(N log N)时间内计算大素数长度的傅里叶变换,而不是直接DFT计算所需的O(N**2)时间。(`scipy.fft`也使用了Bluestein算法。)
(“chirp z-transform” 这个名字来源于 Bluestein 算法中使用的 chirp。它不像其他名字中带有“chirp”的变换那样将信号分解为 chirp。)
参考文献
[1]Leo I. Bluestein, “一种线性滤波方法用于计算离散傅里叶变换,” Northeast Electronics Research and Engineering Meeting Record 10, 218-219 (1968).
[2]Rabiner, Schafer, 和 Rader, “The chirp z-transform algorithm and its application,” Bell Syst. Tech. J. 48, 1249-1292 (1969).
示例
计算多个质数长度的FFT:
>>> from scipy.signal import CZT >>> import numpy as np >>> a = np.random.rand(7) >>> b = np.random.rand(7) >>> c = np.random.rand(7) >>> czt_7 = CZT(n=7) >>> A = czt_7(a) >>> B = czt_7(b) >>> C = czt_7(c)
显示FFT计算的点:
>>> czt_7.points() array([ 1.00000000+0.j , 0.62348980+0.78183148j, -0.22252093+0.97492791j, -0.90096887+0.43388374j, -0.90096887-0.43388374j, -0.22252093-0.97492791j, 0.62348980-0.78183148j]) >>> import matplotlib.pyplot as plt >>> plt.plot(czt_7.points().real, czt_7.points().imag, 'o') >>> plt.gca().add_patch(plt.Circle((0,0), radius=1, fill=False, alpha=.3)) >>> plt.axis('equal') >>> plt.show()