为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

临摹微笑 2021-05-30 12:29:39
做一个简单的 FFT 运行来学习操作,我创建了一个 NumPy 数组,其中包含 100 个元素,其中包含一个数组中只有一个周期的正弦波。使用此代码:...n = 100x = 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 的幅度都不为零,我如何从数学上理解这一点?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

傅立叶变换

//img1.sycdn.imooc.com//60b59a5d0001b3dc05230088.jpg

Xk复数在哪里。虽然你x是实数,因此,你X[N-m] = X[m]*在你的情况,N=100, m=1因此,你必须X[ 1 ] = X[99]

在处理实数时,numpy提供了另一个功能numpy.fft.rfft

当为纯实数输入计算 DFT 时,输出是厄米对称的,即负频率项只是相应正频率项的复共轭,因此负频率项是多余的。此函数不计算负频率项,因此输出的转换轴的长度为n // 2 + 1。


查看完整回答
反对 回复 2021-06-01
?
开满天机

TA贡献1786条经验 获得超13个赞

标准的完整 DFT 或 FFT 是 NxN 复数到复数线性基变换,其结果作为由复数元素组成的 N 元素向量返回,每个复数结果元素由实部和虚部组成。需要一个复杂的结果来表示每个频率分量的大小和相位(因此不会造成信息损失)。虚部和实部的反正切表示每个频率分量的相位。

如果使用严格的实数输入(不包含非零虚部)输入FFT,则希望FFT结果表示严格的实数信号。当 FFT 返回具有非零虚数分量的复数结果(如果相位非零时需要),这怎么可能?通过为每个信号返回两个分量,这两个分量的大小相等,但它们的虚分量相反,因此虚分量被抵消。您仍然需要每个结果元素的虚部,以便您可以测量相位。但是,从整个FFT结果来看,两个复数值中的虚部分量总和为零,因此代表了严格的实数输入信号(无虚部)。

因此,当给定严格的实数输入时,完整的 FFT 必须是复共轭镜像对称的

因此,对于输入中的每个频率分量,您都会在FFT结果中看到(至少)两个相等的幅度值。当馈送具有非零虚分量的FFT复数输入时,情况并非如此,这在许多物理方程式和信号处理算法中很常见。

补充:为什么FFT为什么必须返回一个复杂的结果,而不仅仅是幅度和相位角?FFT代表快速傅立叶变换。使 FFT 快速的一件事是,它是一种线性变换,只需乘法和加法即可计算出算术(在此过程中加上一些巧妙的数据改组)。实部和虚部可以仅用线性算术计算。而计算相位需要反正切(或atan2()),这是一个慢得多的非线性先验算子。


查看完整回答
反对 回复 2021-06-01
  • 3 回答
  • 0 关注
  • 352 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号