Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python IFFT-FFT后的x轴缩放_Python_Numpy_Signal Processing_Fft - Fatal编程技术网

Python IFFT-FFT后的x轴缩放

Python IFFT-FFT后的x轴缩放,python,numpy,signal-processing,fft,Python,Numpy,Signal Processing,Fft,有关详细信息,请参见下面的编辑 我有一个数据集,我需要对其执行IFFT,剪切其有价值的部分(通过与高斯曲线相乘),然后返回FFT。 首先是在角频率域,所以IFFT导致时域。然后FFT返回应该会再次导致角频率,但我似乎找不到一个解决方案如何返回原始域。当然,y值很简单: yf=np.fft.ifft(y) #在那里切割有价值的部分。。 np.fft.fft(yf) 对于x值变换,我使用以下方法: #x在ang中。频域,这就是2*np.pi划分的原因 t=np.fft.fftfreq(len(x)

有关详细信息,请参见下面的编辑

我有一个数据集,我需要对其执行IFFT,剪切其有价值的部分(通过与高斯曲线相乘),然后返回FFT。 首先是在角频率域,所以IFFT导致时域。然后FFT返回应该会再次导致角频率,但我似乎找不到一个解决方案如何返回原始域。当然,y值很简单:

yf=np.fft.ifft(y)
#在那里切割有价值的部分。。
np.fft.fft(yf)
对于x值变换,我使用以下方法:

#x在ang中。频域,这就是2*np.pi划分的原因
t=np.fft.fftfreq(len(x),d=(x[1]-x[0])/(2*np.pi))
然而

x=np.fft.fftfreq(len(t),d=2*np.pi*(t[1]-t[0]))
完全没有给我原始的x值。这是我误解的吗

这个问题可以概括地提出,例如:

将numpy导入为np
x=np.arange(100)
xx=np.fft.fftfreq(len(x),d=x[1]-x[0])
#如何从xx处取回原始x?有可能吗?
我曾尝试使用一个临时变量来存储原始的x值,但它不太优雅。我正在寻找fftfreq的某种逆函数,通常是该问题的最佳解决方案。 多谢各位

编辑: 我将在最后提供代码。 我有一个数据集,x轴上有角频率,y轴上有强度。我想从IFFT转换到时域。不幸的是,x值不是 间隔均匀,因此在IFFT之前首先需要(线性)插值。然后在时域中,变换如下所示:

下一步是用高斯曲线切割一个对称尖峰,然后FFT返回角频域(与我们开始的位置相同)。我的问题是,当我从x轴变换IFFT时(我认为这是正确的),我无法回到原始的角频域。下面是代码,其中还包括数据集的生成器

将numpy导入为np
将matplotlib.pyplot作为plt导入
进口西皮
从scipy.interpolate导入interp1d
C_灯=299.792
#对于更简单的情况,该值为零,因此可以忽略它。
定义显示(x,GD=0,GDD=0,TOD=0,FOD=0,QOD=0):
返回x*GD+(GDD/2)*x**2+(TOD/6)*x**3+(FOD/24)*x**4+(QOD/120)*x**5
#生成示例数据集的生成器
def发生器(启动、停止、居中、延迟、GD=0、GDD=0、TOD=0、FOD=0、QOD=0、分辨率=0.1、脉冲持续时间=15、啁啾=0):
窗口=(np.sqrt(1+啁啾**2)*8*np.log(2))/(脉冲持续时间**2)
lamend=(2*np.pi*C_灯)/开始
lamstart=(2*np.pi*C_灯)/停止
lam=np.arange(lamstart,lamend+分辨率,分辨率)
ω=(2*np.pi*C_光)/lam
relom=欧米茄中心
i_r=np.exp(-(关系)**2/(窗口))
i_s=np.exp(-(关系)**2/(窗口))
i=i_r+i_s+2*np.sqrt(i_r*i_s)*np.cos(_disp(relom,GD=GD,GDD=GDD,TOD=TOD,FOD=FOD,QOD=QOD)+延迟*omega)
#因为_disp多项式被设置为零,所以它只是cos(延迟*omega)
返回ω,i
def国际刑警组织(x,y):
“简单线性插值”
xs=np.linspace(x[0],x[-1],len(x))
intp=INTP1D(x,y,种类=线性,填充值=外推)
ys=intp(xs)
返回xs,ys
定义ifft_方法(initSpectrumX,initSpectrumY,插值=真):
如果len(initSpectrumY)>0且len(initSpectrumX)>0:
Ydata=初始频谱
扩展数据=initSpectrumX
其他:
升值误差
N=len(扩展数据)
如果插入:
扩展数据,Ydata=国际刑警组织(扩展数据,Ydata)
#(2*np.pi)除法是因为我们有角频率,而不是频率
xf=np.fft.fftfreq(N,d=(扩展数据[1]-Xdata[0])/(2*np.pi))*N*Xdata[-1]/(N-1)
yf=np.fft.ifft(Ydata)
其他:
在那里传递一些不相关的代码
返回xf,yf
def fft_方法(初始频谱x、初始频谱y):
如果len(initSpectrumY)>0且len(initSpectrumX)>0:
Ydata=初始频谱
扩展数据=initSpectrumX
其他:
升值误差
yf=np.fft.fft(Ydata)
xf=np.fft.fftfreq(len(Xdata),d=(Xdata[1]-Xdata[0])*2*np.pi)
#问题就在这里,我在这里转换x值。
xf=np.fft.ifftshift(xf)
返回xf,yf
#生成的数据
x、 y=发生器(1,3,2,延迟=1500,分辨率=0.1)
#平面图(x,y)
xx,yy=ifft_方法(x,y)
#如果x值正确缩放,则两个对称尖峰应正好出现在延迟值处
#平面图(xx,np.abs(yy))
#在那里切割,现在也无关紧要了
#问题就在这里,在fft_方法中。x值与变换前不同。
xxx,yyy=fft_方法(xx,yy)
平面图(xxx,np.abs(yyy))
#它应该是这样的:
#xs=np.linspace(x[0],x[-1],len(x))
#plt.plot(xs,np.abs(yyy))
plt.grid()
plt.show()

fftfreq
不计算FFT。它所做的只是描述FFT输出的x轴。你不能用它来确定IFFT的x轴,我知道它不计算FFT。np.fft.fft可以。我对x轴的正确变换感兴趣。试着用数据集的近似形式生成一个合成示例。你的频谱可能是真实的。然后其他人就可以轻松地运行这个。查找解释起来很长,但我很快就会编辑这篇文章。我添加了一个可复制的示例。
fftfreq
不计算FFT。它所做的只是描述FFT输出的x轴。你不能用它来确定IFFT的x轴,我知道它不计算FFT。np.fft.fft可以。我对x轴的正确变换感兴趣。试着用数据集的近似形式生成一个合成示例。你的频谱可能是真实的。然后其他人就可以轻松地运行这个。查一下,解释起来很长,但我很快就会编辑这篇文章。我添加了一个可复制的例子。