打印
[STM32F1]

如何使用STM32提供的DSP库进行FFT

[复制链接]
1735|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dspmana|  楼主 | 2024-2-28 23:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用STM32官方提供的DSP库进行FFT,虽然在使用上有些不灵活(因为它是基4的FFT,所以FFT的点数必须是4^n),但其执行效率确实非常高效,看图1所示的FFT运算效率测试数据便可见一斑。该数据来自STM32DSP库使用文档。

图1FFT运算效率测试数据

2.如何使用STM32提供的DSP库函数

大家可以从网上搜索下载得到STM32的DSP库。

下载得到STM32的DSP库之后,就可以将其添加到自己的工程项目中了。

src文件夹下的文件可以有选择的添加(用到那个添加那个即可)。因为我只用到了256点的FFT,所以这里我只添加了cr4_fft_256_stm32.s文件。添加完成后的项目框架如图2所示。

2.3模拟采样数据

为了验证FFT运算结果的正确性,这里我模拟了一组采样数据,并将该采样数据存放到了long类型的lBufInArray数组中,且该数组中每个元素的高16位存储采样数据的实部,低16位存储采样数据的虚部(总是为0)。

下面是具体的实现代码:

2 函数名称:InitBufInArray()
4 参数说明:
6           低16位存储采样数据的虚部(总是为0)
9 void InitBufInArray()
11     unsigned short i;
15         fx = 1500 * sin(PI2 * i * 350.0 / Fs) +
17              4000 * sin(PI2 * i * 18725.0 / Fs);
19     }
其中,NPT是采样点数256,PI2是2π(即6.28318530717959),Fs是采样频率44800。可以看到采样数据中包含了3种频率的正弦波,分别为350Hz,8400Hz和18725Hz。

进行256点的FFT,只需要调用STM32DSP库函数中的cr4_fft_256_stm32()函数即可。该函数的原型为:

其中,参数pssOUT表示FFT输出数组指针,参数pssIN表示要进行FFT运算的输入数组指针,参数Nbin表示了点数。至于该函数的具体实现,因为是用汇编语言编写的,我也不懂,这里就不妄谈了。

cr4_fft_256_stm32(lBufOutArray,lBufInArray,NPT);

调用该函数之后,在lBufOutArray数组中就存放了进行FFT运算之后的结果数据。该数组中每个元素的数据格式为;高16位存储虚部,低16位存储实部。

得到FFT运算之后的结果数据之后,就可以计算各次谐波的幅值了。

1 /******************************************************************
3 函数功能:计算各次谐波幅值
5 备注:先将lBufOutArray分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X*X+Y*Y)
8 void GetPowerMag()
10     signed short lX,lY;
12     unsigned short i;
13     for(i=0; i<npt 2;="" i++)
14     {
16         lY  = (lBufOutArray >> 16);
18         Y = NPT * ((float)lY) / 32768;
20         if(i == 0)
22         else
24     }
其中,数组lBufMagArray存储了各次谐波的幅值。

使用特权

评论回复
沙发
可怜的小弗朗士| | 2024-2-29 10:29 | 只看该作者
在加上FPU就更舒服了

使用特权

评论回复
板凳
digit0| | 2024-2-29 13:32 | 只看该作者
包含必要的头文件,如stm32_dsp.h、arm_math.h 和 table_fft.h 等,以便调用相应的函数和结构体。

使用特权

评论回复
地板
LinkMe| | 2024-2-29 13:33 | 只看该作者
根据需要计算的FFT点数,分配足够的内存用于存储输入信号样本和输出结果。因为STM32的DSP库实现的FFT通常是基于固定长度且长度是2的幂次方,所以要确保采样点数满足这个要求。

使用特权

评论回复
5
理想阳| | 2024-2-29 13:33 | 只看该作者
在项目的编译选项中,将“Math”库替换为“CMSIS DSP”库,确保在项目链接设置中包含了DSP库。

使用特权

评论回复
6
ClarkLLOTP| | 2024-2-29 17:09 | 只看该作者
fft我都是超网上写好的

使用特权

评论回复
7
FranklinUNK| | 2024-2-29 19:37 | 只看该作者
自己不会写,一般都是抄

使用特权

评论回复
8
yangjiaxu| | 2024-2-29 21:46 | 只看该作者
你可以直接使用cubemx来进行配置,这种配置比较简单,而且基本上是可用的

使用特权

评论回复
9
sanfuzi| | 2024-3-1 20:00 | 只看该作者
需要下载STM32的DSP库,并将其添加到自己的工程项目中。确保添加必要的头文件,如stm32_dsp.h和table_fft.h。这些头文件包含进行FFT所需的函数和定义。

使用特权

评论回复
10
chenci2013| | 2024-3-1 20:23 | 只看该作者
#include "stm32f4xx_hal.h"
#include "arm_math.h"
// 定义FFT长度
#define FFT_LENGTH 256
// 用于存储ADC采样值的数组
float32_t inputSamples[FFT_LENGTH];
// 用于存储FFT结果的数组
float32_t fftOutput[FFT_LENGTH];
void SystemInit(void)
{
    // 初始化HAL库和ADC
    // ...
}
int main(void)
{
    HAL_Init();
    SystemInit();
    // 配置ADC和定时器
    // ...
    while (1)
    {
        // 读取ADC采样值
        // ...
        // 填充FFT输入数组
        arm_cfft_sR_init_f32(&fftHandle, FFT_LENGTH);
        // 执行FFT
        arm_cfft_sR_f32(&fftHandle, inputSamples, fftOutput);
        // 处理FFT结果
        // ...
    }
}

使用特权

评论回复
11
mickit| | 2024-3-2 00:58 | 只看该作者
#include "arm_math.h"

static arm_cfft_instance_f32 S_CFFT;

void FFT_Init(void)
{
    arm_cfft_radix4_instance_f32 *S = &S_CFFT;

    arm_cfft_radix4_init_f32(S, 1024);
}

void FFT_Process(float32_t *data)
{
    arm_cfft_radix4_f32(S, data);
}

使用特权

评论回复
12
sdlls| | 2024-3-2 08:42 | 只看该作者
如果需要进行512点或2048点的FFT,那么可能无法使用官方库。

使用特权

评论回复
13
febgxu| | 2024-3-2 17:24 | 只看该作者
配置好FFT结构体后,就可以调用DSP库中的FFT函数来进行快速傅里叶变换计算了。

使用特权

评论回复
14
deliahouse887| | 2024-3-2 19:32 | 只看该作者
void cr4_fft_256_stm32(void* pssOUT, void* pssIN, uint16_t Nbin);

使用特权

评论回复
15
cashrwood| | 2024-3-2 23:24 | 只看该作者
可以将FFT结果输出到串口或者显示在LCD上。

使用特权

评论回复
16
backlugin| | 2024-3-3 10:28 | 只看该作者
FFT计算需要较高的计算资源,因此需要确保STM32的内核时钟频率足够高。

使用特权

评论回复
17
jtracy3| | 2024-3-3 12:32 | 只看该作者
在“DSP Library”下拉菜单中选择“CMSIS DSP”。这将自动配置DSP库的相关设置。

使用特权

评论回复
18
alvpeg| | 2024-3-3 15:55 | 只看该作者
使用STM32的DSP库函数,例如arm_cfft_sR_init_f32初始化FFT配置,arm_cfft_sR_f32执行FFT计算。

使用特权

评论回复
19
updownq| | 2024-3-4 13:38 | 只看该作者
STM32 DSP库的FFT运算效率非常高。例如,在STM32F10x系列处理器上,使用72MHz的系统主频进行64点的FFT运算,仅需0.078ms;而进行1024点的FFT运算也只需要2.138ms。

使用特权

评论回复
20
pmp| | 2024-3-5 15:58 | 只看该作者
STM32的DSP库支持基于4的FFT,这意味着FFT的点数必须是4的幂(即4^n)。因此,可以选择如64点、256点或1024点的FFT

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

2556

帖子

2

粉丝