eefocus_3947073 发表于 4 天前

【瑞萨AI挑战赛】加速FFT算法交流频率主动预测功能

致谢:感谢瑞萨官方提供本次FPB-RA6E2快速原型板的评测机会,为本次实践与报告撰写提供了有力支持。

**一.目标完成任务**

1. **完成快速原型板卡的环境与调试**
2. **完成快速原型板卡的基本功能编译**
3. **尝试移植FFT快速测频算法**
4. **模型测试**

**二.FFT算法介绍**

**    FFT(快速傅里叶变换)是离散傅里叶变换(DFT)的高效实现算法,核心作用是将时域信号(如传感器采集的连续电压信号)快速转换为频域信号,清晰呈现信号的频率分布特征,大幅降低DFT算法的计算量,提升信号处理效率。其核心原理是通过分治思想,将N点DFT分解为多个小点数DFT的组合,减少乘法与加法运算次数,广泛应用于数字信号处理、传感器数据分析、通信、音频处理等领域,也是本次评测中板卡加速验证的核心算法。**

**    FFT算法在交流电频率计算已经得到广泛的应用了,但是FFT算法的频率计算是有限的,对于高速使用或者对于频率有快速响应要求的情况下,FFT算法反而就会显示出他的滞后性,本次为了目的是否能够通过模型训练来加速FFT算法**

**三.基础测评过程**

1. **软件安装:安装e² studio IDE与瑞萨FSP软件包,配置编译器与调试器,确保IDE可正常识别板载J-Link仿真器;**
2. **项目初始化:创建基于FPB-RA6E2的快速入门项目,复制demo项目并修改名称,编译项目确认无报错;**
3. **外设配置:配置ADC与DMAC模块,选择引脚作为ADC采样通道,启用扫描中断与传输中断,关联ADC与DMAC模块以实现数据高速采集;**
4. **调试配置:添加SEGGER\_RTT组件,初始化RTT功能,通过J-Link RTT Viewer查看调试信息,验证ADC数据采集功能正常;**
5. **基础测试:编写简单测试程序,实现ADC传感器数据采集与打印,确认板卡供电稳定、外设工作正常,数据采集无丢失、无异常噪声。**

四.调试过程
!(https://www.eefocus.com/forum/data/attachment/forum/202603/18/143247zwxohghyfyghno45.png)
第一次使用studio调试软件,因为有过gcc的经验所以上手起来还是比较快的,第一次安装的时候遇到VSC++一直安装不上后来从网上寻找到的小脚本工具才正常安装上了,如果你遇到同样的问题,我会在文末把小工具分享出来。

!(https://www.eefocus.com/forum/data/attachment/forum/202603/18/143254z5k52s5dzorxzo2t.png)
通过打印信息将所获取的频率给打印出来,通过自己写的相关脚本把数据给包装起来。

!(https://www.eefocus.com/forum/data/attachment/forum/202603/18/143257zmwoohfsfthhsbwq.png)

模拟数据测试,从文件打包出来的历史数据。

---

示例代码内容

````/*
#include "r_fft.h"
#include "rtthread.h"
#include "dsp/fft.h"

/* 配置FFT算法参数 */
#define FFT_POINTS       1024    // FFT计算点数(2的幂次,适配瑞萨FFT库)
#define FFT_SAMPLE_FREQ1000    // 采样频率1kHz(与ADC采集频率一致)
#define FFT_DATA_BUF_LEN (FFT_POINTS * 2)// 复数数组长度(实部+虚部)

/* 定义FFT输入输出缓冲区(对齐内存,提升运算效率) */
ALIGN(4) static rt_int16_t fft_input_buf;// 输入:实部在前,虚部补0
ALIGN(4) static rt_int16_t fft_output_buf; // 输出:复数结果
static float fft_magnitude; // 存储频域幅值(仅取前半部分有效数据)

/* 模拟ADC采样数据(实际场景替换为板卡ADC采集数据) */
static void fft_simulate_adc_data(rt_int16_t *buf, rt_uint32_t len)
{
    rt_uint32_t i;
    /* 生成混合正弦波:50Hz + 100Hz(模拟传感器时域信号) */
    for (i = 0; i < len/2; i++)
    {
      /* 实部:50Hz正弦波 + 100Hz正弦波,幅值缩放至16位范围 */
      buf = (rt_int16_t)(3000 * rt_sin(2 * RT_PI * 50 * i / FFT_SAMPLE_FREQ)
                              + 2000 * rt_sin(2 * RT_PI * 100 * i / FFT_SAMPLE_FREQ));
      buf = 0; // 虚部初始化为0
    }
}

/* 计算FFT幅值(模值),仅保留前N/2个频点(奈奎斯特频率) */
static void fft_calc_magnitude(rt_int16_t *fft_out, float *magnitude, rt_uint32_t points)
{
    rt_uint32_t i;
    for (i = 0; i < points/2; i++)
    {
      /* 幅值 = 根号(实部² + 虚部²),缩放为浮点值 */
      float real = (float)fft_out / 32768.0f;
      float imag = (float)fft_out / 32768.0f;
      magnitude = rt_sqrt(real*real + imag*imag);
    }
}

/* 打印FFT关键频点结果(仅打印幅值前10个频点,简化输出) */
static void fft_print_result(float *magnitude, rt_uint32_t points)
{
    rt_uint32_t i;
    rt_kprintf("\nFFT计算结果(前10个频点):\n");
    rt_kprintf("频点(Hz) | 幅值\n");
    rt_kprintf("------------------\n");
    for (i = 0; i < 10; i++)
    {
      /* 频点频率 = 采样频率 * 频点索引 / FFT点数 */
      rt_uint32_t freq = FFT_SAMPLE_FREQ * i / points;
      rt_kprintf("%-8d | %.4f\n", freq, magnitude);
    }
}

void hal_entry(void)
{
    rt_kprintf("\nHello RT-Thread!\n");
    rt_kprintf("==================================================\n");
    rt_kprintf("This example project is a FFT algorithm routine!\n");
    rt_kprintf("FFT Points: %d | Sample Freq: %dHz\n", FFT_POINTS, FFT_SAMPLE_FREQ);
    rt_kprintf("==================================================\n");

    /* 初始化FFT输入缓冲区 */
    rt_memset(fft_input_buf, 0, sizeof(fft_input_buf));
    rt_memset(fft_output_buf, 0, sizeof(fft_output_buf));
    rt_memset(fft_magnitude, 0, sizeof(fft_magnitude));

    do
    {
      /* 1. 模拟ADC采集时域数据 */
      fft_simulate_adc_data(fft_input_buf, FFT_DATA_BUF_LEN);

      /* 2. 执行FFT计算*/

      r_fft_execute(fft_input_buf, fft_output_buf, FFT_POINTS);

      /* 3. 计算频域幅值 */
      fft_calc_magnitude(fft_output_buf, fft_magnitude, FFT_POINTS);

      /* 4. 打印FFT结果 */
      fft_print_result(fft_magnitude, FFT_POINTS);

      /* 5. 延时1秒,循环执行FFT */
      rt_thread_mdelay(1000);

    }while(1); // 无限循环执行FFT
}`
````

五.结论
本次测试的过程还是很赶时间的,很多扩展功能还没有测试到,不过还是很感谢官方给的本次测试机会

六.附录

解决编译软件权限不足的问题链接:(https://itxiaozhang.com/fix-visual-cpp-error-1402-registry-permission/)

页: [1]
查看完整版本: 【瑞萨AI挑战赛】加速FFT算法交流频率主动预测功能