嵌入式开发:磁通门传感器开发(6):在STM32上实现FFT需要的空间资源

文章目录

      • 空间资源计算
      • 综合考虑
      • 结论

在 STM32 上使用 CMSIS-DSP 库进行 FFT 计算时,我们这里进行的是 128 点的实数 FFT(使用 arm_rfft_fast_f32),每个点用一个 float 表示(占 4 字节),那么我们可以从以下几个方面来估算所需要的空间资源:

空间资源计算

  1. 原始采样数据:
    128 个 float 数据占据的空间:128 * 4 = 512

  2. FFT 输出数据:
    对于实数 FFT,输出通常也会用 128 个 float 存储(例如,DC、Nyquist 以及一对一对的频谱分量),也需要 512 字节。
    如果你使用就地算法,输入和输出可以共用同一块缓冲区;如果采用双缓冲,则需要独立的输入和输出区域。

  3. 临时中间缓冲区(Scratch Buffer):
    根据 CMSIS-DSP 库的实现,有时内部运算可能需要一个临时缓冲区。对于 arm_rfft_fast_f32,一般需要的中间缓冲区大小与 FFT 点数相同,也就是 128 个 float(512 字节)。
    临时中间缓冲区不一定必须是局部变量,这取决于它的大小以及程序的设计需求。

  • 局部变量:如果中间缓冲区的大小较小,并且只在某个函数内部使用,可以将其定义为局部变量(通常分配在栈上)。这种方式简单直接,但要注意栈空间有限,尤其在嵌入式系统中,较大的数组可能会导致栈溢出。
  • 全局变量或静态变量:如果中间缓冲区比较大,或者需要在多个函数中共享,可能会选择将其定义为全局变量或静态变量,这样可以避免栈空间不足的问题,此时需要注意SRMA空间够用。
  • 动态分配:另外,还可以使用动态内存分配(如 malloc/free)来创建缓冲区,这样可以根据需要在堆上分配内存,使用完毕后释放。但在嵌入式系统中,动态内存分配可能引入碎片化或其他问题,因此需要谨慎使用。
    总结来说,临时中间缓冲区可以作为局部变量(如果内存占用较小),也可以采用其他内存分配策略,这取决于我们对内存资源、缓冲区大小以及数据生命周期的需求。
    不过,这部分内存可以由你来决定:
    • 如果库实现为就地算法,可能不需要额外的缓冲区;
    • 如果是非就地处理,则可能需要为缓冲区分配 512 字节。
  1. FFT 实例结构体:
    例如 arm_rfft_fast_instance_f32 结构体中会保存 FFT 的参数、指向预计算旋转因子(twiddle factors)和位反转表的指针等。这些数据通常在库中是静态或预先分配的,占用的内存很少(几十字节),可以忽略不计。

综合考虑

  • 最小情况(就地 FFT):
    如果输入数据可以就地转换为输出数据,并且库内部不需要额外的中间缓冲区,你至少需要 512 字节来存储 128 个 float 数据。

  • 较常见情况(非就地 FFT或需要独立输入和输出):

    • 输入数据:512 字节
    • 输出数据:512 字节
      总计:1024 字节
  • 如果还需要额外的临时缓冲区:
    再加 512 字节,中间可能需要 1024 + 512 = 1536 字节左右的 RAM。


结论

实际需要的 RAM 大小取决于我们如何组织内存以及所使用的 FFT 算法实现方式。对于 128 点 FFT,每个点 4 字节,原始数据占 512 字节;如果采用双缓冲(输入和输出分开),就需要大约 1024 字节;再加上可能的中间缓冲区,总内存需求可能在 1 KB 到 1.5 KB 之间。

你可能感兴趣的:(嵌入式开发,stm32,嵌入式硬件,单片机,傅里叶变换,MCU资源计算)