首页 > 编程知识 正文

fft快速算法基于什么原理(fft分析什么意思)

时间:2023-05-05 15:45:18 阅读:72575 作者:2288

转自: https://blog.csdn.net/cowena/article/details/50538672

FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。 虽然有些信号在时域中很难识别特征,但是转换到频域后,特征会变得容易识别。 这就是许多信号分析采用FFT变换的原因。 另外,FFT可以提取一个信号的频谱,这在频谱分析方面也很常用。

很多人都知道FFT是什么,能用来做什么,该怎么做,但不知道FFT之后的结果是什么意思,怎么决定做FFT要怎么用多少分。

现在根据实际经验谈谈FFT结果的具体物理意义。 一个模拟信号经过ADC采样变为数字信号。 采样定理表明,采样频率大于信号频率的两倍。 这些在这里不说明。

采样得到的数字信号可以进行FFT变换。 n个采样点可以经由FFT获得n个点的FFT结果。 为了便于FFT运算,通常n取2的整数次幂。 设采样频率为Fs、信号频率f、采样点数为n。 FFT的结果为n点的复数。 每个点都对应于频率点。 这一点的固有值是其频率值下的振幅特性。 具体和原始信号的幅度有什么关系呢? 假设原始信号的峰值为a,则FFT结果的各点(第一点的直流成分除外)的模式值为a的N/2倍。 第一个点是直流分量,其模式值是直流分量的n倍。 各点的相位是该频率下信号的相位。 第一点表示直流成分0Hz,最后一点n的再下一点(实际上不存在该点。 这里是假设的第N 1个点,也可以看作将第一点分成一半,将另一半移到最后)表示采样频率Fs,其中间在N-1个点平均被n等分,各点的频率依次增加。 例如,某点n表示的频率是Fn=(n-1 ) *Fs/N。

从上述公式可知,Fn能够识别的频率为Fs/N,如果采样频率Fs为1024Hz、采样点数为1024点,则能够识别到1Hz。

如果以1024Hz的采样率采样1024点,正好是1秒。 也就是说,如果对1秒钟的信号进行采样并进行FFT,则结果可以分析到1Hz。 如果对2秒钟的信号进行采样并进行FFT,则结果可以分析到0.5Hz。 为了提高频率分辨率,需要增加采样点数,也就是采样时间。 频率分辨率与采样时间呈倒数关系。

当将FFT之后的某一点n表示为复数a bi时,该复数的模式为An=根号a*a b*b,相位为pn=Atan2(b,a )。 根据以上结果,与n点(n1且n=N/2 )对应的信号的公式为an/(n/2 ) cos )2*pi*fn*tpn ),即2*an/n*cos )2* pi * ffn 由于FFT结果的对称性,通常只使用前半部分的结果,即小于采样频率一半的结果。

那么,说了很久,看着公式也会晕过去的。 用实际的信号说明。

假设包含2V的直流成分,有频率50Hz、相位-30度、振幅3V的交流信号和频率75Hz、相位90度、振幅1.5V的交流信号。 在数学式中,s=23*cos(2*pi*50*t-pi*30/180 ) 1.5 * cos (2* pi * 75 * TPI * 90/180 )式中的cos参数为弧度,因此为-30度根据以上分析,fn=(n-1 ) *Fs/N可知两个点的间隔为1Hz,第n个点的频率为n-1。 我们的信号有三个频率。 0Hz、50Hz、75Hz。 分别在第一个点、第五十一个点和第七十六个点出现峰值,其他各点应该接近0。 实际情况怎么样?

看看FFT结果的震级。

从图1 FFT的结果图可以看出,在第1点、第51点、第76点附近有比较大的值。 把这三点附近的数据分别拿来仔细看看。

1分: 512 0i 2分:-2.6195E-14 - 1.4162E-13i 3分:-2.8586E-14 - 1.1898E-13i 50分:-6.2076E-13 -2.1713E-12i 51分: 332.-2.2199E-13 -1.0076E-12i 76点: 3.4315E-12 192i 77点:-3.0263e-14(7.5609e-13I明显,1点、51点、76点的值比较大,其附带

接下来,计算各点的振幅值吧。 分别计算这三个点的模值,结果如下:

1点: 512

51时384分

76时192分

根据公式,直流分量为512/N=512/256=2;

50Hz信号的宽度为384/(n/2 )=384/(256/2 )=3;

75Hz信号的幅度为192/(n/2 )=192/(256/2 )=1.5。

可见光谱分析得到的幅度是正确的。

然后计算相位信息。 直流信号没有相位,请不要在意。 首先计算50Hz信号的相位,计算Atan2(-192、

332.55)=-0.5236,结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再计算75Hz信号的相位,atan2(192,3.4315E-12)=1.5708弧度,换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。

根据FFT结果以及上面的分析计算,我们就可以写出信号的表达式了,它就是我们开始提供的信号。

总结:假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以N);该点的相位即是对应该频率下的信号的相位。相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,这在一些实际的应用中是不现实的,需要在较短的时间内完成分析。解决这个问题的方法有频率细分法,比较简单的方法是采样比较短时间的信号,然后在后面补充一定数量的0,使其长度达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。具体的频率细分法可参考相关文献。

[附录:本测试数据使用的matlab程序]
close all; %先关闭所有图片
Adc=2;  %直流分量幅度
A1=3;   %频率F1信号的幅度
A2=1.5; %频率F2信号的幅度
F1=50;  %信号1频率(Hz)
F2=75;  %信号2频率(Hz)
Fs=256; %采样频率(Hz)
P1=-30; %信号1相位(度)
P2=90;  %信号相位(度)
N=256;  %采样点数
t=[0:1/Fs:N/Fs]; %采样时刻

%信号
S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);
%显示原始信号
plot(S);
title('原始信号');

figure;
Y = fft(S,N); %做FFT变换
Ayy = (abs(Y)); %取模
plot(Ayy(1:N)); %显示原始的FFT模值结果
title('FFT 模值');

figure;
Ayy=Ayy/(N/2);   %换算成实际的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N; %换算成实际的频率值
plot(F(1:N/2),Ayy(1:N/2));   %显示换算后的FFT模值结果
title('幅度-频率曲线图');

figure;
Pyy=[1:N/2];
for i="1:N/2"
 Pyy(i)=phase(Y(i)); %计算相位
 Pyy(i)=Pyy(i)*180/pi; %换算为角度
end;
plot(F(1:N/2),Pyy(1:N/2));   %显示相位图
title('相位-频率曲线图');

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。