如何使用FFT计算数据频率?

Mic*_*ael 8 algorithm signal-processing fft c#-3.0

我想知道数据的频率.我有点想到它可以使用FFT完成,但我不知道该怎么做.一旦我将整个数据传递给FFT,它就会给我2个峰值,但我怎样才能获得频率?

非常感谢提前.

Ste*_*joa 10

假设x[n] = cos(2*pi*f0*n/fs)其中f0的单位是赫兹正弦波的的频率,n=0:N-1fs是的采样率x在每秒采样.

我们X = fft(x).双方xX具有长度N.假设Xn0和处有两个峰值N-n0.

那么正弦波频率f0 = fs*n0/N赫兹.

示例:fs=每秒8000个样本,N= 16000个样本.因此,x持续两秒钟.

假设X = fft(x)在2000和14000(= 16000-2000)处有峰值.因此,f0= 8000*2000/16000 = 1000Hz.


Jer*_*wen 8

以下是您可能正在寻找的内容:

当你谈到计算信号的频率时,你可能对组件正弦波不太感兴趣.这就是FFT给你的.例如,如果你总和sin(2*pi*10x)+ sin(2*pi*15x)+ sin(2*pi*20x)+ sin(2*pi*25x),你可能想要检测"频率" "为5(看看这个功能的图表).但是,该信号的FFT将检测频率为5 的幅度0.

你可能更感兴趣的是信号的周期性.也就是说,信号变得最像自己的间隔.所以你最想要的就是自相关.仔细看看.这基本上可以衡量信号在被移位一定量后自身与自身相似的程度.因此,如果您在自相关中找到一个峰值,那么这表明信号在移动超过该量时与自身匹配良好.它背后有很多很酷的数学,如果你有兴趣可以查一下,但是如果你只想让它工作,那就这样做:

  1. 使用平滑窗口(余弦将会这样做)窗口信号.窗口应该至少是您想要检测的最大周期的两倍.大3倍会产生更好的结果).(如果您感到困惑,请参阅http://zone.ni.com/devzone/cda/tut/p/id/4844).

  2. 采用FFT(但是,确保FFT大小是窗口的两倍,后半部分用零填充.如果FFT大小只是窗口的大小,你将有效地采用循环自相关,不是你想要的.请参阅https://en.wikipedia.org/wiki/Discrete_Fourier_transform#Circular_convolution_theorem_and_cross-correlation_theorem)

  3. 用它们的平方值(real ^ 2 + imag ^ 2)替换FFT的所有系数.这实际上是在进行自相关.

  4. 拿iFFT

  5. 找到iFFT中最大的峰值.这是波形的最强周期.实际上你可以更聪明地选择哪个峰值,但对于大多数用途来说,这应该足够了.要查找频率,只需f = 1/T.


Dir*_*nux 6

如果您有一个频率的信号(例如:

y = sin(2 pi f t)
Run Code Online (Sandbox Code Playgroud)

附:

  • 时间信号
  • f中心频率
  • 时间

然后你将获得两个峰值,一个峰值对应于f,一个峰值对应于-f.

因此,要达到一个频率,可以丢弃负频率部分.它位于正频率部分之后.此外,数组中的第一个元素是直流偏移,因此频率为0.(请注意,此偏移量通常远大于0,因此其他频率成分可能会相形见绌.)

在代码中:(我在python中编写它,但它在c#中应该同样简单):

import numpy as np
from pylab import * 
x = np.random.rand(100) # create 100 random numbers of which we want the fourier transform
x = x - mean(x) # make sure the average is zero, so we don't get a huge DC offset.
dt = 0.1 #[s] 1/the sampling rate
fftx = np.fft.fft(x) # the frequency transformed part
# now discard anything  that we do not need..
fftx = fftx[range(int(len(fftx)/2))]
# now create the frequency axis: it runs from 0 to the sampling rate /2
freq_fftx = np.linspace(0,2/dt,len(fftx))
# and plot a power spectrum
plot(freq_fftx,abs(fftx)**2)
show()
Run Code Online (Sandbox Code Playgroud)

现在频率位于最大峰值.


hot*_*aw2 5

如果您正在查看最常用类型的 FFT 的幅度结果,那么实际数据的强正弦频率分量将出现在两个位置,一个在下半部分,加上其复共轭镜像在上半部分. 这两个峰值都代表相同的频谱峰值和相同的频率(对于严格的真实数据)。如果 FFT 结果 bin 编号从 0(零)开始,则最有可能是 FFT 结果下半部分的 bin 表示的正弦分量的频率。

Frequency_of_Peak = Data_Sample_Rate * Bin_number_of_Peak / Length_of_FFT ;
Run Code Online (Sandbox Code Playgroud)

确保在上述等式中计算出合适的单位(以获得每秒、每两周、每千秒等的周期单位)

请注意,除非数据的波长是FFT 长度的精确整数约数,否则实际峰值将在 bin 之间,从而在多个相邻的 FFT 结果 bin 之间分配能量。因此,您可能需要进行插值以更好地估计频率峰值。找到更精确频率估计的常见插值方法是 3 点抛物线和 Sinc 卷积(这与使用零填充更长的 FFT 几乎相同)。


小智 -9

频率=速度/波长。

波长是两个峰之间的距离。