在许多任务中,将长时间信号划分为多个部分,每个部分分别进行处理。 特别地,在合成过程中,该方法用于使用窗口傅立叶变换来分析信号,反之亦然。 以及频谱处理,例如噪声消除,速度变化,非线性滤波,音频数据压缩等。
分区本身的过程在数学上通过乘以具有偏移量的某些权重(
窗口 )函数来表示。 对于最简单的窗口-矩形-可能看起来像这样:
源信号:

分区:



您可以通过简单地将它们相加来恢复原始信号。
更多细节
但是通过
由于多种原因,矩形函数不是最佳的窗口函数。 在频谱分析中,通过(通常是快速的)离散傅立叶变换,被分析的数据块似乎是“循环”的,这会导致边缘出现间隙并导致频谱失真:

它也不适合进行逆向合成-因为任何更改都会导致中断-例如,如果我们尝试逆转其中一个部分:

为了消除这些缺点,使用了重叠-当每个随后的窗口捕获前一个窗口的部分数据时; 和权重窗口分别逐渐下降到边缘。
重叠50%
大多数情况下,他们使用
Hannah窗口 (也称为“升余弦”),且重叠率为50%:






由于加法期间余弦函数的对称性,它们被求和为单位:

现在,通过逆向综合,我们将不会获得间隙-只是在窗口边界的值仍将为零的情况下。 例如,当反转零件之一时,不会破坏光滑度:

双覆盖处理
更详细地考虑使用快速傅里叶变换(FFT)处理信号的算法:
- 用窗口覆盖将信号分成多个部分;
- 直接FFT;
- 频谱处理;
- 逆FFT
- 重复的窗口覆盖(因为在反向FFT之后,边界不一定会停靠为零而不中断);
- 结果段的总和。
此外,如果不执行频谱处理,则输出信号应与输入信号相同(仅具有不可避免的时间延迟)。
使用Hann窗口时,重叠50%不再足够,因为会出现倾斜:

由于双重重叠等于平方,所以显而易见的解决方案是使用Hann窗口的根来补偿平方:

但是,在这种情况下,窗口的边缘不再平滑-一阶导数中出现了间隙。
注意事项有趣的是,在这种情况下,我们得到了正弦曲线周期的一半。
您可以采用另一种方法-使用75%的重叠量,然后窗口也将被累加为一个常数-仅在
1 和
frac32 :

在这种情况下,我们很幸运。 如果将平方扩展为总和,则可以看到它是两个汉娜窗口的组合,但是比例不同,这使我们能够满足所需的要求:
\左( frac cos(2 pix)+12\右)2= frac cos(2 pix)+12+ frac cos(4 pix)−18

对于其他窗口功能,这种技巧将不起作用。 同样,即使在50%重叠时,并非所有标准窗口函数都可以提供恒定的求和。
主意
我们可以将Hann窗口视为一个独立函数,而不是两个分段的连续函数之间的差异(
单独的文章专门讨论了它们),但有一个偏移量。 例如,使用以下功能
\ left \ {\ begin {array} {ll} -1&x \ leqslant -1 \\ 1&x \ geqslant 1 \\ \ sin \ left(\ frac {\ pi x} {2} \ right)& -1 <x <1 \\ \ end {array} \对

可以写
f(x+1)−f(x−1)

考虑了两个这样的窗口之和的组成部分之后,它们总结成一个常数的能力将变得更加直观:

在细分市场上
[0,2] 我们除了功能外还获得了相互补偿
−f(x−1) 和
f((x+1)−2) 从
f((x+1)−2)=f(x−1)您可以选择另一个具有更多重叠的偏移量,例如:
f\左(x+ frac12\右)−f\左(x− frac12\右)

然后,逐步移动时
frac12 ,它们也将被汇总为一个常数:

可以看出,如果重新安排窗口功能的组件,则会得到相同的Hann窗口。
因此,使用不同的限制功能,可以形成所需形状的窗口。
最终配方
现在仅需设置比例尺,以使定义区域和值不依赖于重叠值。 在间隔上定义窗口
[0,1] 我们得到
fracf left( frac2txt−1−1 right)−f left( frac2t(x−1)t−1+1 right)2
在哪里
f -形式的分段连续函数
\ left \ {\ begin {array} {ll} -1&x \ leqslant -1 \\ 1&x \ geqslant 1 \\ g(x)&-1 <x <1 \\ \ end {array} \是的
但是
g -点之间的一些插值功能
(−1,−1) 和
(1,1) 。
参量
t 确定重叠程度-一个分隔符,确定每个下一个窗口必须移动的步长,
xn+1=xn+ frac1t ,并且必须大于1,
t>1 。
重叠百分比
p 可以通过公式计算
p= frac100(t−1)t
反之亦然
t= frac100100−p
注意事项处理实际数据时,可能有必要根据FFT的特定大小重新计算重叠级别。 例如,使用2048个点的FFT和3的重叠度,我们得到2048/3 = 682.666 ...的步长,这在实践中当然是不可行的。 因此,我们将其四舍五入, t 重新计算为2048/683 = 2.998535871156662 ...
或者,反之亦然-使用窗口大小(显然可以被3整除)(例如999),并将余数添加到FFT所需的大小(零)(第25个)。
窗口的最终外观将取决于重叠级别的选择和限制功能的选择。
一些有趣的例子
在这里,我们将看一些现成的解决方案,一切都已开始。 为简单起见,我们考虑一个简单的插值函数
g(x) ,没有其他捆扎。
多项式窗口
它们在计算上最便宜。 使用
先前导出的公式
frac2x Gamma left(n+ frac12 right)\,2F1 left( frac12,1−n; frac32;x2 right) sqrt pi Gamma(n)
我们在较高的导数上获得给定数量的零的多项式,该多项式可为边缘提供必要的窗口平滑度。
前10个多项式 beginarraycx frac12x left(3−x2 right) frac18x left(3x4−10x2+15\右)\压裂116x\左(−5x6+21x4−35x2+35\右)\压裂1128x\左(35x8−180x6+378x4−420x2+315\右) frac1256x\左(−63x10+385x8−990x6+1386x4−1155x2+693\右) fracx\左(231x12−1638x10+5005x8−8580x6+9009x4−6006x2+3003\右)1024 fracx\左(−429x14+3465x12−12285x10+25025x8−32175x6+27027x4−15015x2+6435\右)2048\压裂x\左(6435x16−58344x14+235620x12−556920x10+850850x8−875160x6+612612x4−291720x2+109395\右)32768 fracx\左(−12155x18+122265x16−554268x14+1492260x12−2645370x10+3233230x8−2771340x6+1662804x4−692835x2+230945\(右)65536\结束array
如果窗口的重叠率为75%,且n的值不同,则窗口将如下所示:

并且对于根提取-这样(当使用75%重叠时):

左右(使用50%重叠时):

最平滑的窗口
功能介绍
tanh left( frackx sqrt1−x2 right)
有趣的是,它是无限可微的,并且其边缘的所有导数均为0(可以通过根据微分规则考虑其导数来证明-每个项中都有一个零因子)。 这使我们能够在其基础上构建窗口,所有窗口均无间隙:

窗口视图“裙子”
对此类窗口的需求是由于提高了FFT分辨率,但通过增加其在中央的集中度来降低高频下“时频不确定性”效应的影响。
首先,我们确定所需的窗口函数类型-例如,如下所示:
−\日志\左(k2x2+1\右)+\日志\左(k2+1\右)− frack2\左(1−x2\右)k2+1

在这里,第一项决定函数本身的形式,第二项-提供与横坐标轴的交点,第三项(抛物线)重置边缘处的导数以平滑对接; 和参数
k 定义峰的“清晰度”。 这种形式尚不适合使用-首先,您需要通过集成和缩放从限制函数中获取限制功能:
frackx\左(k2\左(x2+3\右)+6\右)+3\左(k2+1\右)\左(kx\左( log\左(k2+1\右)−\日志\左(k2x2+1\右)\右)−2 tan−1(kx)\右)4k3−6\左(k2+1\右) tan−1(k)+6k
为了方便起见,您可以绑定参数
k 达到重叠的水平
t -例如,使窗口中心的四阶导数为0-然后
k 将被视为
sqrt3(t−1) :

在这里,为清楚起见,所有窗口都缩小到相同的比例。
针查看窗口
它是上一个窗口的更“激进”版本。 选择了一个夸张的基础,然后通过连续变换
frac1x\到 frac1 sqrtx2\到 frac1 sqrtx2+1 to frac1 sqrtk2x2+1\到 frac\左(1−x2 right)2 sqrtk2x2+1
并使用积分和缩放形式的相同步骤得出公式
frackx\左(2k2\左(x2−4\右)−3\右) sqrtk2x2+1+\左(8\左(k4+k2\右)+3\右) sinh−1(kx)\左(8\左(k4+k2\右)+3\右) sinh−1(k)−3k sqrtk2+1\左(2k2+1\右)
在这里您还可以绑定参数
k 达到重叠的水平。 四阶导数方程的直接解给出了一个繁琐的结果,因此只需通过定义
k 怎么
k(t−1) 从而确保参数的作用
k 作为“微调”。 在
k=2.22 Windows将如下所示:

不对称窗口
窗口函数完全不必对称。 假设我们需要一个具有尖锐攻击力和平滑衰减的窗口。 我们可以根据已经熟悉的方案来获得它-首先确定函数的期望形式,然后通过集成获得约束函数。 由于非对称性,中心将不再通过原点,因此该任务稍微复杂一些,因此添加了额外的计算步骤。 这也导致这样的事实,即公式相当麻烦。 例如,考虑最简单的选项-抛物线乘以多项式权重窗口:
(1−x)2\左(1−x10\右)2

在此,加权窗口中的x程度(即10)决定了攻击的“清晰度”。 为了清楚起见,我们使用一个特定的值而不是一个符号参数来简化公式-如果您愿意,可以稍后重新计算。
集成后,仅缩放已不再足够-您仍然需要对齐边缘:

为此,我们首先将函数上移以对齐左边缘,然后将其缩放到右边缘的两个并减去一个。 然后我们得到以下公式:
frac8775 left( fracx2727− frac2x2626+ fracx2525− frac2x1515+ frac4x1414− frac2x1313+ fracx33−x2+x+ frac11759261425 right)9856−1
为了使最终的窗口具有所需的外观,还必须提供足够大的重叠度:

结论
同样,您可以从其他任何钟形函数(例如,高斯函数)构建窗口。 您还可以修改那些已经考虑过的参数,以提供更大的平滑度或更改曲线的形状。
不考虑这些窗口函数的频谱组成,应单独进行研究。
可以在
此处下载Wolfram Mathematica文档形式的文章的稍微高级的版本(具有在考虑中的窗口和隐藏的公式中动态更改参数的能力)。