找回密码
 注册
关于网站域名变更的通知
查看: 267|回复: 2
打印 上一主题 下一主题

FFT的详细解释,你看了就明白了

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-3-3 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
FFT是离散傅立叶变换的快速算法,可以将一个信号变换
  l. z; _! ~# k到频域。有些信号在时域上是很难看出什么特征的,但是如* ^2 Y' @7 j7 A) m) F
果变换到频域之后,就很容易看出特征了。这就是很多信号
1 G' K' z& e6 v2 l分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱
: S! Q5 m0 C* H" F1 r提取出来,这在频谱分析方面也是经常用的。
) f- B5 Y, Z) p1 ~7 Q    虽然很多人都知道FFT是什么,可以用来做什么,怎么去
8 E7 g( K% D5 `: q, v! h做,但是却不知道FFT之后的结果是什意思、如何决定要使用3 L& y! v5 m! L# b7 `7 E4 J* ?
多少点来做FFT。
, S$ Z9 `* W. `) u
  b- e# I* n- ?! n7 Q* p6 z5 {    现在圈圈就根据实际经验来说说FFT结果的具体物理意义。: v. ~3 @. U, p, h3 P
一个模拟信号,经过ADC采样之后,就变成了数字信号。采样2 a" @1 T0 D% A& H0 V( z- I; w, J
定理告诉我们,采样频率要大于信号频率的两倍,这些我就( N  l, J# w* V3 e- K1 x4 m6 U
不在此罗嗦了。$ H7 u0 p5 X* K/ T6 A3 K1 p

( S; h( E) e- f9 J2 m. g    采样得到的数字信号,就可以做FFT变换了。N个采样点,+ n* E' Q9 g. o; g8 a
经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT
7 @0 D3 h& W7 C( a2 @  A# d运算,通常N取2的整数次方。$ S7 r! b5 Z& u" S+ n1 v0 W
5 V* y9 ?! ]9 k
    假设采样频率为Fs,信号频率F,采样点数为N。那么FFT
8 K; r) h) D+ H8 R0 u8 f之后结果就是一个为N点的复数。每一个点就对应着一个频率
5 ]) a' h7 a5 [7 ?1 e; k1 c点。这个点的模值,就是该频率值下的幅度特性。具体跟原始, Y* l; k# a# T0 G/ d# I$ t7 A; O2 I
信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT
% ~: Y" p! \/ j3 B# b( {0 b1 _的结果的每个点(除了第一个点直流分量之外)的模值就是A
4 f: E3 w: N. h3 X# M5 W的N/2倍。而第一个点就是直流分量,它的模值就是直流分量6 ?/ i: H% D5 R  M% W( [6 ^8 K
的N倍。而每个点的相位呢,就是在该频率下的信号的相位。
& s  w9 r! f+ ^( Q/ f& b: @第一个点表示直流分量(即0Hz),而最后一个点N的再下一个- l5 S+ u* E$ R+ `3 I0 Y+ E3 ~
点(实际上这个点是不存在的,这里是假设的第N+1个点,也$ G# A. s+ w( F! @) k6 l
可以看做是将第一个点分做两半分,另一半移到最后)则表示2 m3 f, r( C( q, C
采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率
, y1 b/ y5 P4 f& z; l/ h依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。
& P4 E. x" p0 b) h由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果
& ?3 f+ S0 G  M, x采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。
7 U7 k: @$ Q6 F/ x( o1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒( u; E7 b/ ]/ R) W+ b. N$ h: L) H( i
时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时
2 i% K. r& F4 D+ \6 \间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率
: S# J' y, r6 \, V: V5 _# M9 [% J分辨力,则必须增加采样点数,也即采样时间。频率分辨率和) y4 l: s" s' C
采样时间是倒数关系。9 f( W" ?, M0 w) {6 r: a' L% r
  假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是
3 I# Y# @# l7 m: OAn=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,; x) }! [4 r8 ^; ~5 v( i9 `7 i
就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:# x+ B$ P" ?& h; o: i! X
An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。6 S' A! Z2 k, U7 U
对于n=1点的信号,是直流分量,幅度即为A1/N。  T8 `7 j# r# D% w6 k
    由于FFT结果的对称性,通常我们只使用前半部分的结果,8 D) f7 Z( e6 f9 c/ C  F
即小于采样频率一半的结果。% M% f& Z" R0 C

, ~! I  a# F* |$ K$ \    好了,说了半天,看着公式也晕,下面圈圈以一个实际的
3 o# ^, w( m( w4 Z) \3 V信号来做说明。; M$ O( I# j4 P0 A* P
7 c1 {8 `/ W/ C3 E+ G) r! D
    假设我们有一个信号,它含有2V的直流分量,频率为50Hz、, x; e* l6 s$ |( P
相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、  N3 F; d+ c, ]0 W! r
相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下:3 M. j; ^9 N9 M/ Y7 M& Y
0 ~1 O* e' Q3 X* R1 X6 s* L7 d- N
S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)
/ B, C9 G. ^2 g. v( D# R  w- n" U5 {) w( s* N/ x) P: I. @% X
    式中cos参数为弧度,所以-30度和90度要分别换算成弧度。1 `$ S7 I2 t0 O
我们以256Hz的采样率对这个信号进行采样,总共采样256点。! z4 t: A9 l: `& }' M
按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个- F$ Q4 `' Q/ n  I4 B* B. N
点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号6 g. U! c2 S  D1 c- b$ w' m
有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、
, ^+ o" H6 G  `8 k第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?( M- j% k3 c2 T2 c$ q' s
我们来看看FFT的结果的模值如图所示。5 f* P; X- M8 Q9 n; D

- L# s& Q0 j/ f' M1 |
7 X/ R, A3 m( ?" B9 w: b" D% W: E
( b; S% m6 F5 Y4 b3 c# }4 F                      图1 FFT结果$ n2 K+ D* r3 i" j- }
    从图中我们可以看到,在第1点、第51点、和第76点附近有* i. M* q# n! g
比较大的值。我们分别将这三个点附近的数据拿上来细看:& j( [9 |# h' g9 ^$ ~: g, ~) o1 }" W
1点: 512+0i
% X- L8 ]/ ?: z, X7 X& I  K% U2点: -2.6195E-14 - 1.4162E-13i1 G, ^' P' q8 L8 K% t; J- Y8 Y0 T! G
3点: -2.8586E-14 - 1.1898E-13i
. ]; V( w5 X: Q" T$ H) U! A( g5 R8 V! G
50点:-6.2076E-13 - 2.1713E-12i) ~: i. y. R1 j9 S) h, G+ x
51点:332.55 - 192i
" W1 C  Z! _9 y& a% H0 b52点:-1.6707E-12 - 1.5241E-12i0 p1 S, `" z1 i# L

$ M* U8 ?& ?! [75点:-2.2199E-13 -1.0076E-12i* P$ y/ F# Z7 E- G
76点:3.4315E-12 + 192i" Q3 s, J% m# j$ T# P
77点:-3.0263E-14 +7.5609E-13i7 ?# Y: B( M  O! r. H' r% \, _
   
. O1 ^  S( D/ c& A5 h" Z/ O    很明显,1点、51点、76点的值都比较大,它附近的点值
4 N" ^+ \% z% G4 x! e- {5 z7 d都很小,可以认为是0,即在那些频率点上的信号幅度为0。+ Q. H& W0 ^2 _  i5 B4 h( l7 v& p# d
接着,我们来计算各点的幅度值。分别计算这三个点的模值,
6 L( j  i/ l* X( o/ c1 I6 U0 u结果如下:3 u+ x2 {5 q4 X. y
1点: 512
" v1 x, c) d* o4 s, r51点:384) X) c  z6 ]0 T) R# K' `
76点:192* y1 r5 W+ G3 d) p
    按照公式,可以计算出直流分量为:512/N=512/256=2;$ p2 u* W. K7 ?' e
50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的
/ j0 X1 U- F" M6 c. d, v5 g9 A幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来
' o. Y' S2 y1 e, y+ _, F; n0 w的幅度是正确的。
5 \3 G- }# o$ Q    然后再来计算相位信息。直流信号没有相位可言,不用管: L0 v6 ^) a0 A- e0 I/ I5 K9 M4 C' G
它。先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,. Z4 }; E) i$ e7 u' M
结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再
/ V' U" }" X; w1 c7 ?' z计算75Hz信号的相位,atan2(192, 3.4315E-12)=1.5708弧度,
2 x- d; J3 M4 D5 ^% P换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。
: J) [' j2 d6 i" f- E* ^$ w根据FFT结果以及上面的分析计算,我们就可以写出信号的表达
* P0 @' U& d$ _, a' M+ J: k. N式了,它就是我们开始提供的信号。$ u) q0 v7 R2 T# M, V
+ b0 p  _7 Q; Y; n# ]: y' X1 |( m& E! _
    总结:假设采样频率为Fs,采样点数为N,做FFT之后,某
, ?& w7 v" N3 q一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值. f3 w) q- s3 w  S3 t
除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以% W% d: K2 o9 G  l7 I5 j  I: t
N);该点的相位即是对应该频率下的信号的相位。相位的计算
( w* i0 S& @. |8 x2 M9 S可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角* X, M' M9 B. C
度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒
6 g3 [7 O; ^' S% M的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,- @% w6 ?7 T0 p. Y2 k
这在一些实际的应用中是不现实的,需要在较短的时间内完成3 a5 N, A2 G8 [' B* W- p
分析。解决这个问题的方法有频率细分法,比较简单的方法是
+ k5 x, L" H( o, h+ X; v$ q6 _( m采样比较短时间的信号,然后在后面补充一定数量的0,使其长度
& y# R+ |" t  N9 c5 ]/ b; D达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。
" }# W! I# j- Z; k2 }9 L, z! L具体的频率细分法可参考相关文献。
$ t+ s' p0 l$ a% C/ e, @5 g8 I
1 x$ T: I; }( x8 g[附录:本测试数据使用的matlab程序]
4 I' F! s2 y  Y8 Nclose all; %先关闭所有图片# e- w; m/ n1 i
Adc=2;  %直流分量幅度
" j# c( g0 |* G# b8 f! @- TA1=3;   %频率F1信号的幅度& T" Z& L3 ?9 M! X) d
A2=1.5; %频率F2信号的幅度5 G. b* i' j0 q0 n4 }
F1=50;  %信号1频率(Hz): t% s! H: G/ X1 t/ W* ~8 j
F2=75;  %信号2频率(Hz)' S6 F+ a" e/ K7 l: t( m* B
Fs=256; %采样频率(Hz)
9 Q2 u0 w- k3 E5 j' H! AP1=-30; %信号1相位(度)
7 {# Q+ E/ S5 D' [# IP2=90;  %信号相位(度)8 u- o" S( |# s
N=256;  %采样点数
/ F) c( t3 N2 nt=[0:1/Fs:N/Fs]; %采样时刻, n: o0 C0 z. T7 J' w$ N5 {8 m

% e0 U$ e6 h# d( d7 B  y%信号/ Q& t+ e  {2 b6 {) \  D0 t
S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);. ?7 {  ^( U% {# T
%显示原始信号
9 U& P3 R: l3 X3 U5 `* tplot(S);- @1 ?0 O1 J1 l- e) P
title('原始信号');/ Z* M  q8 \. }6 F/ n

! b) b  Y$ N1 @" ofigure;
+ O0 N) N; t& u8 \3 J" OY = fft(S,N); %做FFT变换# T! t: c( ?( ]; C
Ayy = (abs(Y)); %取模8 I% W, y* z! ~
plot(Ayy(1:N)); %显示原始的FFT模值结果, t7 o' N& Z, O, l/ f; G3 ]( s
title('FFT 模值');
8 ?4 r5 n4 F8 |  E" ^* D  U/ `7 S5 y9 h/ g1 ~) K1 }
figure;
( f3 \; ~3 {! l' u& Z" T6 h& cAyy=Ayy/(N/2);   %换算成实际的幅度3 O+ a/ B: M# J" \
Ayy(1)=Ayy(1)/2;/ @9 x- Q, x; Y! }6 R' s
F=([1:N]-1)*Fs/N; %换算成实际的频率值
0 K" U* q! E+ W7 c5 s1 \plot(F(1:N/2),Ayy(1:N/2));   %显示换算后的FFT模值结果$ X2 G$ ]# X* e  ?% j* M; y
title('幅度-频率曲线图');
) {% U6 y6 x  X% F, Y: K
8 O5 n. P# {) U. T( |5 |) ofigure;
' T3 k- |- Z" ?  M: _( OPyy=[1:N/2];
+ D/ ?! W5 r& Dfor i="1:N/2"
5 L7 w) ~) H- E) \/ C4 FPyy(i)=phase(Y(i)); %计算相位; m' U* ?* I! e7 B. r- u" L
Pyy(i)=Pyy(i)*180/pi; %换算为角度
2 E4 |; C. Z( t) v. Tend;1 e' T1 O( h# s/ B( \( r+ B
plot(F(1:N/2),Pyy(1:N/2));   %显示相位图
2 R4 X: a+ t& _0 B$ Otitle('相位-频率曲线图');3 L8 o" t8 c$ _* F$ r

1 f; L) T* r( F  ?( q看完这个你就明白谐波分析了。
' a+ p6 y3 ?- `. M
  • TA的每日心情
    开心
    2023-1-3 15:10
  • 签到天数: 2 天

    [LV.1]初来乍到

    2#
    发表于 2022-3-3 16:49 | 只看该作者
    FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域

    该用户从未签到

    3#
    发表于 2022-3-3 19:32 | 只看该作者
    + G' l" V( U+ X% I) H( U  j
    把DSP的精髓FFT讲解的很完整呢~
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-23 17:30 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表