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

基于STM32利用傅里叶反变换进行数字滤波经验分享

[复制链接]
攻城狮Melo 发布时间:2024-5-29 16:51
前面介绍过一期在STM32中进行傅里叶变换的教程,我们成功的对一段信号进行了傅里叶变换,获得其频率谱。/ g* p5 a. z2 _3 A8 u3 L" [. I. P
3B_8}BWR[]ZBFD2U~56EA@W.png
. [/ w( l+ G0 p' ~6 @$ o" a0 c, j. p3 S1 d
同样的,我们也同样介绍了双边频谱:FFT的结果是一个双边频谱,他不仅仅包含了实数的频谱也包含了负频率的频谱。
; ^" f. j3 e' |, q9 l/ L$ G) l. L; D! E
" q' Z& P, T$ a& s6 m9 Q8 l% l我们的采样长度为FFT_Lenth,同样的傅里叶变换的长度也是FFT_Lenth,而由于双边频谱的存在,我们的FFT结果数组长度是2*FFT_Lenth,并且通常直流信号会被统计两次。2 f! j; X  Y% X* v/ C3 `

* q2 e+ U% f7 x# x9 e( [# a9 e事实上对于我们的时域信号而言,我们采集到的数据仅仅只是实部信号(虚部信号之所以叫做虚部信号也正是因为在复平面上)。
0 d# Y6 z2 G8 U9 |9 D6 ?  Q" F! M" N& D% X9 m
微信图片_20240529165125.png
$ U( T3 _. B+ O& h% P: c6 a

' l. W- D1 Z; Q在大名鼎鼎的火柴人数学中也体现了这一点。
$ I; {6 Y4 c" c0 F& p! W! ~. [/ ~9 ]  _0 @# v3 c" C; q
微信图片_20240529165122.png
2 o! o9 P1 y% r2 @" [" s; |6 T% A/ Z
而真正的信号应该是一个在复平面上的合信号,但是对于我们而言虚数轴上并没有什么意义。: X$ ~# A4 I. r$ x- A7 \; J/ A7 i

. n( D& h: `4 |, n, \
因此我们在计算FFT的时候也会主动的不向原始信号虚数轴上填充数据。; l7 ]# o+ U1 {* M' n0 |1 \
: {+ u* n; w% |$ @5 Z0 F0 q
  1.     for(int i=0; i < FFT_LENGTH; i++)  E/ X& Y8 q3 r0 V* ^. O. w8 H
  2.     {* g8 j: c1 B7 Z) Q+ ^  F
  3.       FFT_InputBuf[2*i]=(ADC_1_Value_DMA )*3.3/4096; //实部, ?9 b( t7 ?6 f. f* X
  4.       FFT_InputBuf[2*i+1]=0;          //虚部) G7 T0 x2 E& n, l4 ]: ?
  5.     }
复制代码

/ X0 n) O4 v; @* s! g7 V6 Z/ b但是,即便是我们主动的忽略了时域信号中的虚部,但是FFT的结果中依旧包含了负频率的双边频谱
7 w1 S! o: M1 o
) d* F" c; _  L! F! f
微信图片_20240529165119.png ' r8 ?( a8 T" W# l( j& G
/ r" p9 A$ Z8 B" \; j: ^9 d* _
因此,当我们利用得到频谱的时候,通常情况下只考虑他的单边频谱,而负频率通常是不考虑的。; J5 X" m- y0 o% {( W: O3 G; l
3 J+ H# N/ C/ ~* u* v
好了,说了那么多我们还是聊聊我们接下去要干什么,FFT在STM32中的应用有许多文章都在对其进行介绍,但是几乎没有文章有介绍IFFT也就是傅里叶反变换。
; y, w3 @8 C, A6 H! R! G4 b8 l* S4 w. ?9 E# s# K3 x
也对,通常我们知道的时域信号,我们通过傅里叶变换之后将其转换为频域信号,但是很少有知道频域的情况下对其进行傅里叶反变换,因为首先是应用场合比较少,其次是好像没什么必要。
! R- l) l8 ]& X
: Z/ d% Z# k* X3 C! E. t! a但是如果我们可以实现傅里叶反变换,那能不能通过对其频率信息的修改,即修改频域的值,实现一种滤波效果。, }5 }6 U  s1 J. ~! D& g
4 r6 D. x, \5 D0 d- X" m9 u
假如我们的信号采样率为10KHZ即10240,而我们的FFT长度是1024,那么我们的输出数组结果所对应的频率差,即相邻两个数据对应的频率差为10240/1024 = 10HZ* ]; O. S1 n  Q4 a8 g( D- X

  ]  W- y4 A3 U0 ~! R* T/ z
微信图片_20240529165115.png
' i" p& E0 S5 l) y# L

0 j+ h: T: t, C. S2 y那么例如我们将FFT的结果中前2*X项赋值为0(因为输出的结果中包含了一个实部数据和一个虚部数据)并且FFT_Lenth~FFT_Lenth*2的值均为负频率。/ J5 o9 {% x6 Q" V
  B5 o5 v+ P) y* ?& N# r2 p
这样子我们就可以实现一个X*10(频率差)的一个高通滤波器(低频段被删除了),之后我们通过傅里叶反变换实现还原原始信号。
, H. F. p5 A3 y. h2 Z3 j. V2 w6 F) G! I5 b# i& ]
这里需要注意的是,DSP库中没有给出IFFT的算法,因此我们选用最常见到的累加法求其IFFT的结果。
8 P2 S5 d7 {& R5 F
! G  A; c" g4 b2 W- `% g
  1.     for (int i = 0; i < FFT_LENGTH; i++) {  
    * e2 o% a: d7 h# m/ P. z
  2.     FFT_OutputBuf = 0.0f;   " D3 O8 P3 z3 Q' ?. Y+ L# g
  3.     for (int k = 0; k < FFT_LENGTH; k++) {    d; q. z6 G( p
  4.         // 累加复数乘法结果到原始信号  4 ~0 I$ a  Q$ G
  5.         float32_t phase = -2.0f * 3.1415926 * i * k / FFT_LENGTH; // 计算相位  6 j* o1 B& ?& l2 O$ w
  6.         float32_t real_part = cosf(phase) * FFT_InputBuf[2*k] + sinf(phase) * FFT_InputBuf[k*2+1];  ( t, `4 M) u# {% `  M
  7.         //float32_t imag_part = -sinf(phase) * FFT_InputBuf[k*2+0] + cosf(phase) * FFT_InputBuf[k*2+1];虚部信号  " D0 C  E# o/ N
  8.         FFT_OutputBuf += real_part; // 只取实部累加,因为原始信号是实数  + e' S% c2 U# {4 r: T
  9.     }  ( {) \, k) [" e  S: ?
  10.   , l( ]2 S2 y, l7 o+ j
  11. }
复制代码

/ s: Q4 s- }9 N, U  P这里不具体介绍原理,总之我们看看效果。+ K( s  p' T; @9 U/ f) w% i
微信图片_20240529165111.jpg
7 M! r. N! I' J. _
  t/ S5 g' w% _  D. ~/ T, i# i将信号采集之后经过FFT变换之后再通过IFFT反变换为时域信号。
* L  \& `3 a0 u, N) j3 F( j# k
: `0 w4 E" q2 C1 C
这里我们采集了3KHZ的信号并进行了还原,可以看到并没有什么失真。  j7 @1 U6 Y4 I$ ^- v

) c# P8 j$ k+ O3 U# Z% h
微信图片_20240529165107.png ' D. w4 d) ~- l- R" V

$ w1 n  K. ^7 ?# L6 N) q三角波的还原,可以看到似乎叠加了一个什么信号,但是不是很明显。
5 B) O7 F. j: @, N( s! D" P7 t9 k9 f: s& e# e  y
微信图片_20240529165103.png
/ i/ m! w2 y& q: S" o, d' b

& }6 m) _; s$ m调制信号的还原,可以看到信号还原度还是非常高的。( ^) [! d0 d& Y' _4 f  @2 T
' K4 ^0 y: w1 ~& w3 X! ]3 c
微信图片_20240529165059.png 1 r( B! Z, m. v8 K+ B& S& u; y" b0 Z
3 z7 _. q, f# U2 C: V
两个正弦波,100HZ+500HZ的累加信号,可以看到其还原度也是非常高的。' t$ G/ ?5 j. c, ?! ^# E

  g( i) P* E8 e- ~在这里我们应用一下我们之前的方法,将某个频段的信号去除。
& Y1 D$ L7 N* S; K: N5 D
6 A3 }5 d+ y. W, A
微信图片_20240529165056.png
9 U+ m8 W: k( C8 u4 ~1 M  G8 S& \

, s8 y7 `7 N% o) _5 T( A可以看到,我们非常轻松的从500HZ的信号中提取到了100HZ的信号。
6 f1 t7 f5 x: c: ~* v6 F+ e1 h5 u. U  t) P/ F- K3 I: p( m" y7 |6 x
微信图片_20240529165053.png
' ^, p+ o' T6 D: L1 r& _: S& T6 g4 J  N
方波中提取其基波频率。) }7 b# y2 A9 {9 l7 ~$ }
6 r) b0 M' I  i& r$ O
微信图片_20240529165050.jpg
2 p9 Q, [+ b: P! R1 B; o+ K* N# M$ f  Q( @
以及还有方波信号的 还原。
4 g8 k6 S/ w+ u5 {0 H. w1 ^& x* ^# g7 t; V( ?
并且这个方法 的滤波精度相当之高。
. r. b5 ~/ U5 f5 b( Q/ Q
% j& ^" {$ j) I  N* c
微信图片_20240529165043.jpg . U) W+ u/ i" K8 s: p* a

( b! ~. v& \+ v8 X- P$ k) d从一个900HZ叠加1000HZ的信号中将1000HZ的分量去掉。
  o# v+ J# w3 Y$ Y/ I+ p
9 h: C5 a0 K- ^5 ]" k4 m* A9 Y! P- \1 ~+ a+ P
转载自:电路小白
# A4 d  D: v2 B! v; D* `如有侵权请联系删除
4 ?7 [. p9 _, \/ g; V8 a" ?
. X, a2 z6 A; b' V' S8 B/ r$ D  _
收藏 评论0 发布时间:2024-5-29 16:51

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版