假设采样频率Fs,信号频率F,信号长度L,采样点数N。那么FFT以后结果就是一个为N点的复数。每个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。web
具体跟原始信号的幅度有什么关系呢?
1. 假设原始信号的峰值为A,那么FFT的结果的每一个点(除了第一个点直流份量以外)的模值就是A的N/2倍,而第一个点就是直流份量(即0Hz),它的模值是直流份量的N倍;
2. 每一个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流份量,它的相位是该频率的初相位,matlab以cos为底的,若信号时正弦形式sin(t),则变成cos(t-pi/2)便可。
采样频率Fs,被N-1个点平均分红N等份,每一个点的频率依次增长。为了方便进行FFT运算,一般N取大于信号长度L的2的整数次方。
例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式能够看出,Fn所能分辨到频率为为Fs/N。若是采样频率Fs为1024Hz,采样点数为1024点,则能够分辨到1Hz。
1024Hz的采样率采样1024点,恰好是1秒,也就是说,采样1秒时间的信号并作FFT,则结果能够分析到1Hz。若是采样2秒时间的信号,则N为2048,并作FFT,则结果能够分析到0.5Hz。
若是要提升频率分辨力,则必须增长采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。
假设FFT以后某点n用复数a+bi表示,该复数的模就是An=sqrt(a*a+b*b),相位就是Pn=atan2(b,a)。根据以上的结果,就能够计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn);对于n=1点的信号,是直流份量,幅度即为A1/N。
因为FFT结果的对称性,一般咱们只使用前半部分的结果,即小于采样频率一半的结果。编程
2、例子
假设咱们有一个信号,它含有5V的直流份量,频率为15Hz、相位为-30度、幅度为7V的交流信号以及一个频率为40Hz、相位为90度、幅度为3V的交流信号。数学表达式为:
对x = 5 + 7*cos(2*pi*15*t - 30*pi/180) + 3*cos(2*pi*40*t - 90*pi/180)进行快速傅里叶变换。数据结构
咱们以128Hz的采样率对这个信号进行采样,总共采样256点。按照咱们上面的分析,Fn=(n-1)*Fs/N,咱们能够知道,每两个点之间的间距就是0.5Hz。咱们的信号有3个频率:0Hz、15Hz、40Hz
出于编程方便,由于直流份量的幅值A1/N,其余点幅值为An/(N/2),故直流份量最后要除以2才是对的。
通常FFT所用数据点数N与原含有信号数据点数L相同,这样的频谱图具备较高的质量,可减少因补零或截断而产生的影响。
Fs = 128; % 采样频率,无量纲,视为hz
T = 1/Fs; % 采样周期
L = 256; % 采样信号的信号长度
t = (0:L-1)*T; % 时间,一共2秒svg
x = 5 + 7*cos(2*pi*15*t - 30*pi/180) + 3*cos(2*pi*40*t - 90*pi/180); %cos为底原始信号
y = x + randn(size(t)); %添加噪声函数
figure;
plot(t,y)
title(‘加噪声的信号’)
xlabel(‘时间(s)’)xml
%%%%%%%%%%%%%信号处理&&&&&&&&&&&&&
N = 2^nextpow2(L); %采样点数,采样点数越大,分辨的频率越精确,N>=L,超出的部分信号补为0
%nextpow2的意思是靠近的2的次幂
%256靠近的2的次幂是8
Y = fft(y,N)/N*2; %除以N乘以2才是真实幅值,N越大,幅值精度越高,Y是虚数!
f = Fs/N*(0:1:N-1); %频率
A = abs(Y); %幅值
P = angle(Y); %相值htm
figure;
subplot(211);plot(f(1:N/2),A(1:N/2)); %函数fft返回值的数据结构具备对称性,所以咱们只取前一半
title(‘幅值频谱’)
xlabel(‘频率(Hz)’)
ylabel(‘幅值’)
subplot(212);plot(f(1:N/2),P(1:N/2));
title(‘相位谱频’)
xlabel(‘频率(Hz)’)
ylabel(‘相位’)blog