你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】FFT变换结果的物理意义

[复制链接]
STMCU小助手 发布时间:2021-12-25 22:00
26.1 初学者重要提示
0 _# P' `1 q) l! Z7 c8 G8 |  下个章节为大家介绍两个重要知识点:频谱泄露和栅栏效应,推荐学习完毕本章后看一下。
' S* T3 q. [5 {2 _. G) J) y) l& J; L0 ^& d. [0 r% ^
26.2 FFT变换结果的物理意义
; f9 l$ F# `8 t+ v; V26.2.1        理论阐释
: h3 I, [+ d/ q虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。" l! V: O: {0 Y! w4 h

( f) P  s7 V" m% w2 L一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍(要满足奈奎斯特采样定律)。
" ?% w  \$ Y; I1 t
, k  }  S4 a- H% J5 m& j采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。$ ]' l- o7 J( N

  N6 y+ w, K6 m6 ]0 B8 ~' Z假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。 而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点 N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被 N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:2 X' N1 i4 I2 q8 m/ c3 y+ R4 l
' n; [& k' z' a% b2 _- S
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png
4 |2 h! n( y: J" r8 t" x, d4 ?# F
7 v0 G0 u+ `0 l6 O; a' M
由上面的公式可以看出,Fn所能分辨到频率为 Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是:
' \$ L; Q* _& p$ l0 O
* j0 x: Q1 I- r9 Y$ Z
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png

- L/ H0 G" U$ ?) s) \6 P. B6 n; Q8 @; `/ v% U
相位就是:
0 k. {  a$ T; U3 T* m# y3 P$ t) ~/ y6 j
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png
' |: q* H1 g, v, Q  w- c$ a! e
( t0 G* q- f% P1 a% a- k
根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:
+ R# B0 Z. f* J3 l- _
- A1 @  W4 S- D/ h
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png
+ f  Z7 x6 A  b
( Y5 |0 R9 r; g
对于n=1点的信号,是直流分量,幅度即为A1/N。由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。
- g0 J8 f, @' e. C2 _; V- o) p  e- R+ [! }7 j9 z' x. D  W# T( ~
26.2.2        理论计算和Matlab实际计算结果对比
- g; \/ a* h2 n+ C; Z
下面以一个实际的信号来做说明:9 D( y# K! h6 M* ?

, X3 ?" L2 c* O3 W- u, B假设我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下:
1 \# {/ T- }0 W. b3 l7 u* t2 b- I* C6 j2 V
x = 2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)
$ Y) g, A9 `: B* i
$ Q" {2 G, c  g8 V1 R* m- g% s式中cos参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际情况如何如下:" Y: i# P. m2 p

5 Q6 e( ]6 h. w0 {8 N/ ~ 第一步:在matlab上新建.m文件,文件内容如下:
7 ^5 J7 h/ ?+ |3 w  t' c. HFs = 256;          % 采样率
9 ^, y3 H1 g; LN  = 256;         % 采样点数! h1 [6 E! Z) F- D
n  = 0:N-1;        % 采样序列
2 p) A- E* j0 Q) C; ^t  = 0:1/Fs:1-1/Fs;  % 时间序列
8 h# ^% }3 A  U6 H! l7 ^
6 n) W! M, K) Ox = 2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180) ;  %原始信号
# z/ W6 F& c, j( w; p
- {9 m; h7 X4 ty = fft(x);    %对原始信号做FFT变换
+ \5 K2 @% E/ E& p: IM = abs(y);  %求FFT转换结果的模值
9 h) g: _: d$ Z5 W& Z' \+ b5 }( aplot(n, M);   %绘制FFT转换模值的曲线
  A, B7 I+ ~4 F- o8 X 第二步:运行后显示效果如下:8 Q+ e0 X2 r' m6 g7 Y
. d4 ^5 ^8 p& g* A: n
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png

# M5 H" D/ I; p: k8 ?
! i( T( o2 d/ ?# W4 c 第三步:从matlab的工作区获得几个关键点及其附近两个点的幅值:7 [2 l& B& @$ Y" e; W& C& V
+ M6 D' V2 H( I) o/ i
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png

) f" y5 u! ?' {1 g! w7 e6 C5 P# H# K4 o
1点,2点,3点的数值如下:
4 h6 D7 r! b5 v% H7 `$ ]5 T
; v8 }1 A) g6 N* W- y* `
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png
5 b) N# R6 m/ D6 m/ z! _) D

) u% k7 d# ^* [0 b3 K, Z2 V50点,51点,52点的数值如下:* V6 T& P4 \/ i- ]1 d9 U

3 y. H, C' O+ ^- j7 S
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png
. w) M" J- S- c4 X( G, ]

3 y; n$ i/ ]0 ?/ j$ K1 b7 s75点,76点,77点的数值如下:" `. Q6 V8 T1 O/ `
6 C9 B( j8 O4 G( Y5 O# L
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png

) m( y4 v1 f* X. ^  k, Z3 W5 c
1 h# Z( E- Z! M0 F/ [; y按照上面说的公式,可以计算出:
) B& O9 L2 z$ g! [
9 H) c  u' \. N9 `1 q) A直流分量为:       512/N=512/256=2;
4 x! B+ t0 F& a) h0 H* |2 ~3 k" t0 q" f
50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;
2 R7 y6 y3 A4 N5 u9 i2 s, m7 [" `' v
75Hz信号的幅度为:192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来的幅度是正确的。& j3 `1 Z" T% X- m+ o5 r: E

0 D) u7 x2 j+ j2 x5 V8 Y2 y 第四步:计算相位* ?0 u# o7 r, x0 x" g
计算相位要获取FFT变换后相应频率点幅值的实部和虚部,这里看第一步代码中的y变量数值即可。8 ]& P9 Q1 q5 q
: T* G! j% S3 I3 ~# ]: W
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png
) U: V" q1 W- x' @2 Z; `' ^* R

& D/ {6 w/ e/ M  X5 H由于直流信号没有相位可言。这里主要看50Hz的相位和75Hz的相位。
8 v2 k+ i1 @  y. ]* D3 L" [; V, f$ Q7 y! V/ [9 a% F
1、计算50Hz信号的相位。
! R1 |: u- D1 w7 z5 [) ]4 k0 n6 [6 {1 ?( b( ~' j
y变量的第51点对应数值:332.553755053225 - 192.000000000000i( u( u6 k0 V- b: v! b
- _. v# v2 L! W
那么atan2(-192, 332.553)=-0.5236,这个结果是弧度,换算成角度180*(-0.5236)/pi=-30.0001。
2 ^+ |' U! L5 g* z% y+ Y$ V0 M) q9 W
这个结果与cos(2*pi*50*t-pi*30/180)中相位是相符的。
! I6 D2 M7 P2 `& z  h  E2 u
% P) _& G% S+ m, d6 M; r2、计算75Hz信号的相位。
/ Q3 ]* P' x7 j3 v) s' N: O
$ P) g- B3 [+ z, ly变量的第76点对应数值:3.43858275186904e-12 + 192.000000000000i, E3 u6 f6 F( Q0 ^; C; g1 X

; Y. p: J0 x- M; i7 \6 a# ?( T  j那么atan2(192, 3.43858275186904e-12)=1.5708弧度,换算成角度180*1.5708/pi=90.0002。这个结果与cos(2*pi*75*t+pi*90/180)中的相位是相符的。% b$ {) r' n2 w! R  s4 A3 a' L

* ]' i: n0 ~4 | 总结/ b! @' T6 h# T  F" V1 D
根据FFT结果以及上面的分析计算,我们就可以写出信号的表达式了,它就是我们开始提供的信号。0 C3 l. ?! @0 T
0 f* I: C( F$ g  g/ R- F* U
总的来说,这个过程就是这样:假设采样频率为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,这在一定程度上能够提高频率分辨力。具体的频率细分法大家可参考相关文献。& r% w. r- v8 y3 S+ H, a* S

$ u1 e4 k+ m1 t& O" @, Y3 ?% A26.3 FFT变换的频谱泄露问题
  ^$ [+ K' r3 D0 e& |. e为了说明频谱泄露的问题,这里我们具一个求解方波FFT变换的例子。在matlab中运行如下代码:5 n$ x$ }5 Y5 G& N

4 E" G! x+ ^6 Y- DFs = 256;             % 采样率
2 z1 z7 w# X1 aN  = 256;            % 采样点数* M- g5 @2 y: l; x% v
n  = 0:N-1;          % 采样序列
. S/ N" V" d, at  = 0:1/Fs:1-1/Fs;    % 时间序列" [# Q' d( A# S' q/ k
x = square(2*pi*30*t,  50);  %原始信号
/ ^8 k" U# x2 ey = fft(x);     %对原始信号做FFT变换1 w0 d4 @7 {" Y- N5 \( \' j: t4 m3 o
M = abs(y);  %求FFT转换结果的模值
2 i) ?( Z1 ]; Y' ]) Q, Mplot(n, M);   %绘制FFT转换模值的曲线
  |" R$ k3 f$ G/ k) J4 l运行代码,输出结果如下:: \2 `# u/ e% [$ V* @
7 D5 Y- f+ x8 P1 N
aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDIwMDUvMTM3OTEwNy0yMDIw.png
/ a9 b9 b1 Y1 x6 X  h( B! @1 Y- m
0 X0 V# ~' l6 o6 T& l) }
与方波的理论计算值相比,上面的幅频响应图中出现了很多小毛刺,其实这个就是频谱泄露的结果导致的。' J/ S/ \0 a, ^; X. E7 T
, V1 e; n& b  B3 \$ I/ d  l, ~, l! a; K
下面就说说什么是频谱泄露:& S$ w' Z" z) ~

* A7 _+ H: W* f  [3 A' A对于频率为fs的正弦序列,它的频谱应该只是在fs处有离散谱。但是,在利用DFT求它的频谱做了截短,结果使信号的频谱不只是在fs处有离散谱,而是在以fs为中心的频带范围内都有谱线出现,它们可以理解为是从fs频率上“泄露”出去的,这种现象称 为频谱“泄露"(结合上面的例子就更形象了)。! _. L5 N( [9 N: z3 S& r+ s
7 i' o, C: ^' L; x$ r5 p2 j+ Y) v
在实际问题中遇到的离散时间序列x(n)通常是无限长序列,因而处理这个序列的时候需要将它截断。截断相当于将序列乘以窗函数w(n)。根据频域卷积定理,时域中x(n)和w(n)相乘对应于频域中它们的离散傅立叶变换X(jw)和W(jw)的卷积。因此,x(n)截矩后的频谱不同于它以前的频谱。
  L% `5 T" o; t
7 c" |! Z2 q* T, F0 M1 C+ E9 R为了减小频谱“泄露”的影响,往往在FFT处理中采用加窗技术,典型的加窗序列有Hamming、Blackman、Gaussian等窗序列。此外,增加窗序列的长度也可以减少频谱“泄露”。
+ J# t' A% S  R) |6 I
6 |! b# P, v9 s# D时域上乘上窗函数,相当于频域进行卷积。长度为无穷长的常数窗函数,频域为delta函数,卷积后的结果和原来一样。如果是有限矩形窗,频域是Sa函数,旁瓣电平起伏大,和原频谱卷积完,会产生较大的失真。- J1 r* s# W7 Q( J

4 `8 {: k4 J' ~( |窗的频谱,越像delta函数(主瓣越窄,旁瓣越小),频谱的还原度越高。加窗就不可避免频谱泄漏,典型的加权序列有Hamming、Blackman、Gaussian等窗序列主要是为了降低降低旁瓣,对于降低频谱泄漏效果远不如增加窗序列的长度明显。8 [" Y, |6 D4 X% T6 Y0 W' [/ ]# K# d
  _) a& P% v+ M' H9 d7 K5 s
周期信号加窗后做DFT仍然有可能引起频谱泄露,设fs为采样频率,N为采样序列长度,分析频率为:m*fs/N(m=0,1....),以cos函数为例,设其频率为f0,如果 f0不等于m*fs/N,就会引起除f0以外的其他m*fs/N点为非零值,即出现了泄露。  V- m% i& I! i5 m  g
* W* t0 [* f1 D6 y& N9 w. O
DFT作为有限长的运算,对于无限长的信号必须要进行一定程度的截断,既然信号已经不完整了,那么截断后的信号频谱肯定就会发生畸变,截断由窗函数来完成,实际的窗函数都存在着不同幅度的旁瓣,所以在卷积时,除了离散点的频率上有幅度分量外,在相邻的两个频率点之间也有不同程度的幅度,这些应该就是截断函数旁瓣所造成的。! `# H! E1 P" I8 S+ i, r

) l, k4 ]2 u' J: f# j26.4 总结4 ^2 j1 I0 H6 g* h- `& i
通过本章节的讲解,大家应该对FFT变换结果的物理意义应该有更深入的理解了,通过后面章节的继续会让大家有更加深入的认识。
  {- R( M- I8 g" N; Z" s/ N' ~: k6 m1 L& N4 r/ j# B
; S& [4 X* X9 V$ |8 G% w0 M
收藏 评论0 发布时间:2021-12-25 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版