|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
FFT是离散傅立叶变换的快速算法,可以将一个信号变换
+ `: K' Y6 ^1 B% t4 ~; \到频域。有些信号在时域上是很难看出什么特征的,但是如) l. S" [7 p. c- a5 Y: v- g
果变换到频域之后,就很容易看出特征了。这就是很多信号/ V! @. ~9 x/ s) z
分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱
: _( z. _; T, m% ~$ V e提取出来,这在频谱分析方面也是经常用的。
5 t; s ?4 {. Y/ \9 I6 R 虽然很多人都知道FFT是什么,可以用来做什么,怎么去
9 {$ j% r6 y9 G4 a! M! T1 C做,但是却不知道FFT之后的结果是什意思、如何决定要使用# U* F7 j0 f6 @1 f0 ^
多少点来做FFT。
7 _ V! \7 b4 z* b _' ?7 c8 a( {3 |% d% u
现在圈圈就根据实际经验来说说FFT结果的具体物理意义。
0 u& r6 D1 d# r% Q: i一个模拟信号,经过ADC采样之后,就变成了数字信号。采样
* {; w& a; X+ Z% D) h定理告诉我们,采样频率要大于信号频率的两倍,这些我就7 p) E2 i' j/ f% g. s
不在此罗嗦了。9 Z. L% D4 m, O
7 L/ A9 ^& Q( O! I* h. W- c! o 采样得到的数字信号,就可以做FFT变换了。N个采样点,6 \$ R' h# x6 d, M8 W
经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT
+ n |1 V7 E& P+ M: F* X9 n# }运算,通常N取2的整数次方。
. p: n8 a5 d- }. a+ U5 i
7 j+ M0 ~& e/ ?3 u6 j- J. @6 ? 假设采样频率为Fs,信号频率F,采样点数为N。那么FFT
% ?$ F# `& S! c% G3 ?" m, H之后结果就是一个为N点的复数。每一个点就对应着一个频率
) S% v1 H* I8 ~ B9 J点。这个点的模值,就是该频率值下的幅度特性。具体跟原始0 n( J. }3 d' u4 q" `
信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT
8 K. v1 A2 \7 |' G" E2 C的结果的每个点(除了第一个点直流分量之外)的模值就是A7 X7 F \/ r" M( ^
的N/2倍。而第一个点就是直流分量,它的模值就是直流分量% r3 J9 {" m6 n3 j
的N倍。而每个点的相位呢,就是在该频率下的信号的相位。
- U7 `) @$ ?& L' D第一个点表示直流分量(即0Hz),而最后一个点N的再下一个
3 y. P: N2 E9 S3 P; c1 b: R点(实际上这个点是不存在的,这里是假设的第N+1个点,也1 ?( X8 _; q$ W( \8 b. Y: `
可以看做是将第一个点分做两半分,另一半移到最后)则表示, V& ?2 L' U$ Y8 D
采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率
$ V- n1 ^* J& }1 S: \依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。1 c$ i: q, E* Z4 ?; H+ m( V( W
由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果# }& N8 Q7 ` t: `: r
采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。
( @+ ~' U5 t7 T$ @' I& b4 k1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒
5 `4 `. K6 i5 `+ d+ v时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时( g6 \/ Z: j) F; e7 ^9 }9 a
间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率
; @* t3 w/ r8 z# F9 x: b分辨力,则必须增加采样点数,也即采样时间。频率分辨率和
4 N x5 [3 {% A i5 @) `$ ?采样时间是倒数关系。
, _2 m2 r1 W. [9 t 假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是4 r% Q1 D W1 S2 |) |0 k
An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,6 `7 B2 u$ @9 e: V# h2 Q8 I: g
就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:( K' @& G+ d7 z$ X, |% S" _
An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。
% q* x8 x; L- O对于n=1点的信号,是直流分量,幅度即为A1/N。/ Q u, E4 G- G6 G. g
由于FFT结果的对称性,通常我们只使用前半部分的结果,, q4 U7 g0 E9 F; X5 N0 l z
即小于采样频率一半的结果。
- Q3 j& C$ k; C: h7 v2 x/ F" ]# ~& V
好了,说了半天,看着公式也晕,下面圈圈以一个实际的7 ~) k; G! U5 `" M
信号来做说明。
8 ?: R% U! E9 ?6 C a3 `7 i! N5 @
" v. J# v" t% |- @ q/ o: R 假设我们有一个信号,它含有2V的直流分量,频率为50Hz、
) B# J6 K: H2 n& r相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、" d& y/ v+ }, R3 ~, H* ?' X
相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下:
2 `! G. w: A" u& n6 P8 D# D, Q8 s
# d7 X3 r! s8 ~3 l5 @7 k5 j. NS=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180); g1 r4 H, ^3 V
1 ?6 s0 {0 ]7 U/ R* n% @ 式中cos参数为弧度,所以-30度和90度要分别换算成弧度。
* W- r& w2 V+ D: ?7 {* g我们以256Hz的采样率对这个信号进行采样,总共采样256点。
* c) P" T/ B$ i" M. j" a按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个- c$ Z% }3 \: ^3 i" Y
点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号
) \5 u7 n5 G; a/ i5 c: ]有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、( X7 ~) N% w& C- {+ j! O8 ^' O1 j
第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?7 i9 L8 y. A2 _$ c* X; h/ M4 }& M
我们来看看FFT的结果的模值如图所示。
4 B; i r2 C* P- c* J5 }, w3 L4 j8 @! _/ G
# c0 `, Y7 N1 l: J. V
4 ~* l3 K% E- ?$ a8 O
图1 FFT结果
. E" T. u$ P, F: T 从图中我们可以看到,在第1点、第51点、和第76点附近有
9 H8 y9 g+ m2 e3 f' I4 r* q9 l比较大的值。我们分别将这三个点附近的数据拿上来细看:2 B% b% P( X) I: `# q
1点: 512+0i
/ a7 O9 V. D2 A# x( w2点: -2.6195E-14 - 1.4162E-13i8 v+ Y* Y, y8 h, {' j
3点: -2.8586E-14 - 1.1898E-13i' R/ d8 K- s& z( K4 G; h6 e# y
6 U9 A; i/ T6 q6 _6 {. W2 A50点:-6.2076E-13 - 2.1713E-12i6 ?+ Z3 g9 g* ~4 V- o" y
51点:332.55 - 192i2 Z, x' l. B) N9 p1 v0 L/ ]
52点:-1.6707E-12 - 1.5241E-12i
+ n, H% ^! \/ d* _
; b, @# H. t6 |75点:-2.2199E-13 -1.0076E-12i
3 S+ s1 k5 V; b. s2 `7 H76点:3.4315E-12 + 192i$ L& ?. E; P2 _( Y( n! Z
77点:-3.0263E-14 +7.5609E-13i7 w; t2 C0 d( t+ k+ l% P
+ j: `: K, ^' {; C; ?3 l
很明显,1点、51点、76点的值都比较大,它附近的点值' Z* k/ z2 v2 u" ~7 Q
都很小,可以认为是0,即在那些频率点上的信号幅度为0。# W1 U* V0 e1 D9 z8 I; ]0 P' v
接着,我们来计算各点的幅度值。分别计算这三个点的模值,5 w% ]7 c6 I# o3 [0 \1 _
结果如下:8 @5 b' q5 W) k; X+ E
1点: 512. {# j! N$ f+ ?+ w1 C3 u4 U" U% t0 U
51点:3843 W9 L0 `* Y, G) O
76点:192% l! g' U8 R% Z
按照公式,可以计算出直流分量为:512/N=512/256=2;
. T9 @4 x* d7 Z8 T0 h3 ^6 u50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的
& q6 M, k" b7 X0 t; ~3 g1 x幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来
" h/ c8 |! i. V6 y! t的幅度是正确的。
# {$ z+ M& b; z 然后再来计算相位信息。直流信号没有相位可言,不用管, ?- h0 F1 Y" H! s' ?, P) F, v
它。先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,
, M9 E+ T3 B( J: s7 }) \, e结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再, v* Z" _0 T1 i2 c" [
计算75Hz信号的相位,atan2(192, 3.4315E-12)=1.5708弧度,
O6 p r/ I6 m( p换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。
0 J' T: U, o7 a7 O& w Y根据FFT结果以及上面的分析计算,我们就可以写出信号的表达# I& f! L/ m$ Q. }
式了,它就是我们开始提供的信号。
0 l1 v" O7 O; |* ^/ R4 D& R1 k5 ^/ S! O' f+ V8 d( |, }, Y
总结:假设采样频率为Fs,采样点数为N,做FFT之后,某
2 J( w% G- c; s! m, t. _+ ?一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值
7 q: {0 ]( p6 f' B0 U0 r除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以' p+ w- i9 A5 h3 g5 @+ m
N);该点的相位即是对应该频率下的信号的相位。相位的计算1 q# z( l& e8 ^# C8 }% G
可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角
; A' N9 }% V: S( { g) R* [; [) ?度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒
8 \+ a; M9 l8 E7 X的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,( H& Q$ s# y5 ?& P/ q! c! U
这在一些实际的应用中是不现实的,需要在较短的时间内完成3 E% B- k2 {( o, R$ q4 v0 z0 T
分析。解决这个问题的方法有频率细分法,比较简单的方法是0 x( M/ W V/ t+ c X( ?! g8 a
采样比较短时间的信号,然后在后面补充一定数量的0,使其长度, a3 r& M( }- e4 A$ k3 p
达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。: }. ~5 w3 C+ B. C/ |
具体的频率细分法可参考相关文献。+ R, X4 W; ?) Z0 \. t
+ w0 G5 C) J1 O6 H* L% z
[附录:本测试数据使用的matlab程序]
- \3 m. I* V2 vclose all; %先关闭所有图片
/ u( n' q- ^1 w, ?* e8 _/ F" hAdc=2; %直流分量幅度5 s) ?! }- v+ N) w6 U
A1=3; %频率F1信号的幅度
1 c7 M6 d Z8 W; y* X% b- YA2=1.5; %频率F2信号的幅度
, \$ o% y( X2 P, I s2 v% mF1=50; %信号1频率(Hz)
0 }/ N' _! R( c5 p nF2=75; %信号2频率(Hz)
) w, z* r9 J# {Fs=256; %采样频率(Hz)
r1 [4 M- J2 h: B( b5 DP1=-30; %信号1相位(度)5 H4 i- x3 ]1 l- D6 R
P2=90; %信号相位(度)+ M v2 F# C- Q3 s
N=256; %采样点数
$ D6 g( v9 e& V6 R" qt=[0:1/Fs:N/Fs]; %采样时刻
/ r0 O$ B& }/ T8 L# w; w2 s( |1 Y: p9 H) f
%信号
( U U# e8 w- _. `- O$ u$ b8 t) V6 _S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);( Y! z, O2 i# X# h- l/ }# ]
%显示原始信号3 I% i2 j( r- `
plot(S);! \0 B& L5 B- A' g
title('原始信号');
- l9 w/ Z0 H* t6 Y, ~- o) B
% G0 v h/ n) m, q& N( ^figure;
6 y3 Y `7 r" H( _2 s: ^Y = fft(S,N); %做FFT变换
+ E0 Q* b/ |% E7 oAyy = (abs(Y)); %取模
' n6 d" W! `- b/ h. O2 @, d/ K& ]8 hplot(Ayy(1:N)); %显示原始的FFT模值结果. j1 Y0 e! B8 m0 @
title('FFT 模值');
- n- N1 e$ q' z- o8 O- k; M5 G, k$ j! o
figure;
5 F! N6 y1 k& J. O+ hAyy=Ayy/(N/2); %换算成实际的幅度
& L. k# Y) Y7 e" X; i: XAyy(1)=Ayy(1)/2;
9 z/ O, ?8 u+ O0 DF=([1:N]-1)*Fs/N; %换算成实际的频率值. v# c7 ^1 G, [: a" J! v% w5 i/ V
plot(F(1:N/2),Ayy(1:N/2)); %显示换算后的FFT模值结果
( M: c8 n G/ ^) Z; u& ptitle('幅度-频率曲线图');
* D. X5 O0 J' q6 O# G
0 A# R, W0 n- | S' Q9 hfigure;
7 M+ S3 K8 E: D) vPyy=[1:N/2];
% z7 K) l' g* T, ]8 lfor i="1:N/2"9 d- p! N- t6 L2 k/ G) F+ S3 S
Pyy(i)=phase(Y(i)); %计算相位
) k- C6 X. c4 [" t2 }' s! D5 vPyy(i)=Pyy(i)*180/pi; %换算为角度$ m5 D/ ~" E6 H/ N: r
end;
4 M9 |8 r! p: P, ]1 splot(F(1:N/2),Pyy(1:N/2)); %显示相位图4 I# x2 M7 p7 M6 b8 I
title('相位-频率曲线图');5 J2 w& Z" L0 r3 r1 ~
, F& e- \$ A+ T' A0 p( } z5 E) Q
看完这个你就明白谐波分析了。$ X1 h) |( m; a' Z" G
|
|