CZT#
- class scipy.signal.CZT(n, m=None, w=None, a=1 + 0j)[源代码]#
创建一个可调用的啁啾 Z 变换函数。
变换以计算螺旋周围的频率响应。此类的对象是可调用的,可以计算其输入上的啁啾 Z 变换。此对象预先计算给定变换中使用的恒定啁啾。
- 参数:
- nint
信号的大小。
- mint,可选
所需的输出点数。默认为 n。
- wcomplex,可选
每个步骤中点之间的比率。这必须是精确的,否则累积误差会降低输出序列的尾部。默认为整个单位圆周围等距的点。
- acomplex,可选
复平面中的起始点。默认为 1+0j。
- 返回:
- fCZT
用于计算 x 上的啁啾 Z 变换的可调用对象
f(x, axis=-1)
。
注释
选择默认值,使得
f(x)
等价于fft.fft(x)
,并且如果m > len(x)
,则f(x, m)
等价于fft.fft(x, m)
。如果 w 不在单位圆上,则变换将围绕半径呈指数增长的螺旋线进行。无论如何,角度将线性增加。
对于位于单位圆上的变换,使用
ZoomFFT
时精度更高,因为 w 中的任何数值误差都会在较长的数据长度上累积,从而偏离单位圆。啁啾 Z 变换可能比具有零填充的等效 FFT 快。尝试使用自己的数组大小来看看。
然而,啁啾 Z 变换的精度远低于等效的零填充 FFT。
由于此 CZT 是使用 Bluestein 算法实现的,因此它可以在 O(N log N) 时间内计算大型素数长度傅里叶变换,而不是直接 DFT 计算所需的 O(N**2) 时间。(
scipy.fft
也使用 Bluestein 算法。)(“啁啾 Z 变换”的名称源于在 Bluestein 算法中使用啁啾。它不会像其他名称中带有“啁啾”的变换一样将信号分解为啁啾。)
参考文献
[1]Leo I. Bluestein,“用于计算离散傅里叶变换的线性滤波方法”,东北电子研究与工程会议记录 10, 218-219 (1968)。
[2]Rabiner、Schafer 和 Rader,“啁啾 Z 变换算法及其应用”,贝尔系统技术杂志 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()
方法
__call__
(x, *[, axis])计算信号的啁啾 Z 变换。
points
()返回计算啁啾 Z 变换的点。