前面介绍过一期在STM32中进行傅里叶变换的教程,我们成功的对一段信号进行了傅里叶变换,获得其频率谱。
同样的,我们也同样介绍了双边频谱:FFT的结果是一个双边频谱,他不仅仅包含了实数的频谱也包含了负频率的频谱。3 ^- y* s! g6 _! X1 N" l; T ) t6 Y- {! c6 R+ \( L2 W 我们的采样长度为FFT_Lenth,同样的傅里叶变换的长度也是FFT_Lenth,而由于双边频谱的存在,我们的FFT结果数组长度是2*FFT_Lenth,并且通常直流信号会被统计两次。; _4 U( g0 R; J- Y1 n# w! l1 y0 S 9 X4 [- O% G+ u' I5 v. \& H 事实上对于我们的时域信号而言,我们采集到的数据仅仅只是实部信号(虚部信号之所以叫做虚部信号也正是因为在复平面上)。 $ v* U% J. o4 u( G' @
+ \4 }/ M! e( D( Q 在大名鼎鼎的火柴人数学中也体现了这一点。 + Z E( P d5 \, T
而真正的信号应该是一个在复平面上的合信号,但是对于我们而言虚数轴上并没有什么意义。" q) u+ s, I" N4 i# W" J' f, X' R 因此我们在计算FFT的时候也会主动的不向原始信号虚数轴上填充数据。
但是,即便是我们主动的忽略了时域信号中的虚部,但是FFT的结果中依旧包含了负频率的双边频谱 " ?9 S" p0 t8 o/ `
( F( O# n8 w( t! B0 l: K 因此,当我们利用得到频谱的时候,通常情况下只考虑他的单边频谱,而负频率通常是不考虑的。& H, Y( m; o, S- c; i5 H Q 3 ~; `+ `0 ~5 ]0 x' V: T. B* S 好了,说了那么多我们还是聊聊我们接下去要干什么,FFT在STM32中的应用有许多文章都在对其进行介绍,但是几乎没有文章有介绍IFFT也就是傅里叶反变换。 . ]( w* C8 g% s# g2 ` 也对,通常我们知道的时域信号,我们通过傅里叶变换之后将其转换为频域信号,但是很少有知道频域的情况下对其进行傅里叶反变换,因为首先是应用场合比较少,其次是好像没什么必要。 但是如果我们可以实现傅里叶反变换,那能不能通过对其频率信息的修改,即修改频域的值,实现一种滤波效果。 8 K6 r" C& o9 x1 D6 i2 u( \ 假如我们的信号采样率为10KHZ即10240,而我们的FFT长度是1024,那么我们的输出数组结果所对应的频率差,即相邻两个数据对应的频率差为10240/1024 = 10HZ6 g) Q8 K* e* S+ f9 m5 d 7 B. t. R6 L; O, Q: g
那么例如我们将FFT的结果中前2*X项赋值为0(因为输出的结果中包含了一个实部数据和一个虚部数据)并且FFT_Lenth~FFT_Lenth*2的值均为负频率。 这样子我们就可以实现一个X*10(频率差)的一个高通滤波器(低频段被删除了),之后我们通过傅里叶反变换实现还原原始信号。 5 T0 h& g8 H, N 这里需要注意的是,DSP库中没有给出IFFT的算法,因此我们选用最常见到的累加法求其IFFT的结果。 " k1 W' t3 u' v! ]
这里不具体介绍原理,总之我们看看效果。' x% h& i4 D% u) O% Q
将信号采集之后经过FFT变换之后再通过IFFT反变换为时域信号。% v/ p7 z5 W6 I! ~9 e2 c 3 \! i5 o8 y/ ]/ ^' y+ e) U U. k 这里我们采集了3KHZ的信号并进行了还原,可以看到并没有什么失真。4 I/ ]; o% P) A
三角波的还原,可以看到似乎叠加了一个什么信号,但是不是很明显。# w" ~/ |9 w) N9 R6 ^+ Q
( ? p- k' }) \% A- D 调制信号的还原,可以看到信号还原度还是非常高的。 }- J9 R1 B! E4 c
* K% `/ k" {$ X' Y 两个正弦波,100HZ+500HZ的累加信号,可以看到其还原度也是非常高的。$ b# r( E ]4 I7 r- \; c 在这里我们应用一下我们之前的方法,将某个频段的信号去除。) }+ M/ c: u+ T9 F: X2 w% S3 z
可以看到,我们非常轻松的从500HZ的信号中提取到了100HZ的信号。 5 d3 n" T) m# A4 Z% _1 F; V6 b
* _1 S* X3 M4 j7 V' B 方波中提取其基波频率。 " N4 L9 m' j8 }8 |
6 R4 s6 W: W; u) \8 G1 Y 以及还有方波信号的 还原。% a, R4 H+ |9 f& P0 Q5 t! h ; e; N9 ]2 ]7 a) f. U1 Y- y 并且这个方法 的滤波精度相当之高。
4 }2 x# M+ p; r) e 从一个900HZ叠加1000HZ的信号中将1000HZ的分量去掉。8 D6 C7 l9 A& ]5 Z4 W. i 转载自:电路小白: O. S6 W& ~2 L+ u% O 如有侵权请联系删除 2 g: K6 b% Z+ c" @7 l |
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
OpenSTLinux 6.1发布:M33-TD加持+安全升级,STM32MPU开发效率翻倍!
微信公众号
手机版