我正在尝试从信号样本的FFT中重建原始信号。当进行逆FFT时,我只能得到振幅信息(只有一列)。如何获取对应的时间坐标?
这是我的原始信号的屏幕截图,用0.001s的步长从0到10s记录下来。当我使用IFFT时,我得到了与我的信号相同数量的数据点,但找不到相应的时间信息。

如何获取正确的时间信息?
我包含了我使用的Python代码和两个信号的曲线图。
#generating signal here
import numpy as np
k = float ( 3.1416*2)
f1 = 100
f2 = 150
f3 = 250
ds = max(f1,f2,f3)
ds = float(4*ds)
dt = 1.000/ds
lf = min (f1,f2,f3)
lT = 1.00/lf
N = 10 # cycles
totaltime = N*lT
data = []
tt = []
mf = 1/dt
print "TotalTime =", totaltime
for t in np.arange(0.0, totaltime,dt/100 ) :
#t = tk/mf
print t
wave1 = np.sin(k*f1*t)
wave2 = np.sin(k*f2*t)
wave3 = np.sin(k*f3*t)
summ = wave1 + wave2 + wave3
print t," ", summ
tt.append(t)
data.append(summ)
print tt
print data
np.savetxt("data.txt",np.c_[tt,data])
#######################
#taking the FFT here
fourier = []
tt =[]
yy=[]
logname = str("data.txt")
with open (logname,"rb") as wdata:
for line in wdata :
if not line.startswith("#") :
sl = line.split()
c11 = float(sl[0])
#c11 = c1*10**(-12)
c2 = float(sl[1])
tt.append(c11)
yy.append(c2)
n = len(yy)
n1 = len(tt)
print "n=",n,"(",n1,")"
#to calculate the time step , find the difference between 2 time-values
t0 = float(tt[0])
print "t0=",t0
t1 = float(tt[1])
print "t1=",t1
ts = t1 - t0
print "ts=", ts
yf = numpy.fft.fft(yy)
yf_abso = numpy.abs(yf)
freq = numpy.fft.fftfreq(n,d=ts)
numpy.savetxt('fft-data.txt',numpy.c_[freq,yf_abso])
######################
# taking the inverese FFT
filename = str("fft-data.txt")
FFTdata =[]
FREQdata = []
with open (filename,'r') as fftfile :
for line in fftfile :
if not line.startswith("#") :
split_line = line.split()
fpoint = float(split_line[1])
freqz = float(split_line[0])
FFTdata.append(fpoint)
FREQdata.append(freqz)
ireverse = np.fft.ifft(FFTdata)
reverse = np.abs(ireverse)
print type(reverse)
np.savetxt ("ireverse.txt", ireverse)
np.savetxt("reverse.txt", reverse)发布于 2019-01-21 23:56:45
IFFT输出的采样位置与FFT输入的采样位置相同。你做对了这一部分。
IFFT的输出看起来是移位的,但事实并非如此。发生的情况是,当您保存频谱的相位信息时,将其丢弃。你做了
yf_abso = numpy.abs(yf)然后拯救yf_abso。通过获取绝对值,您已经丢弃了重要信息。FFT产生复数值是有原因的。丢弃一半的信息意味着你不能再重建原始信号了。
如果您保存复数值,并在代码的最后部分使用这些值来计算IFFT,那么IFFT输出的实部将与您的输入信号匹配。虚部应该接近于零,这只是由于浮点计算中的数值精度问题而不同。
https://stackoverflow.com/questions/54258237
复制相似问题