在 numpy 中使用 FFT 的频率分辨率问题

aks*_*128 3 python numpy scipy frequency-analysis

我使用泰克示波器来执行一些信号采集。我获得 10,000 个测量点(几个信号周期),并且必须对这组数据进行频率分析。我的信号是8MHz正弦波。当我使用 SciPy 或 NumPy 时,我得到相同的结果 - 频率分布太宽。两个值之间的距离是500kHz,最高频率是2.5GHz(荒谬)。当我想要测量 8MHz 左右的频率带宽时,我只能获得 7.5、8.0 和 8.5 MHz 的精确值。我尝试改变由 确定的样本间距,(x[1]-x[0])但没有得到更好的结果。

def CalculateFFT(t_val,p_val):
    x = t_val #Two parameters: [x,y] values
    y = lambda x: p_val
    com_signal = y(x) # Combined signal
    FFT_val = abs(scipy.fft(com_signal))
    freq_val = scipy.fftpack.fftfreq(len(com_signal), x[1]-x[0])
    spec_val = 20*scipy.log10(FFT_val)
    return freq_val, spec_val
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 5

值得更深入地阅读 DFFT 的工作原理,但您应该始终牢记以下公式。对于具有 n 个点和最大时间 Tmax 的时间序列,时间分辨率由下式给出: dt = Tmax / n

DFFT 将产生 n 个点

最大频率 = 1 / dt

dF = 1 / 最大温度

您似乎建议最大频率就足够了(因此时间分辨率还可以),但频率分辨率不够好:您需要在分辨率相同的情况下收集更多数据。