关于Slepian和广义高斯窗的几个问题


10

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

有两个变量是某种类型的形状参数,分别p在广义高斯模型和widthSlepian模型中。(sig似乎是sigma,是标准偏差。)

2个问题:

  1. 代替我进行逆向工程和猜测,没有人能解释这些变量的名称以及它们的作用吗?

  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的dpss使用time_halfbandwidth这是同一窗口吗?是time_halfbandwidth一样的东西width吗?

DPSS定义具有 “所需的主瓣截止频率,以弧度每秒为单位”。ωc

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


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

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

2
DPSS是设计有约束优化的窗口,约束是主瓣的可容忍宽度。实际上,相对于固定的主瓣能量,它使主瓣(旁瓣)外部的能量最小化。我在家中有本本不错的书(出差在外),因此我可以制定一个更好的答案,当我复习时值得张贴,但这是最重要的。
布赖恩

Answers:


4

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

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

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

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


“高斯的一个不错的特性是它是它自己的傅立叶变换”,但这仅适用于p = 1,对吧?
endlith 2012年

我不确定对称是否仅适用于p = 1。也许有人可以计算出广义高斯(GG)的FT。在Wolfram Mathworld上查看高斯FT的推导mathworld.wolfram.com/FourierTransformGaussian.html。通过相同的论点,我们可以摆脱GG积分的虚部。不过,我不确定如何评估eax2pcos(2πkx)dx
-ax

1

反对GG的一个例子就是它自己的转换。p = 0.5给出了普通的背对背指数,其转换为2a /(s ^ 2 + a ^ 2)。

至于DC块,是的。在频域Fdcx(w)= 1-F(w)。这将使DC附近的抑制比与DC接近的w在当前通带中变得未优化。因此,我只会为此使用Dolph来使宽带通带变得相等的纹波。

这是冲动减去时域中的原始窗口函数。冲动有多大?它必须将序列的总和强制为零。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.