Python 如何从信号中获取频率?

Python 如何从信号中获取频率?,python,signals,fft,frequency,Python,Signals,Fft,Frequency,我正在寻找一种从信号中获得频率的方法。下面是一个例子: signal = [numpy.sin(numpy.pi * x / 2) for x in range(1000)] 此数组将表示录制的声音样本(x=毫秒) sin(pi*x/2)=>250 Hrz 我们如何从信号(点列表)中获得该阵列的频率 注意: 我读过很多Stackoverflow帖子,也看过很多youtube视频。我还没有找到答案。请用简单的词。 (我感谢你的每一个答案)你要找的就是 一点背景 让我们从以下内容开始: 傅立叶变

我正在寻找一种从信号中获得频率的方法。下面是一个例子:

signal = [numpy.sin(numpy.pi * x / 2) for x in range(1000)]
此数组将表示录制的声音样本(x=毫秒)

sin(pi*x/2)=>250 Hrz

我们如何从信号(点列表)中获得该阵列的频率

注意: 我读过很多Stackoverflow帖子,也看过很多youtube视频。我还没有找到答案。请用简单的词。
(我感谢你的每一个答案)

你要找的就是


一点背景 让我们从以下内容开始:

傅立叶变换(FT)将函数(通常是时间函数或信号)分解为其组成频率

这本质上是一个数学运算,当应用于一个信号时,可以让你了解每个频率在时间序列中的呈现方式。为了获得这一点背后的一些直觉,看看以下的数学定义可能会有所帮助:

其中,
k
这里一直向上扫掠t
N-1
,以计算所有的
DFT
系数

首先要注意的是,这个定义在某种程度上类似于两个函数的相关性,在本例中是
x(n)
和负指数函数。虽然这看起来有点抽象,但通过使用和玩弄定义,DFT可以表示为正弦波和余弦波的相关性,这将解释
DFT
的虚部和实部

因此,请记住,这本质上是计算相关性,每当复指数分解的对应正弦或余弦与
x(n)
匹配时,
x(K)
中将出现峰值,这意味着信号中存在该频率


我们怎么能对numpy做同样的事?

因此,给出了一个非常简短的理论背景,让我们考虑一个例子,看看如何在Python中实现这一点。让我们考虑一下:

现在,DFT可以通过使用来计算,如前所述,它将告诉您,现在在变换域中的信号中,每个频率的贡献是什么:

n = len(y) # length of the signal
k = np.arange(n)
T = n/Fs
frq = k/T # two sides frequency range
frq = frq[:len(frq)//2] # one side frequency range

Y = np.fft.fft(y)/n # dft and normalization
Y = Y[:n//2]
现在,如果我们画出实际的频谱,你会看到在50Hz的频率上有一个峰值,用数学术语来说,它是一个以50Hz的基频为中心的δ函数。这可以在下表中进行检查

对于上述信号,我们将得到:

plt.plot(frq,abs(Y)) # plotting the spectrum
plt.xlabel('Freq (Hz)')
plt.ylabel('|Y(freq)|')

你的问题是“我想做一个傅里叶变换,但我不知道它叫傅里叶变换”吗?如果是这样的话,NumPy就有了。
plt.plot(frq,abs(Y)) # plotting the spectrum
plt.xlabel('Freq (Hz)')
plt.ylabel('|Y(freq)|')