使用复 Morlet (Gabor) 小波的相干估计中的平滑算子问题

信息处理 小波 Python 平滑 加博 连贯性
2021-12-28 11:15:51

目标

我希望使用具有复 Morlet(又名 Gabor)小波的实值信号的连续小波变换(CWT)来计算相干估计。我以与pycwt 库中非常相似的方式计算信号的 cwt ,但我使用 pyfftw 库进行更快的 FFT 计算。我相信 cwt 的计算是正确的,因为我得到了几乎相同pycwt.cwt的结果,并且 scalograms 与 STFT 频谱图相比很好。虽然我使用 Python,但我认为它不是特定于语言的。

相干性计算资源

但是,我对如何计算相干性估计没有那么自信。我的相干性计算基于经典的Torrence & Webster 1999论文(与 pycwt 一样),其中在计算相干性分数之前,他们使用标准偏差等于的高斯核及时平滑交叉功率密度 ( cwt(sig)1 * cwt(sig2).conj()) 和功率密度 ( )abs(cwt(sig))**2到每个尺度的尺度。这对我来说很有意义,因为对于较大的尺度,光谱特性的变化速度较慢,因此与较小的尺度相比,更大的平滑窗口是必要的。他们还使用简单的移动平均线在比例域中平滑它们,这对我来说意义不大。

定义和实现的问题

这是我寻求解释和/或帮助的平滑运算符的实现和/或定义的问题

  1. 时域平滑

    • 时间上的高斯平滑似乎在小尺度上没有足够宽的平滑窗口(我怀疑是因为标准偏差接近采样步骤,所以它不会平滑太多)以及在小尺度上产生的相干性(接近奈奎斯特的高频)几乎总是统一的。我通过与 FFT 相乘来计算这个卷积(就像pycwt 一样)。在我的情况下,这个高斯窗口是否因某种原因不合适,还是我的实现有问题?
    • 使用移动平均值进行平滑在高频下会产生更合理的结果,但在低频(大尺度)下会更糟,这是可以理解的。似乎 MATLAB 小波工具箱还在wcoher中使用移动窗口进行时域平滑。这是推荐的方法吗?那么低频呢?
  2. 尺度域中的平滑

    • 尺度域中的移动平均平滑似乎是经验性的,但我可以接受。我只是现在似乎有真正的解释为什么它是必要的(据我所知,韦尔奇的相干估计方法没有这样做)。是否有充分的理由在比例域中执行平滑?
    • 真正让我困惑的是pycwt在对数间隔的尺度上计算它,这是一个非线性滤波器,我不确定这是否有意义。即使作为非线性滤波器也有意义吗?

到目前为止的结果

到目前为止,我只在时域中使用了一个简单的移动平均滤波器,并且在低频以上给出了合理的结果。但是,我对结果没有信心,并且将来我需要较低频率的相干性,所以我在这里问。我还尝试使用具有更大标准偏差的高斯窗口来获得类似于移动平均窗口平滑结果的结果。

每个第一个子图中的粗线是原始半透明信号的低通滤波版本。我添加了这些低通信号,以便更容易区分这两个信号。

使用对数频率轴(更好地显示低频): 带有对数频率轴的 xwt 示例 使用线性频率轴(显示一般一致性): 在此处输入图像描述 这是我用于平滑的代码部分,fftmodpyfftw.interfaces.numpy_fft(提供与模块相同的功能numpy.fft

# smoothing in time domain
freqs = fftmod.fftfreq(self.time_axis.data.shape[0],
                       self.axis_step(0))[:,np.newaxis]
freqs0 = self.axis1.data
if smoothing_window:  # moving average
    if isinstance(smoothing_window, complex):
        # in time units, convert to number of points
        smoothing_window = abs(smoothing_window) / self.axis_step(0)
    smoothing_window = np.empty(smoothing_window)[:,np.newaxis]
    smoothing_window.fill(1.0 / smoothing_window.size)
    smoothing_ft = fftmod.fft(smoothing_window, n=freqs.size,
                              axis=0, **fftw_kwargs)
else: # gaussian smoothing, gaussian_std_mul multiplies the std dev
    # FT of smoothing window which is a gaussian with std dev 1/f0
    # is a gaussian with std dev f0 without f0 in normalization const
    smoothing_ft = np.exp(-(freqs/freqs0 * gaussian_std_mul)**2 / 2.0) / _SQRT_2PI
# smooth by convolution with window as multiplication in Fourier domain
csd = fftmod.ifft(smoothing_ft * fftmod.fft(
    csd, axis=0, **fftw_kwargs), axis=0, **fftw_kwargs) # TODO maybe fft of vstack
psd_self = fftmod.ifft(smoothing_ft * fftmod.fft(
    psd_self, axis=0, **fftw_kwargs), axis=0, **fftw_kwargs).real
psd_signal = fftmod.ifft(smoothing_ft * fftmod.fft(
    psd_signal, axis=0, **fftw_kwargs), axis=0, **fftw_kwargs).real

更多最新资源

我做了一些进一步的挖掘,发现了 Bernard Cazelles 2007 年的一篇文章。他网站上的代码(包括 zip 文件中的文章)似乎表明他还在尺度和频域中使用了各种不同窗口(Barttlet、Hamming、Boxcar...)的平滑,但确实使用了不同的时域中不同尺度的窗口长度,尺度域中只有一个长度。该代码显示比例域再次是对数的,但使用线性窗口进行了平滑处理。然而,至少他引用了 Chatfield 1989,他引用了 PJ Daniell 在 1946 年的建议,即频域中的平滑也是需要的。

1个回答

我不确定我是否可以为您提供完美的解决方案,但希望至少有一些提示。

据我所知,小波(功率/幅度)谱的平滑滤波器的内核必须与小波再现内核的大小成比例,即时间尺度上的窗口宽度与小波尺度和窗口宽度比例取决于您在比例方向上的“采样”——例如,您使用固定窗口宽度进行对数缩放,但如果您决定按比例进行线性缩放,则需要调整平滑滤波器窗口宽度,这也很常见在 cwt 分析中。

关于接近奈奎斯特的问题,我可以说任何接近奈奎斯特的频率分析都必须小心,因为你对连续(!)小波变换的近似在接近奈奎斯特时非常糟糕。此外,您的平滑过滤器将导致边界效应特别接近奈奎斯特,因为您无法超越。

最后,我想向您推荐Douglas Maraun 的博士论文,它完全专注于这个主题,并扩展了 Torrence 所做的工作,并以更严格的数学方式将其形式化。也有一些可用的软件包,但是不确定是否仍然保留。