我试图在scipy.signal中添加所有窗口函数的文档,并且卡在Slepian(与DPSS相同?)和General Gaussian窗口中,这是我以前从未听说过的。

有两个变量是某种类型的形状参数,广义高斯模型中的p和Slepian模型中的width。 (sig似乎是sigma,是标准偏差。)2个问题:

您能解释这些窗口的用途或用途吗?



def general_gaussian(M, p, sig, sym=True):
    """Return a window with a generalized Gaussian shape.

    The Gaussian shape is defined as ``exp(-0.5*(x/sig)**(2*p))``, the
    half-power point is at ``(2*log(2)))**(1/(2*p)) * sig``.

    """
    if M < 1:
        return np.array([])
    if M == 1:
        return np.ones(1, 'd')
    odd = M % 2
    if not sym and not odd:
        M = M + 1
    n = np.arange(0, M) - (M - 1.0) / 2.0
    w = np.exp(-0.5 * (n / sig) ** (2 * p))
    if not sym and not odd:
        w = w[:-1]
    return w

def slepian(M, width, sym=True):
    """Return the M-point slepian window.

    """
    if (M * width > 27.38):
        raise ValueError("Cannot reliably obtain slepian sequences for"
              " M*width > 27.38.")
    if M < 1:
        return np.array([])
    if M == 1:
        return np.ones(1, 'd')
    odd = M % 2
    if not sym and not odd:
        M = M + 1

    twoF = width / 2.0
    alpha = (M - 1) / 2.0
    m = np.arange(0, M) - alpha
    n = m[:, np.newaxis]
    k = m[np.newaxis, :]
    AF = twoF * special.sinc(twoF * (n - k))
    [lam, vec] = linalg.eig(AF)
    ind = np.argmax(abs(lam), axis=-1)
    w = np.abs(vec[:, ind])
    w = w / max(w)

    if not sym and not odd:
        w = w[:-1]
    return w


可能的匹配项:

nipy的dpss_windows函数使用NW,即“对应于2NW = BW * f0 = BW * N / dt但dt为1的标准化半带宽”

Matlab的DPS使用time_halfbandwidth这是同一窗口吗? time_halfbandwidthwidth是相同的东西吗?

该DPSS定义具有$ \ omega_c $“所需的主瓣截止频率(以弧度每秒为单位)”。

广义范式分布具有β(等于p?的两倍),被称为形状参数,β= 1的正态分布,β= 2的拉普拉斯分布。

评论

FWIW我似乎记得DPSS与Kaiser窗口相同(或极其相似)。对不起,我得到的全部。 :-)

@Mohammad:Kaiser窗口是DPSS的近似值,我认为因为真正的DPSS在计算上昂贵? zh.wikipedia.org/wiki/Window_function#Kaiser_windows

DPSS是设计有约束优化的窗口,约束是主瓣的可容忍宽度。实际上,相对于固定的主瓣能量,它使主瓣(旁瓣)外部的能量最小化。我在家中(出差的地方)有一本好书,因此我可以写出一个更好的答案,值得我在评论时发表,但这是最基本的。

#1 楼

Slepian序列是一个函数族。对于给定的NW,大多数算法会一次计算2 * NW-1个序列。 N是序列中的点数,W决定了给定Slepian序列的傅里叶变换在频域中主瓣宽度的一半。通常,您将使用3或4的NW进行信号处理。

在scipy中,他们要求$ N $(Python代码中的m)和$ W $(宽度中的在Matlab中,您需要分别输入时间带宽乘积$ NW $作为单个参数。这是有道理的,因为您通常是针对固定窗口大小$ N $计算Slepian序列。

如果要估计固定时间序列的功率谱,则DPSS是您要设置的窗口应该使用。

广义的高斯函数返回一个类似p的高斯函数,该函数根据p参数依次提高到更高的幂。随着p依次提高到更高的幂,广义高斯在时域上变得更窄。高斯的一个很好的特性是它是它自己的傅里叶变换,并且是达到关于不确定性原理的极限的函数。如果您想计算短期傅立叶变换或频谱图作为非平稳时间序列随时间变化的功率谱的估计量,那么高斯函数可能会很有用。

评论


$ \ begingroup $
“高斯的一个不错的特性是它是它自己的傅立叶变换”不过,只有p = 1才对,对吧?
$ \ endgroup $
– Endolith
2012年10月25日15:47

$ \ begingroup $
我不确定对称是否仅适用于p = 1。也许有人可以计算出广义高斯(GG)的FT。在Wolfram Mathworld上查看高斯FT的推导mathworld.wolfram.com/FourierTransformGaussian.html。通过相同的论点,我们可以摆脱GG积分的虚部。不过,我不确定如何评估$ \ int _ {-\ infty} ^ {\ infty} e ^ {-ax ^ {2p}} cos(2 \ pi kx)dx $
$ \ endgroup $
–ncRubert
2012年10月25日17:43

#2 楼

反对GG的一个例子就是它自己的转换。 p = 0.5给出了普通的背对背指数,其转换为2a /(s ^ 2 + a ^ 2)。对于DC块,它是。在频域Fdcx(w)= 1-F(w)。这将使直流附近的抑制比与直流附近的w在当前通带中变得未优化。因此,我只会为此使用Dolph来使宽带通带变得相等的波纹。

这是冲动,减去了时域中的原始窗口函数。冲动有多大?

警告,偶数长度的序列在奈奎斯特频率下强制为零,因此您要避免这种情况。

#3 楼

GG的傅立叶变换也是高斯的。使用卷积定理,FT(高斯\乘以高斯)= FT(高斯)\ conv FT(高斯)=高斯\ conv高斯=高斯。希望能有所帮助!

评论


$ \ begingroup $
这是广义的高斯,而不是常规的高斯。这不是自己的转变。查看图片:docs.scipy.org/doc/scipy/reference/generated/…
$ \ endgroup $
– Endolith
2013年10月7日15:30