当前位置:   article > 正文

fft计算信号的频谱_fft计算频率

fft计算频率

fft计算信号频谱的原理

fft将信号从时域转换到频域时,计算频率和幅值以及相位的公式

fft计算频率的原理

以cos(2*pi*2000t)为例,按照上面的原理,计算这个信号的频谱

为什么对fft计算得到的幅值进行归一化?

python写fft函数计算单边谱和双边谱并进行分析

fft计算信号频谱的原理

FFT(快速傅里叶变换)是一种将信号从时域转换到频域的方法,其基本原理是将信号分解为不同频率的正弦和余弦波的线性组合。通过计算这些正弦和余弦波的振幅和相位信息,可以得到原始信号在频域上的表示。FFT算法通过使用分治算法和对称性质等优化技巧,可以高效地计算出这些频率成分fft将信号从时域转换到频域时,计算频率和幅值以及相位的公式的振幅和相位信息,从而实现了快速的频谱分析。

fft将信号从时域转换到频域时,计算频率和幅值以及相位的公式

 fft计算频率的原理

计算频率的过程就是从信号中提取出这些正弦和余弦波的频率成分(本身频率)

 如果信号是cos(2*pi*2000t),按照上面的原理,如何计算这个信号的频谱显示呢

 计算幅值:

为什么要对计算的幅值进行归一化?

在使用 FFT 算法计算离散信号的频谱时,通常会将得到的结果进行归一化。这是因为计算出来的幅值大小与采样点数N 有关,较大的 N 会导致计算得到的幅值变大,而较小的 N 会导致计算得到的幅值变小,从而影响不同采样点数下的幅值比较和分析

通过对 FFT 的结果进行归一化,可以消除采样点数对幅值大小的影响。具体而言,对于长度为 N 的信号 x[n],其 FFT 变换结果为 X[k],则归一化后的结果可以表示为:

 python写fft函数计算单边谱和双边谱并进行分析

对一个载波频率fc = 2000的余弦信号做fft变化,观察单边谱和双边谱的不同

  1. import numpy as np # 导入numpy包
  2. import matplotlib.pyplot as plt # 导入matplotlib.pyplot
  3. import numpy.fft as fft
  4. from scipy.fftpack import fft
  5. from scipy.fftpack import fftfreq
  6. #设置基本参数并绘制载波信号
  7. fc = 2000
  8. fs = 4*fc
  9. t = np.arange(0, 0.01, 1 / fs) # 采样频率fs=1000÷10=100
  10. y = np.cos(2*np.pi*fc*t) # y=sin(2*π*f*t) # 这里f=2
  11. plt.plot(t, y) # 绘制图形
  12. plt.xlabel('t(s)')
  13. plt.ylabel('f(Hz)')
  14. plt.title('y=cos(2*π*fc*t)')

这个余弦信号不光滑,比较尖锐,这是因为采样频率为4*fc,分辨率比较低。提高采样率为40*fc

  1. #绘制双边频谱
  2. def myfft(signal,fs):
  3. fft_signal = fft(signal) #fft计算
  4. amp = abs(fft_signal)/len(signal) # 计算得到幅值:利用fft计算得来的幅值要进行归一化,xiao'cu
  5. fre = fftfreq(len(signal), 1 /fs) #生成频率坐标 fftfreq(信号长度,1/采样率)
  6. return amp,fre # 返回幅度和频率
'
运行
  1. #绘制单边谱
  2. def myfft1(x,fs):
  3. fft_x = fft(x) # fft计算
  4. amp_x = abs(fft_x)/len(x)*2 # 纵坐标变换,len(x)是采样数
  5. label_x = np.linspace(0,int(len(x)/2)-1,int(len(x)/2)) # 生成频率坐标
  6. amp = amp_x[0:int(len(x)/2)] # 选取前半段计算结果即可
  7. # amp[0] = 0 # 可选择是否去除直流量信号
  8. #fs =1/( t[2]-t[1]) # 计算采样频率
  9. fre = label_x/len(x)*fs # 频率坐标变换
  10. #pha = np.unwrap(np.angle(fft_x)) # 计算相位角并去除2pi跃变
  11. return amp,fre # 返回幅度和频率
'
运行

 

 从双边谱中可见两点:

第一,频率存在负数,且其图像关于0Hz对称。在-2000Hz和2000Hz的地方存在很大的幅值
第二,频率是从-40000Hz到40000Hz(这个也是很重要的一点,fft得到的频率是采样频率的一半)

由单边谱可见:

对于一个单一频率的正弦波信号,其双边谱中该频率分量的幅值应该是信号振幅的一半。而单边谱中的幅值则应该是双边谱中该频率分量幅值的两倍。

对于一个单一频率的正弦波信号,其在f0​处的频谱幅值应该是信号幅值的一半。

因此,对于一个单一频率的正弦波信号,在时域和频域中,其振幅大小都可以用相同的值来表示,即:

  • 在时域中,振幅等于信号波形的峰值或峰-峰值。
  • 在频域中,振幅等于该频率处的频谱幅值,即信号在该频率上的能量贡献。对于一个单一频率的正弦波信号,其在该频率处的频谱幅值等于信号幅值的一半。

对于一个单一频率的正弦波信号,其双边谱中该频率分量的幅值应该是信号振幅的一半。而单边谱中的幅值则应该是双边谱中该频率分量幅值的两倍。 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/967788
推荐阅读
相关标签
  

闽ICP备14008679号