如何从信号中获取频率?

时间:2019-03-21 15:10:54

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

1 个答案:

答案 0 :(得分:0)

您似乎想要的是来自维基的信号Fourier Transform

  

傅里叶变换(FT)将时间(信号)的函数分解成组成它的频率

从本质上讲,这是一种数学运算,当将其应用于信号时,您可以了解每个频率在时间序列中的呈现方式。为了对此有所了解,查看DFT的数学定义可能会有所帮助:

enter image description here

这里k一直扫过t N-1,以计算所有DFT系数。

首先要注意的是,此定义有点类似于两个函数(在这种情况下为x(n)和负指数函数)之间的相关性。尽管这看起来有点抽象,但通过使用Euler's formula并稍加定义,DFT可以表示为与正弦波和余弦波的相关性,这将说明虚数。以及DFT的实部。

因此请记住,这实际上是在计算相关性,每当复杂指数与x(n)的分解所对应的正弦或余弦相乘时,X(K)中就会出现一个峰值,表示信号中存在这种频率。


因此,在给出了非常简短的理论背景之后,我们来看一个示例,以了解如何在python中实现它。让我们考虑following signal

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)

现在,可以使用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基频为中心的增量函数。可以在以下Table of Fourier Transform Pairs中进行检查。

因此对于使用的信号,我们将得到:

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

enter image description here