Как извлечь информацию из временной области при воссоздании сигнала, взяв обратное БПФ - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь воссоздать исходный сигнал из БПФ образца сигнала. Принимая обратное БПФ, я получаю только информацию об амплитуде (только один столбец). Как я могу получить соответствующие временные координаты?

Это снимок экрана моего исходного сигнала, записанного от 0 до 10 с с шагом 0,001 с. Когда я принимаю IFFT, я получаю то же количество точек данных, что и мой сигнал, но не могу найти соответствующую информацию о времени.

This is the plot of 2 signals

Как я могу получить правильную информацию о времени?

Я включаю код кода 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)

1 Ответ

0 голосов
/ 21 января 2019

Места выборки для вывода IFFT такие же, как и для ввода в FFT.Вы делаете эту часть правильно.

Вывод IFFT выглядит смещенным, но это не так.В результате вы выбросили информацию о фазе частотного спектра, когда сохранили ее.Вы делаете

yf_abso = numpy.abs(yf)

и затем сохраняете yf_abso.Принимая абсолютное значение, вы выбросили важную информацию.Есть причина, по которой БПФ выдает сложные значения.Потеря половины этой информации означает, что вы больше не сможете восстановить исходный сигнал.

Если вы сохраняете комплексные значения и используете их в последней части вашего кода для вычисления IFFT, то реальный компонент выхода IFFT будет соответствовать вашему входному сигналу.Мнимый компонент там должен быть близок к нулю, отличаясь только из-за проблем числовой точности в вычислениях с плавающей запятой.

...