忠实于“通过卷积去除频率域中的窗口效应”这一主题(尽管 OP 可能想要实现其他目标或类似目标),但我觉得要添加我对这个特定主题的个人经验的评论。
通常我需要在频域中删除一个 Hann 窗口,在默认使用 Hann 窗口帧的 STFT 框架中工作,以进行高级频谱处理,其中输入频谱被预期为非窗口(例如,重叠保存卷积或过滤)。
一句话:是的,你可以。尽管在数学上删除一个窗口(在时域或频域中)意味着重建永远丢失的数据,但实际上你可以用可能的最小损失来重建数据。
让我们看一个 Hann(升余弦)窗口。它的时域公式是 y=(1-cos(pi*x))/2,其中 x 的范围从零到并不包括一帧。其对应的频域表示为bin0=(0.5,0i),bin1=(-0.5,0i)。要消除其在时域中的影响,您可能只想将信号除以上述窗口函数。要在频域中做同样的事情,您可以简单地将要开窗的频谱与所述函数的倒数的频谱进行卷积。由于这个函数在两端都是零(实际上它在数学上只在第一点为零,除非舍入误差),为了避免无穷大,你可以简单地用一个大的值交换无穷大,比如 10000 左右。这种卷积的结果是未加窗的频谱。通过将其转换回时域,
不过,也许您不能删除矩形窗口,因为理论上将大面积信号乘以零所丢失的数据量是不可能恢复的。但我认为这取决于频谱内容。例如,如果它是一个普通正弦曲线的频谱,通过与一个函数的频谱进行卷积来去除矩形窗口模式,该函数的频谱是矩形为零的高值,而矩形是一的高值(即它的倒数),您仍然可以(基本上)获得正弦曲线的频谱来重建整个信号。
更新:我添加这个以防将来有人通过谷歌搜索可能会在这里结束。此外,这是我通过努力提出的关于高级光谱操作的非常具体的内容,据我所知,在任何地方都没有涉及。
可以通过频域中的一些非常简单的操作仅丢失第一个样本来移除汉恩窗,而无需借助卷积或转换到时域来除以倒数窗函数,这两个过程都涉及不必要的精度损失。
作为前提,仅从信息的角度来看,当您应用 Hann 窗口时
(1-cos(x*PI2/z))/2 0<=x<z
对于 z 个样本块,您只会丢失一个样本:第一个样本,因为只有在 x=0 时,窗口函数才为零,因此该样本将永远丢失。因此,如果您接受您将永远无法恢复第一个样本,那么以下伪代码将完美地删除以前在频域中应用的 Hann 窗口。
S[] 是半复频谱(仅正频率,从 bin 0 = DC 到 bin z/2 = Nyquist)到“去窗”。s 和 k 是实变量。M,P 和 TMP 是复变量。z 是帧大小。nb 是等于 z/2+1 的 bin 数
s=0
k=1
iterate cnt from nb-2 to 1
{
s = s + im(S[cnt]) * k
k=k+1
}
im(S[0]) = -2 * s / z
P=0
M=0
iterate cnt from 0 to nb-1
{
TMP = S[cnt] * 4
P = P + M
S[cnt] = P
M = M-TMP
}
S[0] = S[0]/2
S[nb-1] = S[nb-1]/2
如前所述,第一个时域样本将保持未定义。如果需要,它的值可以很容易地被发现和更改,但仍保留在频域中,请记住,第一个时域样本的值等于频谱箱的所有实部的总和。
这种技巧只能应用于 Hann 窗,因为它的频谱只是由两个 bin 组成,一个 DC 和一个单一频率分量