scipy.signal.

ZoomFFT#

class scipy.signal.ZoomFFT(n, fn, m=None, *, fs=2, endpoint=False)[source]#

创建一个可调用的变焦FFT变换函数。

这是啁啾Z变换 (CZT) 的一个特例,用于计算单位圆上等间距频率的子集,比计算整个 FFT 再截断更有效地计算 FFT 的一个部分。

参数:
nint

信号的大小。

fnarray_like

一个长度为2的序列 [f1, f2] 给定频率范围,或者一个标量,此时假定范围为 [0, fn]。

mint, optional

要评估的点数。默认值为 n

fsfloat, optional

采样频率。例如,如果 fs=10 代表 10 kHz,那么 f1f2 也应以 kHz 为单位给出。默认采样频率为 2,因此 f1f2 应在 [0, 1] 范围内,以使变换保持在奈奎斯特频率以下。

endpointbool, optional

如果为 True,f2 是最后一个采样点。否则,不包含它。默认值为 False。

方法

__call__(x, *[, axis])

计算信号的啁啾 Z 变换。

points()

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

返回:
fZoomFFT

可调用对象 f(x, axis=-1),用于对 x 进行变焦 FFT 计算。

另请参阅

zoom_fft

计算变焦 FFT 的便捷函数。

备注

选择默认值是为了使 f(x, 2) 等效于 fft.fft(x),并且如果 m > len(x),则 f(x, 2, m) 等效于 fft.fft(x, m)

采样频率是 1/dt,即信号 x 中采样点之间的时间步长。单位圆对应于从 0 到采样频率的频率。默认采样频率为 2 意味着 f1, f2 值在奈奎斯特频率以下,即在 [0, 1) 范围内。对于以弧度表示的 f1, f2 值,应使用 2*pi 的采样频率。

请记住,变焦 FFT 只能插值现有 FFT 的点。它无法帮助分辨两个分离的邻近频率。频率分辨率只能通过增加采集时间来提高。

这些函数是使用 Bluestein 算法实现的 (与 scipy.fft 相同)。[2]

参考文献

[1]

Steve Alan Shilling, “A study of the chirp z-transform and its applications”, pg 29 (1970) https://krex.k-state.edu/dspace/bitstream/handle/2097/7844/LD2668R41972S43.pdf

[2]

Leo I. Bluestein, “A linear filtering approach to the computation of the discrete Fourier transform,” Northeast Electronics Research and Engineering Meeting Record 10, 218-219 (1968).

示例

要绘制变换结果,请使用如下代码:

>>> import numpy as np
>>> from scipy.signal import ZoomFFT
>>> t = np.linspace(0, 1, 1021)
>>> x = np.cos(2*np.pi*15*t) + np.sin(2*np.pi*17*t)
>>> f1, f2 = 5, 27
>>> transform = ZoomFFT(len(x), [f1, f2], len(x), fs=1021)
>>> X = transform(x)
>>> f = np.linspace(f1, f2, len(x))
>>> import matplotlib.pyplot as plt
>>> plt.plot(f, 20*np.log10(np.abs(X)))
>>> plt.show()
../../_images/scipy-signal-ZoomFFT-1.png