来自接近完美正弦波的奇怪FFT频谱

时间:2019-03-17 13:01:49

标签: signal-processing fft

我已经在我的Abaqus仿真中检索到一些信号以进行验证。真实信号应为300kHz时的理想正弦波,我使用scipy.fftpack.fft对采样信号进行了fft运算。

但是我得到了一个奇怪的频谱,如下所示(对不起,我太懒了,无法将频谱的x轴缩放到正确的频率)。在同一图中,我将信号切成碎片,并在时域中进行了绘制。对于纯正弦波,我也重复了相同的过程。 enter image description here 这完全让我感到惊讶。如下代码所示,采样频率是信号频率的16.66倍。目前,我认为这是由于采样期间的误差很小。从理论上讲,Abaqus应该定期进行采样。如您所见,这里有一些小错误,因此我信号中的点看起来比理想信号更粗。但是,如此小的误差是否会在频谱上产生显着差异?否则,为什么频谱如此?


FYI1:这是我的信号的fft放大频谱: enter image description here

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)数据以一半精度进行了标准化。

1 个答案:

答案 0 :(得分:2)

您使用的任何标准FFT算法均假设您提供的信号是均匀采样的。在这种情况下,均匀意味着时间间隔相等。您的信号显然不是被均匀采样的,因此FFT不会“看到”完美的正弦,而是“失真”。结果,您会看到FFT计算的所有这些其他频谱分量,以将失真的信号映射到频域。您现在有两个选择。重新采样信号,即对信号进行均匀采样并使用现成的FFT或进行非均匀FFT获得频谱。这是一个您可以用来计算non-uniform FFT的库。