python - 如何从信号中获取频率?

标签 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 视频。我还没有找到答案。请使用简单的词语。 (我很感谢每一个答案)

最佳答案

您要查找的内容称为 Fourier Transform

<小时/>

一些背景

让我们从 formal definition 开始:

The Fourier transform (FT) decomposes a function (often a function of time, or a signal) into its constituent frequencies

这本质上是一种数学运算,当应用于信号时,可以让您了解每个频率在时间序列中的存在程度。为了获得这背后的一些直觉,查看 DFT 的数学定义可能会有所帮助。 :

enter image description here

此处的 k 一直向上扫过 t N-1 以计算所有 DFT 系数。

首先要注意的是,这个定义有点类似于两个函数的相关性,在本例中是 x(n) 和负指数函数。虽然这看起来有点抽象,但通过使用 Euler's formula通过稍微研究一下定义,DFT 可以表示为与正弦波和余弦波的相关性,这将解释 DFT 的虚部和实部。

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

<小时/>

我们如何使用 numpy 做同样的事情?

在给出了非常简短的理论背景后,让我们考虑一个例子来看看如何在 python 中实现这一点。让我们考虑following signal :

import numpy as np
import matplotlib.pyplot as plt

Fs = 150.0;  # sampling rate
Ts = 1.0/Fs; # sampling interval
t = np.arange(0,1,Ts) # time vector

ff = 50;   # frequency of the signal
y = np.sin(2*np.pi*ff*t)

plt.plot(t, y)
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.show()

enter image description here

现在,可以使用 np.fft.fft 计算 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 基频为中心的 delta 函数。这可以在以下Table of Fourier Transform Pairs中检查表。

因此对于上述信号,我们会得到:

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

enter image description here

关于python - 如何从信号中获取频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55283610/

相关文章:

Python - 将日期时间参数传递到 SQL 命令中

django - 如何根据使用信号更新另一个模型的字段来更新模型字段?

linux - 编译 Fortran 示例时找不到 -lfftw

javascript - AnalyserNode.getByteFrequencyData中的数据对应什么时间窗口?

python - 两个按键分组的元组列表中的值求和

python - 如何通过管道将子进程调用传递给文本文件?

c - SIGALRM 的处理程序不起作用

performance - cuFFT 运行缓慢 - 有什么方法可以加速吗?

python - Pandas :将给定范围内的随机数分配给相等的列值

python - 如何在 Python 中添加处理程序和信号?