系列文章目录
前言
在使用MicroPython的过程中,我们可以通过import导入各种各样的库,非常的方便。但有的时候我们想要使用的功能在这些库中找不到,又或者是某些功能因MicroPython的性能受限,这个时候就需要为MicroPython固件添加自定义模块了。
这篇博文要实现的目标就是使用C语言实现一个简单的FFT模块,编译到固件中,最后在ESP32开发板上进行测试,并与在matlab中的计算结果对比。
一、FFT是什么?
FFT是快速傅里叶变换,不懂的童鞋请移步 《信号与系统》《数字信号处理》

二、实现过程
1.编写C源码
代码如下
ez_fft.c
#include "ez_fft.h"
/**
* @brief bit reverse
*
* @param x the number to be reversed
* @param bit_len .eg: for N in 1~7, bit len = 3. (as 2^3 = 8)
* @return int result
*/
int bit_reverse(int x, int bit_len)
{
int ret = 0;
for(int i = 0; i < bit_len; i ++)
{
if(x & (0x1 << i))
ret |= 0x1 << (bit_len - 1 - i);
}
return ret;
}
/**
* @brief complex multiply
*
* @param a
* @param b
* @return complex_t
*/
complex_t multi_c(complex_t a, complex_t b)
{
complex_t ret;
ret.re = a.re * b.re - a.im * b.im;
ret.im = a.re * b.im + a.im * b.re;
return ret;
}
/**
* @brief complex add
*
* @param a
* @param b
* @return complex_t
*/
complex_t add_c(complex_t a, complex_t b)
{
complex_t ret;
ret.re = a.re + b.re;
ret.im = a.im + b.im;
return ret;
}
/**
* @brief complex subtraction
*
* @param a
* @param b
* @return complex_t a - b
*/
complex_t sub_c(complex_t a, complex_t b)
{
complex_t ret;
ret.re = a.re - b.re;
ret.im = a.im - b.im;
return ret;
}
/**
* @brief 旋转因子
*
* @param N 下标
* @param k 上标
* @return complex_t
*/
complex_t W(int N, int k)
{
complex_t ret;
ret.re = cos(2 * PI / N * k);
ret.im = -sin(2 * PI / N * k);
return ret;
}
/**
* @brief 蝶形运算
*
* @param a
* @param b
* @param w 旋转因子
*/
void butterfly_compu(complex_t* a, complex_t* b, complex_t w)
{
complex_t tmp1, tmp2;
tmp1 = add_c(*a, multi_c(*b, w));
tmp2 = sub_c(*a, multi_c(*b, w));
*a = tmp1;
*b = tmp2;
}
/**
* @brief 计算复数序列的摸,使用原缓冲区的前一半储存
*
* @param buff 缓冲区,实部虚部交错
* @param N 复数列长度,为缓冲区长度的一半
*/
void ezfft_abs(float* buff, int N)
{
for (in
ESP32 FFT模块

本文介绍如何使用C语言为MicroPython开发板ESP32编写一个快速傅里叶变换(FFT)模块,并将其编译到固件中进行测试。文中详细记录了从编写C源码到最终测试验证的全过程。
最低0.47元/天 解锁文章
472

被折叠的 条评论
为什么被折叠?



