3

我使用泰克示波器来执行一些信号采集。我得到 10.000 个测量点(几个信号周期),我必须对那组数据进行频率分析。我的信号是 8MHz 正弦波。当我使用 SciPy 或 NumPy 时,我得到了相同的结果——频率分布得太宽了。两个值之间的距离是 500kHz,最高频率是 2.5GHz(荒谬)。当我想测量 8MHz 附近的频率带宽时,我只能得到 7.5、8.0 和 8.5MHz 的准确值。我试图改变由决定的样本间距(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
4

2 回答 2

3

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

一个 DFFT 将产生 n 个点

Fmax = 1 / dt

dF = 1 / Tmax

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

于 2013-07-15T19:21:47.100 回答
0

如果(1)采样时间太短,(2)您需要更高的估计频率精度,并且(3)您知道您的信号是正弦波,那么您可以将信号拟合为正弦波。就像如何使用 pylab 和 numpy 将正弦曲线拟合到我的数据中一样?,除了需要添加频率。

这是一个频率约为 8 MHz 的示例图:

带有拟合正弦波的图

下面是示例代码:

""" Modified from https://stackoverflow.com/a/16716964/6036470 """
from numpy import sin, linspace, pi,average;
from pylab import plot, show, title, xlabel, ylabel, subplot, scatter
from scipy import fft, arange, ifft
import scipy
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import leastsq

ff = 8e6;   # frequency of the signal
Fs = ff*128;  # sampling rate
Ts = 1.0/Fs; # sampling interval

t = arange(0,((1/ff)/128)*(128)*5,Ts) # time vector
A = 2.5;

ff_0 = 8.1456e6
y = A*np.sin(2*np.pi*ff_0*t+15.38654*pi/180) + np.random.randn(len(t))/5

guess_b = 0
guess_a = y.std()*2**0.5;
guess_c = 10*pi/180
guess_d = ff*0.98*2*pi

fig = plt.figure(facecolor="white")
plt.plot(t,y,'.', label='Signal Fred. %0.4f Hz'%(ff_0/1e6))
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.grid(alpha=0.5);

optimize_func = lambda x: (x[0]*np.sin(x[2]*t+x[1]) - y);
est_a,  est_c, est_d = leastsq(optimize_func, [guess_a, guess_c, guess_d])[0]
data_fit = est_a*np.sin(est_d*t+est_c) ;
plt.plot(t,data_fit,label='Fitted Est. Freq. %0.4f Hz'%(est_d/(2*pi)/1e6))
plt.legend()
plt.tight_layout();
plt.show();

fig.save("sinfit.png")
于 2016-03-08T21:46:55.930 回答