为什么 FFT 结果显示单个频率样本的 2 个非零幅度?

做一个简单的 FFT 运行来学习操作,我创建了一个 NumPy 数组,其中包含 100 个元素,其中包含一个数组中只有一个周期的正弦波。使用此代码:


...

n = 100

x = np.fromfunction(lambda a: np.sin(2 * np.pi * a / n), (n,), dtype=float)

res = np.fft.fft(x)

...

中的结果res显示在2个不同的索引值处的非零幅度:


idx           real         imag          abs

---     ----------   ----------   ----------

...

  1:             0      -50.000       50.000

...

 99:             0       50.000       50.000

我只期望在索引1处看到一个非零振幅。


为什么索引 1 和 99 的幅度都不为零,我如何从数学上理解这一点?


临摹微笑
浏览 353回答 3
3回答

侃侃尔雅

傅立叶变换Xk复数在哪里。虽然你x是实数,因此,你X[N-m] = X[m]*在你的情况,N=100, m=1因此,你必须X[ 1 ] = X[99]在处理实数时,numpy提供了另一个功能numpy.fft.rfft当为纯实数输入计算 DFT 时,输出是厄米对称的,即负频率项只是相应正频率项的复共轭,因此负频率项是多余的。此函数不计算负频率项,因此输出的转换轴的长度为n // 2 + 1。

开满天机

标准的完整 DFT 或 FFT 是 NxN 复数到复数线性基变换,其结果作为由复数元素组成的 N 元素向量返回,每个复数结果元素由实部和虚部组成。需要一个复杂的结果来表示每个频率分量的大小和相位(因此不会造成信息损失)。虚部和实部的反正切表示每个频率分量的相位。如果使用严格的实数输入(不包含非零虚部)输入FFT,则希望FFT结果表示严格的实数信号。当 FFT 返回具有非零虚数分量的复数结果(如果相位非零时需要),这怎么可能?通过为每个信号返回两个分量,这两个分量的大小相等,但它们的虚分量相反,因此虚分量被抵消。您仍然需要每个结果元素的虚部,以便您可以测量相位。但是,从整个FFT结果来看,两个复数值中的虚部分量总和为零,因此代表了严格的实数输入信号(无虚部)。因此,当给定严格的实数输入时,完整的 FFT 必须是复共轭镜像对称的。因此,对于输入中的每个频率分量,您都会在FFT结果中看到(至少)两个相等的幅度值。当馈送具有非零虚分量的FFT复数输入时,情况并非如此,这在许多物理方程式和信号处理算法中很常见。补充:为什么FFT为什么必须返回一个复杂的结果,而不仅仅是幅度和相位角?FFT代表快速傅立叶变换。使 FFT 快速的一件事是,它是一种线性变换,只需乘法和加法即可计算出算术(在此过程中加上一些巧妙的数据改组)。实部和虚部可以仅用线性算术计算。而计算相位需要反正切(或atan2()),这是一个慢得多的非线性先验算子。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python