当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python scipy.signal.czt用法及代码示例


用法:

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]

参考

scipy.signal.czt

Steve Alan Shilling,“啁啾 z-transform 及其应用的研究”,第 20 页(1970 年)https://krex.k-state.edu/dspace/bitstream/handle/2097/7844/LD2668R41972S43.pdf

例子

生成正弦曲线:

>>> 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()
scipy-signal-czt-1_00_00.png

它的离散傅里叶变换将所有能量都放在一个频率仓中:

>>> 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()
scipy-signal-czt-1_01_00.png

但是,如果正弦曲线是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()
scipy-signal-czt-1_02_00.png

DFT 会有频谱泄漏:

>>> plt.plot(rfftfreq(fs, 1/fs), abs(rfft(x)))
>>> plt.margins(0, 0.1)
>>> plt.show()
scipy-signal-czt-1_03_00.png

虽然 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()
scipy-signal-czt-1_04_00.png

使用正确的半径,这可以在没有频谱泄漏的情况下转换衰减的正弦曲线(以及其他具有相同衰减率的曲线):

>>> 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()
scipy-signal-czt-1_05_00.png

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.signal.czt。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。