Все перечисленное ниже сделано в блокноте Jupyter. Я не переделал аналитическую ФТ Лоренца, поэтому там может быть ошибка. Я полагаю, что следующее право:
$$ FT \left( \frac{1}{\pi \Delta f} \frac{1} {1 + (\frac{f}{\Delta f})^2} \right) = e^{ 2 \pi \Delta f |t|} $$
import numpy as np
import matplotlib.pyplot as p
%matplotlib inline
start,stop,num=-.5,.5,1000
t=np.linspace(start,stop,num) # stop-start= 1.0 sec, inverse is frequency resolution , i.e 1 Hz
dt=(stop-start)/num
print(f'time interval: {dt} secs') # will be 1 millisecond, inverse is frequency span i.e -500 Hz to +500 Hz
freq = np.fft.fftfreq(num,dt)
# print(freq) # 0..499, -500.. -1 # unshifted; that can be useful, you don't need to shift to get the plots right
freq2 = np.fft.fftshift(freq)
# print(freq2) # -500.. 0 .. 499 # we need the shift because you want to compare a spectrum = f (frequency)
print(f'freq interval : {freq2[1] - freq2[0]} Hz')
# in numpy , given the time and frequency vectors we just made it is easy to get a function filled w/o a for loop
# let's assume that original_FT is a spectrum as is typical for a Lorentzian
df=5 # width of lorentzian
ori= 1/np.pi /df /(1 + (freq2/(df ))**2) # a lorentzian of variable width, FT of bisided exponential
print(f'integral over lorentzian {np.sum(ori):.3f}')
analytical= np.exp(-abs(t*df*2*np.pi )) # a bisided exponential (the envelope of a time dependency),
# the width has to be inversely proportional to the width of the Lorentzian
computed= np.abs(np.fft.fftshift(np.fft.fft(ori)))
p.figure(figsize=(10,4))
p.subplot(131)
p.plot(freq2,ori,label="orginal spectral data")
p.xlabel('frequencies/Hz')
p.title('freq. domain')
p.legend()
p.subplot(132)
p.plot(t ,analytical ,label='real FT')
p.plot(t ,computed ,label='calc ifft')
p.xlabel('time/secs')
p.title('time domain')
p.legend()
p.subplot(133)
p.plot(t[490:510],analytical[490:510],'.-',label='real FT')
p.plot(t[490:510],computed[490:510],'.-',label='calc ifft')
p.xlabel('time/secs')
p.title('zoomed in')
p.legend();