有人可以帮助解释这个 FFT 工作流程对我的信号做了什么,以及它为什么有效吗?

信息处理 fft
2021-12-19 14:11:11

我正在使用一台进行声学分析的设备。它通过获取时域信号并对其执行 FFT 以提取单个所需频率的幅度和相位来实现这一点,称为 f0。现在,我了解了 FFT。那部分很容易。但是,我不明白的是我在该仪器的 LabView 代码中发现的所有额外步骤的后果。这是程序:

  1. 获取时域信号并将校准系数应用于每个点。
  2. 从信号中减去平均值以去除直流分量
  3. 通过将复时域信号乘以 cos(2πf0) - i sin(2πf0) 在 f0 处混合纯音
  4. 使用精确布莱克曼的窗口
  5. 执行 FFT
  6. 取输出的直流分量,除以 N/2(其中 N 是时域中的样本数)
  7. 从直流分量获取 f0 处的幅度和相位

具体来说,我对第 3 步如何让我通过查看 FFT 输出的直流分量来获得 f0 的值感到困惑。我使用 numpy.fft.fft 和一些模拟信号在 python 中重新创建了这个,我得到了类似的结果。

归根结底,我想这听起来像是一个理论/数学问题。

4个回答

伯德的回答是对的。

所描述的设置是锁定放大器的实现。

锁定放大器充当非常窄带的滤波器,用于检测隐藏在噪声中的已知信号的存在。

如果您将两个信号(都是简单的正弦波)相乘,您会得到一个新信号,该信号包含的频率是原始两个信号之和,频率是原始两个信号之差。(1000Hz * 200Hz 给出 800Hz 与 1200Hz 混合的输出。)此过程用于无线电接收器,以将接收到的无线电信号降低到更便于进行进一步处理的频率。

您的 LabView 程序利用这种效应来检测信号与参考信号相比的幅度和相位。

输入信号与参考信号之差为 0Hz 的信号——即直流。您将其从 FFT 结果中的 bin 0 中取出。

如果输入的频率和参考的频率不同,那么差异会落在另一个 bin 中,并且会被您的检测器忽略。

从样本集中移除 DC 偏移也很有意义——输入中的任何真实 DC 都将覆盖从外差步骤生成的 DC。

至于您的设备为什么这样做,它可能是为了它可以恢复传输的信号以判断有多少信号返回到接收器,并且无论接收到的信号多么微弱或噪声有多大,它都可以做到这一点存在。

既然你说它也需要输出的相位,它可能会将它用作测量距离的一部分。

你没有说结果是用来做什么的,或者你在什么条件下使用它,所以我不能说更多关于“为什么”的内容。

正在发生的是 I/Q 解调的一种变体,使用 FFT 在批处理模式下完成。

首先,快速傅里叶变换只是一种快速实现离散傅里叶变换的算法;所以它是 DFT 的完美子集。您正在做的事情适用于整个 DFT。

(现在我得到了所有的数学。或者数学,如果我想移民到他们说英语的地方)。

其次,DFT定义为

Xk=n=0N1xnej2πknN

因此,如果我将调制信号定义为对于某个整数,那么通过上述定义yn=xnej2πk0Nnk0

Yk=n=0N1xn(ej2πk0nN)ej2πknN

但我可以简化一下:

Yk=n=0N1xnej2π(k+k0)nN

但是,您几乎可以直观地将其与我的第一个等式进行比较,以获得Yk=Xk+k0

这是一种非常冗长的说法,如果你在时域中乘以一个旋转向量 ( ),那么结果的频谱会随着旋转向量的频率而上移. 在你的情况下,向量有一个负频率(因为),所以你正在转移任何有趣的事情发生在下降到 DC。ejωtcos2πftjsin2πft=ej2πtf0

当您将时域序列乘以时,您将获得复值序列,其频谱是的频谱,在负频率方向上 Hz。因此,如果 Hz处有一个频谱分量,则该频谱分量将在新序列中的 DC(零 Hz)处出现。并且新序列的 DC 频谱分量的相位将是频谱分量的相位。x(n)ej2πfon/Fs=cos(2πfon/Fs)jsin(2πfon/Fs)x(n)fox(n)+fox(n)+fo

在我看来像一个锁定放大器