Python用傅里叶移位定理求间隔30像素双方波FFT结果不匹配问题
问题原因及修正方案
你代码的问题来自3处核心逻辑错误,修正后即可让两个结果完全匹配:
- 相位因子的索引取值错误
你使用x=np.linspace(0,l,l)生成相位计算的索引,该数组最后一个值为l=512,而离散傅里叶变换的波数索引范围是0~511,直接用该数组计算会导致相位偏移量出错,应该替换为k = np.arange(l)。 - 移位量s设置错误
你设置的s=30是两个方波之间的空隙宽度,而傅里叶移位定理中的移位量是两个信号的整体偏移距离,即两个方波的中心间距:两个方波宽度各为20像素,中心间距为10(第一个方波半宽)+30(空隙)+10(第二个方波半宽)=50,所以s应设为50。 - 相位因子的符号错误
离散傅里叶移位定理规定:若空间域信号向右偏移s个像素,对应的傅里叶变换需要乘以相位因子exp(-1j * 2π * k * s / l),你当前使用的正号指数对应信号向左偏移,和实际移位方向不符。
修正后核心代码段
import numpy as np import matplotlib.pyplot as plt def magsq(arr): return np.abs(arr*np.conj(arr)) fig1,ax1=plt.subplots() l=512 test=np.zeros(l) a=int(len(test)/2) b=10 test[a-b:a+b]=1 ax1.plot(test) test2=np.zeros(l) test2[a-b:a+b]=1 test2[a+b+30:a+b+30+2*b]=1 ax1.plot(test2,'--') FT=np.fft.fft(test) # 以下为修正部分 k = np.arange(l) s=50 shift=FT*np.exp(-1j*2*np.pi*k*s/l) shifted=FT+shift FT=np.fft.fftshift(FT) shifted=np.fft.fftshift(shifted) shiftedi=magsq(shifted) FT2=np.fft.fft(test2) FT2=np.fft.fftshift(FT2) FT2I=magsq(FT2) fig2,ax2=plt.subplots() ax2.plot(shiftedi) ax2.plot(FT2I,'--')
内容的提问来源于stack exchange,提问作者kon_jing
相关产品推荐
相关产品推荐

