python - 如何通过逆 FFT 重建信号时提取时域信息

标签 python fft

我正在尝试从信号样本的 FFT 中重新创建原始信号。进行逆 FFT 时,我仅获得幅度信息(仅一列)。如何获取对应的时间坐标?

这是我的原始信号的屏幕截图,从 0 到 10 秒记录,步长为 0.001 秒。当我进行 IFFT 时,我得到了与信号相同数量的数据点,但找不到相应的时间信息。

This is the plot of 2 signals

如何获取正确的时间信息?

我包含了我使用的 Python 代码和 2 个信号的绘图。

#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)

最佳答案

IFFT 输出的样本位置与 FFT 输入的样本位置相同。你做得对。

IFFT 的输出看起来发生了偏移,但事实并非如此。发生的情况是,您在保存频谱时丢弃了频谱的相位信息。你会的

yf_abso = numpy.abs(yf)

然后保存yf_abso。通过取绝对值,你就丢弃了重要的信息。 FFT 产生复数值是有原因的。丢弃一半的信息意味着您无法再重建原始信号。

如果您保存复数值,并在代码的最后部分使用这些数值来计算 IFFT,则 IFFT 输出的实数分量将与您的输入信号相匹配。虚部应该接近于零,只是由于浮点计算中的数值精度问题而有所不同。

关于python - 如何通过逆 FFT 重建信号时提取时域信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54258237/

相关文章:

python - 使用正则表达式匹配任意数量的字符,只要第一个字符不是数字

python - 使用共享数组在 Python 中实现快速 FFT 的内存对齐

c++ - 从 fft 重建信号

algorithm - 使用 FFT 查找所有可能的固定大小子集和

python - 在 python 中使用 try except - 成本是多少?

python - 在 VSC 中,如何在 Python 中重命名模块时激活 "refactor preview"?

python - 使用 CUDA 或 OpenCL 在 python 中进行多维 FFT

matlab - 这个 STFT 图的解释是什么?

python - 在Python中,如何提取较长字符串中跨越某个索引的所有子字符串?

python - 在 python 中处理长整数除法