scipy.signal.

CZT#

class scipy.signal.CZT(n, m=None, w=None, a=1 + 0j)[source]#

创建一个可调用的啁啾 z 变换函数。

转换在螺旋周围计算频率响应。此类的对象是可调用的,可以在其输入上计算啁啾 z 变换。此对象预先计算给定变换中使用的常数啁啾。

参数:
nint

信号大小。

mint,可选

所需的输出点数量。默认为n

w复数,可选

每个步骤中各点之间的比率。此项必须准确,否则积累的误差将降低输出序列的尾部。默认为整个单位圆上等间隔的点。

a复数,可选

复数平面的起始点。默认为 1+0j。

返回:
fCZT

可调用对象 f(x, axis=-1) 用于计算x 上的啁啾 z 变换。

另请参见

czt

快速计算 CZT 的便捷函数。

ZoomFFT

创建一个可调用部分 FFT 函数的类。

注意事项

默认值被选择为代码 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()
../../_images/scipy-signal-CZT-1.png

方法

__call__(x, *[, axis])

计算信号的啁啾 z 变换。

points()

返回计算啁啾 z 变换的点。