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处的频谱幅值应该是信号幅值的一半。
因此,对于一个单一频率的正弦波信号,在时域和频域中,其振幅大小都可以用相同的值来表示,即:
- 在时域中,振幅等于信号波形的峰值或峰-峰值。
- 在频域中,振幅等于该频率处的频谱幅值,即信号在该频率上的能量贡献。对于一个单一频率的正弦波信号,其在该频率处的频谱幅值等于信号幅值的一半。
对于一个单一频率的正弦波信号,其双边谱中该频率分量的幅值应该是信号振幅的一半。而单边谱中的幅值则应该是双边谱中该频率分量幅值的两倍。