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变化,观察单边谱和双边谱的不同

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

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

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

 

 从双边谱中可见两点:

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

由单边谱可见:

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

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

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

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

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值