Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中提取特定频率的峰值_Python_Fft_Spectrum_Frequency Analysis - Fatal编程技术网

如何在python中提取特定频率的峰值

如何在python中提取特定频率的峰值,python,fft,spectrum,frequency-analysis,Python,Fft,Spectrum,Frequency Analysis,我想知道信号中特定频率下有多少能量。我用FFT得到频谱,频率步长由信号的长度决定 例如,我的光谱看起来如下: 我想得到特定频率下的频谱峰值,-0.08。然而,光谱的离散化仅给出-0.0729和-0.0833处的峰值 有没有办法改变频谱以确保在我想要的频率上有一个数据点?还是一种不必使用fft就可以得到值的方法 多谢各位 如果你有离散数据,但需要一个连续变量的输出,你就需要某种插值函数。对于请求值样式,我建议使用Scipy interp1d()。我相信这是达到预期效果的最快方法。当你进行DFT(

我想知道信号中特定频率下有多少能量。我用FFT得到频谱,频率步长由信号的长度决定

例如,我的光谱看起来如下:

我想得到特定频率下的频谱峰值,-0.08。然而,光谱的离散化仅给出-0.0729和-0.0833处的峰值

有没有办法改变频谱以确保在我想要的频率上有一个数据点?还是一种不必使用fft就可以得到值的方法


多谢各位

如果你有离散数据,但需要一个连续变量的输出,你就需要某种插值函数。对于请求值样式,我建议使用Scipy interp1d()。我相信这是达到预期效果的最快方法。

当你进行DFT(或任何傅里叶变换)时,你实际做的是测量你的信号有多少与特定频率的正弦“相交”。这是通过将信号的乘积与任意频率的波的复共轭求和来实现的。从技术上讲,这被称为内积,它是点积的推广,用于测量信号与另一信号的“接近程度”。因此,如果你只对一个频率感兴趣,不要考虑整个DFT,只要看一个你想要的

我不确定你的单位是什么,所以我假设你想要f0=-0.08赫兹的峰值(如果你的单位是其他单位,比如标准化为采样频率,那么你需要考虑)。这对应于复指数exp(2*pi*j*f0*t)。因为您正在采样,所以t是离散的,因此
t=n/fs
,其中fs是采样频率(以Hz为单位)

DFT有不同的定义;我很确定numpy的对应于我上面所说的。指数中的额外负数是因为它是复数共轭


注意,w实际上不太可能是周期性的。如果样本数量足够大,这并不重要。一个好的启发方法是至少10个周期。

非常感谢,这正是我想要的!你是对的,不需要在这里测量整个频谱。测量你的信号有多少与特定频率的正弦“相交”——直到现在我终于知道了,离学校5年了
# assuming you're using numpy arrays
w = exp(-2*pi*1j*f0*arange(len(signal))/fs)
peak = abs(sum(signal*w))