STFT可以成功地用于声音数据(例如带有.wav声音文件),以便进行某些频域修改(例如:噪声消除)。 ,N=441000,STFT大约产生一个fs=44100数组(第一个坐标:时间帧,第二个坐标:频率箱)。可以在此数组上进行修改,并可以使用重叠加法(*)进行重构。

如何用小波做类似的事情? (DWT),即得到形状类似的数组windowsize=4096,其中包含overlap=4时间帧和430x4096频点,请对该数组进行一些修改,最后恢复信号?怎么样 ?小波等于重叠叠加是什么?
这里涉及的Python函数是什么(我还没有找到使用a x b ...进行音频修改的简单示例)? *):这是可以使用的STFT框架:

signal = stft.Stft(x, 4096, 4)    # x is the input
modified_signal = np.zeros(signal.shape, dtype=np.complex)

for i in xrange(signal.shape[0]):    # Process each STFT frame
    modified_signal[i, :] =  signal[i, :] * .....  # here do something in order to
                                                   # modify the signal in frequency domain !
y = stft.OverlapAdd(modified_signal, 4)   # y is the output


目标是找到一个具有小波的类似框架。

评论

附带评论:在STFT上进行这种“过滤”是一个非常糟糕的主意。这不是做大多数您真正想做的事情的好方法。您实际上想实现什么?

请注意,PyWavelets仅用于离散小波变换。如果您想做类似STFT的工作,您会更容易理解连续小波变换,例如常数Q变换(它是Gabor变换),与复杂的Morlet连续小波变换本质上是一样的,但其目的是不可逆:grrrr.org/research/software/nsgt

(在我看来,这个问题由“社区”恢复。),小波重叠并以与STFT非常相似的方式添加。所以我不太了解问题的本质。

是否需要更多详细信息?

#1 楼

短时傅立叶变换通常是冗余变换,通常在每个频率上以相同的子采样实现。如果窗口选择正确,则说明窗口已完成:您可以将其反转并恢复任何初始信号。

由于冗余且完整,因此具有许多完美的逆。可以使用更通用的工具来实现和理解它:(过采样)复杂的滤波器组。给定窗口的类型和长度以及重叠,可以为您提供分析过滤器库,您可以为其计算是否可逆。如果是这样,则可以计算自然逆,也可以优化逆。重叠叠加只是许多潜在逆中的一个,可能是最常见的逆,这通常会限制窗口的选择。

标准离散小波变换也是滤波器组,不同之处在于子采样在每个频带中都不相同(或更恰当地定标)。每个刻度的长度变成不均匀。但是,存在冗余小波实现,可以产生可以使用的系数的“矩形数组”。以不同的名称来调用最著名的方案:不变位移小波或时不变小波,未抽取小波,平稳小波变换(SWT),有时还包括循环旋转。它的标准重构涉及类似于重叠叠加的步骤,但由于跨比例的采样因子不同,它们更加“嵌入”。您可以将它们与库中的任何离散小波一起使用,甚至可以设计自己的小波。原因是标准离散小波在设计时考虑了非冗余性,这限制了小波的选择。使用冗余,由于要满足的约束不太严格,因此小波选择会增加。 “最终”化身是连续小波变换,它允许“几乎”每个逆合成小波。我的最后一句话很糟糕,希望您能理解:方矩阵是可逆的时,它只有一个逆。当“矩形”矩阵以广义方式左不可逆时,它具有多个逆。

似乎有一个固定小波变换的python实现。您可以在2.3.4中找到一些参考。链接论文的平移不变小波章节。

在实际应用(地球物理,无损检测,超声,振动)中,它对于检测,去噪或恢复通常要更加健壮。

评论


$ \ begingroup $
“冗余”的意思是“输出中的信息多于再现输入所必需的信息”?
$ \ endgroup $
– Endolith
2015年10月6日13:50

$ \ begingroup $
没错。通常,对于$ N $采样信号,在变换后,您将获得$ M> N $系数。这意味着您可以利用此好处。例如,您得到几个潜在的逆,其中一些比其他的更实际。更重要的是,在变换域中进行处理(增强,检测,降噪,自适应滤波,恢复,解卷积,源分离)时,您将获得鲁棒性并降低对噪声的敏感性。这来自转换后的数据中的其他“多样性”。仅当正确使用时...
$ \ endgroup $
– Laurent Duval
2015年10月6日17:37

#2 楼

使用短时间傅立叶变换进行滤波时需要重叠添加/重叠保存的原因基本上是,与您获得的系数相关的基函数是在特定时间范围内定义的(而不是单个时间点)。用于计算扩展系数的傅立叶变换还对由信号帧长度定义的圆形域实现了卷积。这意味着框架的两个端点真正被识别并围成一圈。这就是为什么必须确保您编辑的系数的基函数不会通过缠绕而影响帧的两端。这是仅与基于离散帧的傅立叶变换方法相关的复杂问题,与卷积定理和离散傅立叶基础是时间平移的特征向量这一事实有关。他们使用圆卷积计算。这意味着您不需要重叠添加或保存,也不需要任何其他处理圆形卷积副作用的方法。相反,小波基向量只是描述信号的可能依据。因此,(完整的,离散的,可能正交的)小波变换只是从时域基础到小波域基础的基础变化。基础变化可以反转(通过应用到达那里的基础变化矩阵的逆函数),您可以切换回时域。

您提供的作为窗口大小,重叠,采样率的参数均不适用于小波变换。您唯一需要的是母亲小波。如果要将结果与STFT输出进行比较,可以选择任何STFT基向量(即,窗口乘以复数指数载波)作为小波原型。然后,您应用快速小波变换,它将信号分解为高通和低通滤波和抽取信号的树,最终成为您的系数。每个系数都与小波基向量及其参数(比例,时间)或(频率,时间)相关联。您可以操纵系数,然后应用逆离散小波变换。它将获取您的系数,并将其运行在重新合成滤波器组中,以再次产生信号。

这些过程并不简单,对于初学者来说可能很难消化。但是您应该能够为您选择的平台找到实现快速小波变换及其逆函数的库/工具箱。但是,如果要实现自己的小波基础,则必须导出分解和合成滤波器组的滤波器系数。这需要一些深入的理论,您可能需要首先对其进行研究。

小波变换还有其他形式,即连续小波变换在不完全的基础上起作用。计算既慢又难求,因此目前还不是您想要做的选择。

评论


$ \ begingroup $
感谢您的回答。我尝试建立代码框架的主要原因是,我一直都注意到(从我的童年到几年前,当我完成博士学位时(当然,这与DSP无关)因此,这里有新手问题!))是,处理一些现实生活中的材料(例如DSP中的音频信号)对理解深度理论有很大帮助。我想编码的是:音频->小波变换->(在数组上做某事)->反转->音频输出。有了很多(在数组上做些事情),我敢肯定我会了解更多小波的工作原理。
$ \ endgroup $
–巴吉
13年11月19日在15:40



$ \ begingroup $
@Basj,然后按照我说的做。查找一个同时支持快速小波变换及其逆函数的python库,然后使用生成的系数树进行播放。祝好运并玩得开心点!
$ \ endgroup $
–爵士乐狂人
13年11月19日在15:58

$ \ begingroup $
“都不适用于小波变换”它们适用于CWT,对吗?
$ \ endgroup $
– Endolith
2015年10月6日下午13:52

#3 楼

有许多定义小波基础的方法。小波通常看起来像这样:

$$ w_ {x_0,k_0}(x)= A \ exp(ik_0x)e(k_0(x-x_0))$$

其中$ x_0 $是时间中心,$ k_0 $是频率中心,$ e $是窗口函数。 $ A $吸收相位和归一化。这与您的STFT的主要区别在于,窗口的宽度取决于$ k $。通常,人们使用离散点$(x_0,k_0)$来限制子波的数量。就像在STFT中一样,使用比信号维数更多的点通常是很好的。目的是通过使用所有可能的$(x_0,k_0)$来近似估算您将获得的答案,但要具有合理的计算资源。小波基将不会是正交的。即以下内容将是错误的:

$$ \ left \ langle w_ {k_0,x_0} | w_ {k_0',x_0'} \ right \ rangle = \ delta(x_0,x_0')\ delta(k_0,k_0')$$

但是适用于合适的$ A $和$ w $ ,您可以安排基础不完整:

$$ \ sum_ {x_0,k_0} \ left | w_ {x_0,k_0} \ right \ rangle \ frac {1} {\ sqrt {k_0}} \ left \ langle w_ {x_0,k_0} \ right | = \ text {identity} $$

换句话说,您只需将其组成小波相加即可完美地重构信号。

您可以轻松插入“修改”在以上总和中:

$$ \ text {my_filter} = \ sum_ {x_0,k_0} \ left | w_ {x_0,k_0} \ right \ rangle f(x_0,k_0)\ left \ langle w_ {x_0,k_0} \ right | $$

更新2013-11-19:在下面添加实现细节

对于某些信号$ f(x)$,我们希望计算系数:

$$ c_ {x_0,k_0} = \ left \ langle w_ { x_0,k_0} | f \ right \ rangle $$

对于固定的$ k_0 $,$ c {x_0,k_0} $可以看作$ x_0 $的函数,而该函数只是$ f $的过滤版本。具体来说,它是$ f $与$ w_ {0,k_0} $的卷积,我们可以使用傅里叶方法有效地进行计算。因此,我们可以如下高效地计算所有$ c_ {x_0,k_0} $:


对$ f $进行傅立叶变换以获得$ \ hat f $。可能您希望一次在一个窗口上执行此操作,并且要有足够的重叠以丢弃窗口伪像等,但是为简单起见,我们假设您一次处理整个信号,并且它的长度是2的幂。
对于每个$ k_0 $以一定几何级数间隔约$ 1/4 $的滤波器带宽(或更精细,如果需要):

将$ \ hat f $与$ \ hat w_ {0,k_0} $。
将频谱截断到某个间隔$ [k_l,k_r)$,长度为2的幂,并且包含$ \ hat w_ {0的非零部分,k_0} $。对其进行傅立叶逆变换。
将其乘以$ exp(ix \ frac {k_l + k_r} {2})$以校正相位。结果是$ c_ {x_0,k_0} $被视为$ x_0 $的函数。



这将计算所有小波系数。您可以通过调整几何级数的比率来选择$ k_0 $中的分辨率。 $ x_0 $中的分辨率由截短频谱的长度设置,并将根据$ w_ {0,k_0} $的带宽而变化,而带宽又取决于$ k_0 $。计算工作是在高时间分辨率下进行一次傅立叶变换,再在低时间分辨率下对每个$ k_0 $值进行一次傅立叶逆变换。它的效果与STFT大致相同-可能会因选择的分辨率而稍慢一些。

然后,您可以根据需要修改$ c_ {x_0,k_0} $,然后您可以通过逆转上述过程来重构信号,对$ k_0 $上的频谱求和,然后最终进行整体傅立叶逆变换。

截断频谱有时会引入归一化问题,具体取决于FFT的定义方式。在这里,我不会尝试涵盖所有可能性。规范化基本上是一个简单的问题。 ;-)

剩下的唯一部分是选择合适的小波包络。事实证明,获得$ \ hat w_ {x_0,k_0}(x)$的权利比获得获得$ w_ {x_0,k_0}(x)$的权利要容易。合适的定义(有多种可能)是:

$$ \ hat w_ {x0,k0} = A exp(-i(k-k_0)x_0)exp(-(Q log(k / k_0))^ 2)$$

其中$ Q $是一个无量纲常数,它选择滤波器的带宽,即小波的频率分辨率,而$ A $则根据需要选择正常化。有了这个定义和足够高的$ k_0 $分辨率,超完备条件成立,并且信号重建将起作用。

评论


$ \ begingroup $
感谢您回顾有关小波理论的这些要点,这对于理解它的工作原理确实是必需的。但是这里的问题更多是关于构建一个框架代码,该框架代码可以处理例如音频信号。问题是:如何处理这些无穷的和,如何选择窗口(或更确切地说是小波),如何在python中使用pyWavelets(或另一种等效语言,我将翻译成Python),选择参数(例如在我的音频示例中:采样率= 44100,fft窗口= 4096,重叠= 4,依此类推)
$ \ endgroup $
–巴吉
13年11月19日在7:51



$ \ begingroup $
您对不完整的概念不准确。基础是完整的,意味着基础上的规范投影仪是身份运算符。但是写是作为外部乘积的总和,您需要正交性。对于超完备性,您不能具有正交性,因此外部乘积分解将不起作用。但是,如果存在系数$ a_k $从而使$ \ sum_k \ left |存在,您可以通过说一个基础是完整的(并且可能是超完整的)来使其工作。 k \ rangle a_k \ langle k \ right | = \ mathrm {Id} $
$ \ endgroup $
–爵士乐狂人
13年11月19日在10:06

$ \ begingroup $
嗯,您已经介绍了一个morlet小波,但是所有小波都没有fb和fc,因此它们可能具有恒定的$ K $,也不可能用morlet制作DWT,bx它不是正交的,实际上我不能与cwt或STFT @ apt1002相比,使用DWT进行频率估计没有很好的分辨率
$ \ endgroup $
– SAH
13年11月19日在10:24



$ \ begingroup $
另外,找到这些系数$ a_k $是不平凡的,也不是唯一的。基向量的线性相关性意味着,如果基太完备,则存在无限多种这样的$ a_k $。这意味着您的“过滤器”定义不正确,实际上根本没有定义,因为您不知道如何使用过滤器功能$ f $进行控制。信号的每个方面都在许多线性相关的小波基向量中实现。因此,您的理论崩溃了。
$ \ endgroup $
–爵士乐狂人
13年11月19日在11:12

$ \ begingroup $
看看它是否有效的最好方法是提供一个最小的代码示例(例如,以pyWavelet为例,我想像的几行应该是可能的)(一旦我理解了,我会做得很好,我想我还需要几天阅读有关小波的信息!)
$ \ endgroup $
–巴吉
13年19月19日在16:04