我已经在我的Abaqus仿真中检索到一些信号以进行验证。真实信号应为300kHz时的理想正弦波,我使用scipy.fftpack.fft
对采样信号进行了fft运算。
但是我得到了一个奇怪的频谱,如下所示(对不起,我太懒了,无法将频谱的x轴缩放到正确的频率)。在同一图中,我将信号切成碎片,并在时域中进行了绘制。对于纯正弦波,我也重复了相同的过程。 这完全让我感到惊讶。如下代码所示,采样频率是信号频率的16.66倍。目前,我认为这是由于采样期间的误差很小。从理论上讲,Abaqus应该定期进行采样。如您所见,这里有一些小错误,因此我信号中的点看起来比理想信号更粗。但是,如此小的误差是否会在频谱上产生显着差异?否则,为什么频谱如此?
FYI2:这是用于产生上述数字的python代码
def myfft(x, k, label):
plt.plot(np.abs(fft(x))[0:k], label = label)
plt.legend()
plt.subplot(4,1,1)
for i in range(149800//200):
plt.plot(mysignal[200*i:200*(i+1)], 'bo')
plt.subplot(4,1,2)
myfft(mysignal,150000//2, 'fft of my signal')
plt.subplot(4,1,3)
[Fs,f, sample] = [5e6,300000, 150000]
x = np.arange(sample)
y = np.sin(2 * np.pi * f * x / Fs)
for i in range(149800//200):
plt.plot(y[200*i:200*(i+1)], 'bo')
plt.subplot(4,1,4)
myfft(y,150000//2, 'fft of a perfect signal')
plt.subplots_adjust(top = 2, right = 2)
FYI3:Here是我的信号,格式为.npy
和.txt
。信号很长。它具有150001点。 .txt
是Abaqus的原始文件。 .npy
格式是我用来生成上述图的格式-(1)移除了时间向量,(2)数据以一半精度进行了标准化。
答案 0 :(得分:2)
您使用的任何标准FFT算法均假设您提供的信号是均匀采样的。在这种情况下,均匀意味着时间间隔相等。您的信号显然不是被均匀采样的,因此FFT不会“看到”完美的正弦,而是“失真”。结果,您会看到FFT计算的所有这些其他频谱分量,以将失真的信号映射到频域。您现在有两个选择。重新采样信号,即对信号进行均匀采样并使用现成的FFT或进行非均匀FFT获得频谱。这是一个您可以用来计算non-uniform FFT的库。