我有一个关于scipy.fft包的问题,以及我如何使用它来生成脉冲的傅里叶变换。
我试图在将来为任意脉冲做这个,但我想让它尽可能简单,所以我一直在尝试FFT时域矩形脉冲,它应该产生一个频域Sinc函数。您可以在此处查看更多信息:https://en.wikipedia.org/wiki/Rectangular_function
根据我对FFT的理解,信号需要重复和周期性,所以在像矩形脉冲这样的情况下,我需要移动它以使FFT算法“看到”它作为对称脉冲。 / p>
当我观察傅立叶变换的实部和虚部时,我的问题就出现了。我期望矩形脉冲(因为它是真实的,甚至是功能的)是真实的和对称的。但是,我注意到有虚构的组件,即使我不使用复数。
我的方法如下:
我附上的图表显示了我的尝试并概述了这些步骤。
这是我关于堆栈溢出的第一个问题,所以我无法发布图片,但是imgur相册的链接在这里:https://imgur.com/a/geufY
我的频率相位信息有问题,从imgur文件夹中的图像来看,我的相位差线性增加,在理想情况下应该是平坦的。
我预计这是一个问题,我如何移动我的输入脉冲,并尝试了其他几种方法(我可以发布它们,如果这会有帮助)
任何有关这方面的帮助都会非常感激,我一直在倾注例子但这些主要是指无限正弦函数而不是脉冲。
我的代码如下所示:
import numpy as np
import scipy.fftpack as fft
import matplotlib.pyplot as plt
'''Numerical code starts here'''
#Define number of points and time/freq arrays
npts = 2**12
time_array = np.linspace(-1, 1, npts)
freq_array = fft.fftshift(fft.fftfreq(len(time_array), time_array[1]-time_array[0]))
#Define a rectangular pulse
pulse = np.zeros(npts)
pulse_width = 100
pulse[npts/2 - pulse_width/2:npts/2 + pulse_width/2] = 1
#Shift the pulse so that the function is symmetrical about origin
shifted_pulse = fft.fftshift(pulse)
#Calculate the fourier transform of the shifted pulse
pulse_frequencies = fft.fftshift(fft.fft(shifted_pulse))
'''Plotting code starts here'''
#Plot the pulse in the time domain
fig, ax = plt.subplots()
ax.plot(time_array, pulse)
ax.set_title('Time domain pulse', fontsize=22)
ax.set_ylabel('Field Strength', fontsize=22)
ax.set_xlabel('Time', fontsize=22)
#Plot the shifted pulse in the time domain
fig, ax = plt.subplots()
ax.plot(time_array, shifted_pulse)
ax.set_title('Shifted Time domain pulse', fontsize=22)
ax.set_ylabel('Field Strength', fontsize=22)
ax.set_xlabel('Time', fontsize=22)
#Plot the frequency components in the frequency domain
fig, ax = plt.subplots()
ax.plot(freq_array, np.real(pulse_frequencies), 'b-', label='real')
ax.plot(freq_array, np.imag(pulse_frequencies), 'r-', label='imaginary')
ax.set_title('Pulse Frequencies real and imaginary', fontsize=22)
ax.set_ylabel('Spectral Density', fontsize=22)
ax.set_xlabel('Frequency', fontsize=22)
ax.legend()
#Plot the amplitude and phase of the frequency components in the frequency domain
fig, ax = plt.subplots()
ax.plot(freq_array, np.abs(pulse_frequencies), 'b-', label='amplitude')
ax.plot(freq_array, np.angle(pulse_frequencies), 'r-', label='phase')
ax.set_title('Pulse Frequencies intenisty and phase', fontsize=22)
ax.set_ylabel('Spectral Density', fontsize=22)
ax.set_xlabel('Frequency', fontsize=22)
ax.legend()
plt.show()