用法:
scipy.signal.czt(x, m=None, w=None, a=1 + 0j, *, axis=- 1)
计算 Z 平面中围绕螺旋的频率响应。
- x: 数组
要转换的信号。
- m: int 可选
所需的输出点数。默认是输入数据的长度。
- w: 复杂的,可选的
每个步骤中点之间的比率。这必须是精确的,否则累积的误差会降低输出序列的尾部。默认为围绕整个单位圆的等距点。
- a: 复杂的,可选的
复平面的起点。默认为 1+0j。
- axis: int 可选
计算 FFT 的轴。如果未给出,则使用最后一个轴。
- out: ndarray
一个与 x 维度相同的数组,但转换后的轴的长度设置为 m。
参数:
返回:
注意:
选择默认值使得
signal.czt(x)
等效于fft.fft(x)
,如果m > len(x)
,则signal.czt(x, m)
等效于fft.fft(x, m)
。如果需要重复转换,请使用
CZT
构造一个专门的转换函数,无需重新计算常量即可重复使用。一个示例应用是在系统识别中,反复评估系统的z-transform 的小片段,在预计存在极点的位置周围,以改进对极点真实位置的估计。 [1]
参考:
Steve Alan Shilling,“啁啾 z-transform 及其应用的研究”,第 20 页(1970 年)https://krex.k-state.edu/dspace/bitstream/handle/2097/7844/LD2668R41972S43.pdf
scipy.signal.czt:
例子:
生成正弦曲线:
>>> f1, f2, fs = 8, 10, 200 # Hz >>> t = np.linspace(0, 1, fs, endpoint=False) >>> x = np.sin(2*np.pi*t*f2) >>> import matplotlib.pyplot as plt >>> plt.plot(t, x) >>> plt.axis([0, 1, -1.1, 1.1]) >>> plt.show()
它的离散傅里叶变换将所有能量都放在一个频率仓中:
>>> from scipy.fft import rfft, rfftfreq >>> from scipy.signal import czt, czt_points >>> plt.plot(rfftfreq(fs, 1/fs), abs(rfft(x))) >>> plt.margins(0, 0.1) >>> plt.show()
但是,如果正弦曲线是logarithmically-decaying:
>>> x = np.exp(-t*f1) * np.sin(2*np.pi*t*f2) >>> plt.plot(t, x) >>> plt.axis([0, 1, -1.1, 1.1]) >>> plt.show()
DFT 会有频谱泄漏:
>>> plt.plot(rfftfreq(fs, 1/fs), abs(rfft(x))) >>> plt.margins(0, 0.1) >>> plt.show()
虽然 DFT 总是围绕单位圆对 z-transform 进行采样,但啁啾 z-transform 允许我们沿着任何对数螺旋对 Z-transform 进行采样,例如半径小于单位的圆:
>>> M = fs // 2 # Just positive frequencies, like rfft >>> a = np.exp(-f1/fs) # Starting point of the circle, radius < 1 >>> w = np.exp(-1j*np.pi/M) # "Step size" of circle >>> points = czt_points(M + 1, w, a) # M + 1 to include Nyquist >>> plt.plot(points.real, points.imag, '.') >>> plt.gca().add_patch(plt.Circle((0,0), radius=1, fill=False, alpha=.3)) >>> plt.axis('equal'); plt.axis([-1.05, 1.05, -0.05, 1.05]) >>> plt.show()
使用正确的半径,这可以在没有频谱泄漏的情况下转换衰减的正弦曲线(以及其他具有相同衰减率的曲线):
>>> z_vals = czt(x, M + 1, w, a) # Include Nyquist for comparison to rfft >>> freqs = np.angle(points)*fs/(2*np.pi) # angle = omega, radius = sigma >>> plt.plot(freqs, abs(z_vals)) >>> plt.margins(0, 0.1) >>> plt.show()
相关用法
- Python scipy.signal.czt_points用法及代码示例
- Python scipy.signal.correlate2d用法及代码示例
- Python scipy.signal.cont2discrete用法及代码示例
- Python scipy.signal.cheby2用法及代码示例
- Python scipy.signal.csd用法及代码示例
- Python scipy.signal.correlate用法及代码示例
- Python scipy.signal.convolve2d用法及代码示例
- Python scipy.signal.correlation_lags用法及代码示例
- Python scipy.signal.cspline1d用法及代码示例
- Python scipy.signal.check_COLA用法及代码示例
- Python scipy.signal.cmplx_sort用法及代码示例
- Python scipy.signal.choose_conv_method用法及代码示例
- Python scipy.signal.convolve用法及代码示例
- Python scipy.signal.cwt用法及代码示例
- Python scipy.signal.cheby1用法及代码示例
- Python scipy.signal.cheb2ord用法及代码示例
- Python scipy.signal.chirp用法及代码示例
- Python scipy.signal.cubic用法及代码示例
- Python scipy.signal.cspline1d_eval用法及代码示例
- Python scipy.signal.cheb1ord用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.signal.czt。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。