复共轭和IFFT

信息处理 傅里叶变换 声音的
2022-01-04 20:36:24

我问了一个关于堆栈溢出的问题。

不过我有一个小问题。正如 Paul RI 所建议的,我将我的下部箱镜像到上部箱中。n/2n/2

不过我有几个问题。

  • 我假设因此,对于订单 10 IFFT,我会将底部的 512 个频率箱镜像到顶部的 512?这最终也会为我产生 1024 个真实样本?n2fftOrder
  • 当镜像时,这是否意味着 bin 0 会进入 bin, bin 1 会进入 bin等等?n1n2
  • 我似乎在采样频率的四分之一处得到某种形式的反射?这意味着我的频率范围的上半部分实际上出现在下半部分之上。有谁知道为什么?
  • 有谁知道为什么我会得到一个条纹效果,我得到 512 个一个幅度的样本和下一个 512 个不同的样本?(这“可能”是我镜像的来源)

我想这就是现在。任何帮助都会非常有帮助!!

编辑:给你一个反射的图像几乎是不可能的,因为它很难看到!基本上我以 22 kHz 采样,除了 11 kHz 以上的“噪音”之外什么也没有。高于 11 kHz 的“应该”(尽管显然我做错了什么)似乎从 11 kHz 反射到 0。这很奇怪。

至于条纹的图像,它们可以在这里看到

我相信,每条条纹都是 512 个样本宽。

4个回答

我不确定您对“反射”或“条带化”的理解是什么,但您希望复制您的数据点,以使频域信号(IFFT 的输入)是共轭对称的。这意味着,对于偶数:N

X[k]=X[Nk],k=1,2,,N21

注意是从零开始的;向量中的第一个元素是以上表明您不复制输入向量中的第零和元素。这种关系是基于离散傅里叶变换的周期性;频域矢量的前半部分对应于覆盖从的角频率范围的“正”频率。后半部分覆盖从,利用频域中的周期性,相当于kX[0]N20(N1)πNπ(N1)2πN2ππ2πN为了使频域向量具有共轭对称性,那么很容易证明上述关系一定是真的。

谈到您将频谱图转换为听起来有意义的音频信号的最初目标,无法保证您得到的内容会以任何方式令人愉悦。正如在 Stack Overflow 上指出的那样,频谱图没有相位信息;那里建议的方法假设每个频域 bin 的相位为零(因此上面显示的共轭运算是多余的)。虽然人耳对音频中的相位失真并不是非常敏感,但您可能需要根据您希望达到的具体目标来做其他事情。

您的 [0] 索引是 DC 组件,不应镜像。反射点应为 (N/2)+1

假设你有一个 1024 点的实数序列。复数 FFT 将其转换为 1024 个复数。然而 X[0] (DC) 和 X[512] Nyuist 是实数并且 X[1]..X[511] 是共轭对称的,因此整个频谱仍然可以用 1024 个数字(2 个实数和 511 个复数)表示。假设您有一个半边谱 X[0]...x[512],并且想要创建它的共轭对称版本 Y[0]...Y[1023]。请执行下列操作

Y[0] = X[0], Y[1] = X[1] .... Y[512] = X[512];
Y[513] = conjugate(X[511]), Y[514] = conjugate(X[510]) ... Y[1023] = conjugate(X[1])

如果您使用 Matlab,您需要将“1”添加到所有索引,因为 Matlab 从 1(而不是 0)开始计数。

反射是正常的:这称为混叠或频率折叠,当您采样的信号超过所谓的奈奎斯特频率(恰好是采样频率的一半)时,就会发生这种情况。理想情况下,正是出于这个原因,您希望采样频率至少是您正在采样的信号频率的两倍。