如何从信号中获得频率?

2024-04-20 00:34:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找接收信号频率的方法。
让我们一起创建一个示例

signal = [numpy.sin(numpy.pi * x / 2) for x in range(1000)]

这个数组将代表录制的声音的样本。(x=毫秒)
sin(pi*x/2)=>;250 Hrz

现在我们不知道函数是什么样子。我们刚收到信号(点列表)。我们如何从这个阵列接收频率?你知道吗

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


Tags: 方法innumpy声音示例forsignal信号
1条回答
网友
1楼 · 发布于 2024-04-20 00:34:59

似乎你想要的是来自wiki的信号的Fourier Transform

The Fourier transform (FT) decomposes a function of time (a signal) into the frequencies that make it up

这本质上是一个数学运算,当应用在一个信号上时,它会让你知道每个频率在时间序列中是如何呈现的。为了得到这背后的一些直觉,不妨看看DFT的数学定义:

enter image description here

其中k这里被一直扫到tN-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)

现在,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

相关问题 更多 >