将负频率反射到正频率

信息处理 fft 频谱 频域 IFFT 混叠
2022-01-27 21:00:48

我正在尝试通过在频域中使用窗口函数来合成正弦曲线。

它涉及:

  1. 在频域中,将窗口移动到峰值频率的中心
  2. 要生成 DFT 帧,请在峰值周围采样一些窗口值作为光谱图案
  3. 逆傅立叶变换频谱基序,以生成所需频率的正弦波

除了合成低频外,这种方法总体上效果很好。因为当将窗口移至低频时,窗口的左侧将位于负频域。

中间的图说明了问题(T(k) 位于负域中) 数字

我在这里找到了一个解决方案,它建议将窗口左尾(在负域中)的复共轭值添加到窗口右尾(在正域中)的 DFT bin 中。我无法理解,遵循这个解决方案会产生更多的失真。所以我想知道是否有人知道如何正确地做到这一点。任何建议将不胜感激!

上述解决方案的一些摘录:

围绕 k=0 轴的反射归因于本文描述的用于合成正弦曲线的特定实施例。对于每个真实正弦曲线,一个峰值存在于正频率区间中,而另一个峰值存在于负频率区间中。在仅合成正频率区间中的峰值的实施例中,以低正频率区间为中心的峰值溢出到负频率中(如图3中的Ht(k-bc)的图所示)。类似地,以低负频率区间为中心的峰值溢出到正频率中。Ht(k-bc) 在负频率中被反射的部分,或 T*(-k),表示以负频率区间为中心的峰值部分,该部分溢出到正频率中。

PS。前段时间我在DSP 相关论坛上提出了这个问题。我从罗伯特那里得到了非常详细的建议,忽略位于负域上的箱以指定整个正频率,然后复共轭将其反映到负频率,这已经改善了问题,但它仍然无法下降低于 80 赫兹。所以我想我会在这里再次发布。

3个回答

您可以使用另一种方法:允许负频率,执行复杂的 IFFT,丢弃时域样本的虚部,并将结果乘以 2。让我们在 Octave(MATLAB 克隆)中尝试它,主题为移动,使其最左边的 bin ( ) 落在负频率上。FFT 长度为 8。(为了便于阅读,我重写了结果。)[1+2i,3+4i,5+6i,7+8i]1+2i

> g = [3 + 4i, 5 + 6i, 7 + 8i, 0, 0, 0, 0, 1 + 2i]
g =

   3 + 4i   5 + 6i   7 + 8i   0 + 0i   0 + 0i   0 + 0i   0 + 0i   1 + 2i

> y = real(ifft(g))*2
y =

   4.00000  -0.89645  -2.00000   0.98223   1.00000  -1.60355   0.00000   4.51777

> fft(y)
ans =

   6 + 0i   6 + 4i   7 + 8i   0 + 0i   0 + 0i   0 + 0i   7 - 8i   6 - 4i

可以通过合成的前 5 个 bin并将它们馈送到真正的 IFFT(我假设你使用它)来生成相同的时域信号IFFT 类在内部生成剩余的 3 个负频率箱。您可以按照以下步骤进行合成:yfft(y)

1)对于落在正频率箱上的移位主题的每个箱,逐字复制值。(你已经在这样做了)

2) 对于落在 0 Hz bin 上的移位主题的 bin,将其实部加倍并将其写入 0 Hz bin,丢弃虚部,如(你已经在这样做了)3+4i6+0i

3)对于落在负频率仓上的移位基序的每个仓,将其复共轭(相同的实部,虚部翻转的符号)添加到与 0 Hz 仓距离相同的正频仓. 这将是步骤 1 中已写入的 bin 之一。在示例的第二个 bin 中,相加得到不要指望虚部会取消,因为即使图案可能是对称的,这两个图案箱也不会对称地位于图案的相对两侧,除非您正在合成 0 Hz 正弦波。如果虚部保持非零就很好了;频域 bin 可以具有复数值,但仍会产生实值时域数据。5+6iconj(1+2i)=12i6+4i

哦,如果移动的主题到达奈奎斯特箱(对应于采样频率的一半)或更高,在那里做完全相同的事情,在奈奎斯特箱周围镜像。

因此,如果您知道时域中的窗口形状是什么,那么您就知道窗口的“主题”(我没有想到使用该词)在频域中是什么。窗口的傅立叶变换是以 DC(bin 0)为中心的主题。在某些时候,您需要将基序的旁瓣截断为零。使用高斯窗口,基序形状也将是高斯的,并且会在两侧迅速衰减到零,当它达到左右时,您可以将高斯基序截断为 0。如果您希望您的正弦频率具有小数-bin 精度,您将需要能够在不同的小数-bin 偏移量处插入motif,并且可能为不同的小数-bin 偏移存储各种略有不同的motif 模板。109

因此,首先将整个频谱清除为 0。对于每个频率分量,您将移动到该频率的基序向下移动,并且在基序不为零的情况下,您必须将其添加到现有频谱(初始化为零)。这意味着不同正弦频率的图案的一些尾部将重叠。确保您重叠相加,而不仅仅是覆盖频谱中现有的非零值。

对每个真实正弦波的正负频率分量执行此操作。

如果频率太低,以至于图案的一些尾部延伸超过 DC(bin 0),则允许并添加它。即,正频率分量的图案将延伸到负频率,而反射图案则用于负频率频率分量将扩展到正频率。只需这样做并允许尾部重叠并添加它们是否跨越到另一个频率符号。

非常感谢奥利!有用!要使用真正的 fft,只需按照 Olli 描述的这 3 个步骤,然后将频谱的前半部分复共轭到后半部分。

扩展 Olli 的示例:

使用光谱主题 [1 + 2i , 3 + 4i, 5 + 6i, 7 + 8i] 和 8 的 fft 大小,按照 olli 所说的,你首先会得到:

[6 + 0i, 6 + 4i, 7 + 8i, 0 + 0i, 0 + 0i, 0 + 0i, 0 + 0i, 0 + 0i]

然后执行前 4 个 bin 到后半部分的复共轭:

[6 + 0i, 6 + 4i, 7 + 8i, 0 + 0i, 0 + 0i, 0 + 0i, 7 - 8i, 6 - 4i]

然后执行 ifft,它应该为您提供实值时域数据。