【MicroPython学习笔记】02 添加自定义模块(使用C语言实现)

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

系列文章目录

【MicroPython学习笔记】01 使用块设备



前言

在使用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
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值