cupyx.scipy.signal.windows.blackman#

cupyx.scipy.signal.windows.blackman(M, sym=True)[源码]#

返回一个 Blackman 窗。

Blackman 窗是一个由前三个余弦项之和形成的锥形函数。它被设计用来尽可能减少频谱泄漏。它接近最优,仅略逊于 Kaiser 窗。

参数:
  • M (int) – 输出窗的点数。如果为零或更小,则返回一个空数组。

  • sym (bool, 可选) – 当为 True(默认)时,生成对称窗,用于滤波器设计。当为 False 时,生成周期窗,用于频谱分析。

返回值:

w – 窗函数,其最大值归一化为 1(但如果 M 为偶数且 sym 为 True,则值 1 不会出现)。

返回类型:

ndarray

说明

Blackman 窗的定义如下:

\[w(n) = 0.42 - 0.5 \cos(2\pi n/M) + 0.08 \cos(4\pi n/M)\]

“精确 Blackman”窗被设计用于消除第三和第四个旁瓣,但在边界处存在不连续性,导致衰减率为 6 dB/倍频程。此窗是“精确”窗的近似,它未能很好地消除旁瓣,但在边缘处平滑,将衰减率提高到 18 dB/倍频程。[3]

关于 Blackman 窗的大多数参考文献来自信号处理文献,其中它被用作许多窗函数之一来平滑数值。它也被称为 apodization(意思是“移除脚部”,即平滑采样信号开始和结束时的不连续性)或 tapering 函数(锥化函数)。它被认为是“近乎最优”的锥化函数,(在某些衡量标准下)几乎与 Kaiser 窗一样好。

更多信息请参见 [1][2][3]

参考文献

示例

绘制窗函数及其频率响应

>>> from cupyx.scipy.signal import blackman
>>> import cupy as cp
>>> from cupy.fft import fft, fftshift
>>> import matplotlib.pyplot as plt
>>> window = blackman(51)
>>> plt.plot(cupy.asnumpy(window))
>>> plt.title("Blackman window")
>>> plt.ylabel("Amplitude")
>>> plt.xlabel("Sample")
>>> plt.figure()
>>> A = fft(window, 2048) / (len(window)/2.0)
>>> freq = cupy.linspace(-0.5, 0.5, len(A))
>>> response = cupy.abs(fftshift(A / cupy.abs(A).max()))
>>> response = 20 * cupy.log10(cupy.maximum(response, 1e-10))
>>> plt.plot(cupy.asnumpy(freq), cupy.asnumpy(response))
>>> plt.axis([-0.5, 0.5, -120, 0])
>>> plt.title("Frequency response of the Blackman window")
>>> plt.ylabel("Normalized magnitude [dB]")
>>> plt.xlabel("Normalized frequency [cycles per sample]")