如何使用python FFT工具从实际信号中提取时域振幅?

如何使用python FFT工具从实际信号中提取时域振幅?,python,numpy,fft,Python,Numpy,Fft,我正在研究一个问题,我想提取和比较两个不同信号在每个频率的时域振幅。信号是真实世界的,所以有噪声和多个频率,所以我尝试在FFT世界中工作 我编写了一个函数,对数据集进行FFT,并返回振幅。对于模拟的纯正弦波,这似乎是可行的,但在实际数据集上执行时,振幅总是会衰减一定量 def amplitudePowerSpectrum(time,data): dt = np.zeros(time.size-1,) avgdt = np.mean(time[1:-1] - time[0:-2])

我正在研究一个问题,我想提取和比较两个不同信号在每个频率的时域振幅。信号是真实世界的,所以有噪声和多个频率,所以我尝试在FFT世界中工作

我编写了一个函数,对数据集进行FFT,并返回振幅。对于模拟的纯正弦波,这似乎是可行的,但在实际数据集上执行时,振幅总是会衰减一定量

def amplitudePowerSpectrum(time,data):
    dt = np.zeros(time.size-1,)
    avgdt = np.mean(time[1:-1] - time[0:-2])
    sampFreq = 1.0/(avedt)
    nyquistFreq = sampFreq/2.0  

    FFTData = np.abs(scipy.fftpack.fft(data))   
    ## Only care about positive frequencies
    FFTData = FFTData[0:len(FFTData)/2]
    ## This is how we get the power spectrum in terms of time-domain amplitudes
    amplitudeSpectrum = FFTData/len(FFTData)

    freqsData = scipy.fftpack.fftfreq(data.size, avgdt)
    freq = freqsData[0:len(freqsData)/2]        

    return (freq,amplitudeSpectrum,(sampFreq,nyquistFreq))
这是一个原始数据集的曲线图,后面是一个计算出的振幅谱。正如你所看到的,有两个特别不同的频率,上面还有其他噪声。

我希望图2中的振幅与图1中的时域振幅相匹配。但它们被一个相当不错的因素削弱了。最终目标是每个频率的输入(蓝色)和输出(红色)信号之间的比例因子


首先,在真实数据集上,在Fourier域中准确获得时域振幅是否可能?如果是,我错过了什么?我正在使用python numpy和scipy软件包

Numpys fft假设所有数据的dt都是相同的。如果不是,我建议使用np.interp。这可能是因为第四行的输入错误,其中引用了一个变量
avedt
,该变量未在函数范围内声明。此外,还不清楚变量
time
是什么。此外,采样频率应等于
1/len(数据)