为什么类高斯函数经numpy FFT变换后在傅里叶空间不呈高斯形态?
numpy.fft结果异常原因与输出解读
绘图结果不符合预期的原因
- 输出顺序问题:
numpy.fft.fft()的默认输出没有将零频率分量放在数组中心,索引0位置对应直流分量,接下来依次排列正频率分量直到奈奎斯特频率,数组后半段则是负频率分量,按从接近-奈奎斯特频率向-1的顺序排列。实信号的傅里叶变换为共轭对称结构,类高斯信号的频谱本身也对称,所以你直接按数组索引绘图时,会看到左右两个对称的峰,而非单个居中的类高斯形态。 - 缺少频率轴映射:你直接使用数组索引作为x轴绘图,没有对应到真实的物理频率值,也无法体现正负频率的分布逻辑,进一步放大了观感上的不符合预期。
numpy.fft输出的正确解读方法
numpy.fft.fft()的输出数组每个位置的取值和对应频率严格绑定,你可以按以下步骤处理和解读:
- 首先获取对应频率轴:你需要已知原信号的采样步长
dx(即原函数x轴相邻两个采样点的间隔)和采样点数N = len(func),调用numpy.fft.fftfreq(N, dx)即可得到和fft输出数组一一对应的频率数组。 - 按需调整频谱展示形式:
- 如果你需要展示完整的对称频谱,调用
numpy.fft.fftshift()将零频率分量移动到数组中心,再绘图即可得到居中的类高斯形态,示例代码如下:
- 如果你需要展示完整的对称频谱,调用
import numpy as np from numpy.fft import fft, fftfreq, fftshift import matplotlib.pyplot as plt # 假设x为原函数的横坐标数组,func为原函数采样值数组 N = len(func) dx = x[1] - x[0] # 生成原始频率数组、计算fft freq = fftfreq(N, dx) func_fourier = fft(func) # 移频得到居中的频谱和对应频率轴 freq_shifted = fftshift(freq) amp_shifted = fftshift(np.abs(func_fourier)) # 绘图即可得到符合预期的类高斯频谱 plt.plot(freq_shifted, amp_shifted) plt.show()
- 如果你只需要正频率部分的频谱,直接取输出数组前半段和对应正频率绘制即可:
positive_freq = freq[:N//2] positive_amp = np.abs(func_fourier)[:N//2] plt.plot(positive_freq, positive_amp) plt.show()
内容的提问来源于stack exchange,提问作者trynerror
相关产品推荐
相关产品推荐

