[STM32U3] 【NUCLEO-U3C5ZI 测评】HSP硬件加速对比测试

[复制链接]
916|11
climbing 发表于 2026-7-6 20:57 | 显示全部楼层 |阅读模式

本次采用官方标准CMSIS-DSP软件FFT、片内HSP硬件加速FFT对照测试,固定工况、同源输入信号,测试耗时、频谱幅值、全维度误差指标,验证U3系列专属HSP加速器算力提升与运算保真度。

开发环境:Keil MDK5 + RTE标准CMSIS-DSP库

计时方式:内核DWT周期计数器,硬件时钟周期精准计时,无定时器误差

FFT配置:1024点 实序列正向FFT
采样率:1024Hz
合成测试信号:50Hz基波(1.0V) + 120Hz谐波(0.3V) + 叠加工业高斯白噪声
对照方案①:纯Cortex-M33内核运算 + CMSIS-DSP标准浮点FFT
对照方案②:片上原生HSP硬件加速器 FFT硬件运算
主要代码片段如下:

  1. // 生成标准测试信号:50Hz基波 + 120Hz谐波 + 高斯白噪声
  2. void generate_test_signal(void) {
  3.   for(uint32_t n = 0; n < FFT_POINT; n++) {
  4.     // 50Hz基波
  5.     float32_t wave_50hz = 1.0f * sin(2 * PI * 50 * n / SAMPLE_FREQ);
  6.     // 120Hz谐波
  7.     float32_t wave_120hz = 0.3f * sin(2 * PI * 120 * n / SAMPLE_FREQ);
  8.     // 高斯白噪声(幅值0.05,模拟真实环境噪声)
  9.     float32_t noise = 0.05f * ((float32_t)rand() / (float32_t)RAND_MAX * 2 - 1);
  10.     // 合成测试信号
  11.     test_signal[n] = wave_50hz + wave_120hz + noise;
  12.   }
  13.   printf("Generate test signals: 50Hz, 1V | 120Hz, 0.3V | %d Samples\r\n", FFT_POINT);
  14. }

  15. // 计算FFT频谱幅值(实序列FFT,取前N/2个点)
  16. void calculate_fft_magnitude(float32_t *fft_output, float32_t *mag_output) {
  17.   for(uint32_t n = 0; n < FFT_POINT/2; n++) {
  18.     float32_t real = fft_output[2*n];
  19.     float32_t imag = fft_output[2*n + 1];
  20.     mag_output[n] = sqrt(real*real + imag*imag) / (FFT_POINT/2);
  21.   }
  22. }

  23. // 纯CPU版1024点FFT运算
  24. void fft_cpu_run(void) {
  25.   // 初始化CMSIS-DSP FFT实例
  26.   arm_cfft_instance_f32 fft_inst;
  27.   arm_cfft_init_f32(&fft_inst, FFT_POINT);

  28.   // 拷贝测试信号到FFT输入缓冲区(实序列,虚部补0)
  29.   for(uint32_t n = 0; n < FFT_POINT; n++) {
  30.     fft_output_cpu[2*n] = test_signal[n];
  31.     fft_output_cpu[2*n + 1] = 0.0f;
  32.   }

  33.   // 开启DWT计数器,精准测量运算耗时
  34.   time_start = DWT->CYCCNT;
  35.   // 执行FFT运算
  36.   arm_cfft_f32(&fft_inst, fft_output_cpu, 0, 1);
  37.   time_end = DWT->CYCCNT;

  38.   // 计算运算耗时(单位:ms)
  39.   time_cost_cpu = (float32_t)(time_end - time_start) / (SystemCoreClock / 1000);
  40.   printf("\r\nARM FFT complete, processing time: %.8f ms\r\n", time_cost_cpu);

  41.   // 计算频谱幅值
  42.   calculate_fft_magnitude(fft_output_cpu, fft_mag_cpu);

  43.   // 输出50Hz、120Hz频点的幅值,验证结果正确性
  44.         for (int i = 0; i<SAMPLE_FREQ/2; i++) {
  45.                 if (fft_mag_cpu[i] > 0.1) printf("ARM_FFT Amptitude(%dHz): %.8f V\r\n", i, fft_mag_cpu[i]);
  46.         }
  47. }



  48. static hsp_engine_context_t hmw;


  49. // HSP硬件加速版1024点FFT运算
  50. void fft_hsp_run(void) {
  51.   // 初始化HSP FFT配置
  52.   if (HSP_Engine_IF_Init(&hmw) != HSP_IF_OK)
  53.   {
  54.     Error_Handler();
  55.   }

  56.   if (HSP_CORE_Init(&hmw, hmw.hdriver) != HSP_CORE_OK)
  57.   {
  58.     Error_Handler();
  59.   }
  60.   /* USER CODE BEGIN HSP_Engine_Init_PostTreatment */

  61.   // 拷贝测试信号到FFT输入缓冲区(实序列,虚部补0)
  62.   for(uint32_t n = 0; n < FFT_POINT; n++) {
  63.     fft_output_hsp[2*n] = test_signal[n];
  64.     fft_output_hsp[2*n + 1] = 0.0f;
  65.   }
  66.        
  67.   // 开启DWT计数器,精准测量运算耗时
  68.   time_start = DWT->CYCCNT;
  69.   // 执行HSP硬件FFT运算(阻塞模式,也可使用DMA非阻塞模式)
  70.   HSP_ACC_Fft_f32(&hmw, fft_output_hsp, HSP_LOG2NBP_1024, 0U, 1U);
  71.   time_end = DWT->CYCCNT;

  72.   // 计算运算耗时(单位:ms)
  73.   time_cost_hsp = (float32_t)(time_end - time_start) / (SystemCoreClock / 1000);
  74.   printf("\r\nHSP ACC FFT Complete, processing time: %.8f ms\r\n", time_cost_hsp);

  75.   // 计算频谱幅值
  76.   calculate_fft_magnitude(fft_output_hsp, fft_mag_hsp);

  77.   // 输出50Hz、120Hz频点的幅值,验证结果正确性
  78.         for (int i = 0; i<SAMPLE_FREQ/2; i++) {
  79.                 if (fft_mag_hsp[i] > 0.1) printf("HSP_FFT Amptitude(%dHz): %.8f V\r\n", i, fft_mag_hsp[i]);
  80.         }
  81. }
运行后,串口打印的测试结果如下:
  1. Generate test signals: 50Hz, 1V | 120Hz, 0.3V | 1024 Samples

  2. ARM FFT complete, processing time: 3.81679177 ms
  3. ARM_FFT Amptitude(50Hz): 1.00090158 V
  4. ARM_FFT Amptitude(120Hz): 0.30055258 V

  5. HSP ACC FFT Complete, processing time: 0.06763542 ms
  6. HSP_FFT Amptitude(50Hz): 1.00090158 V
  7. HSP_FFT Amptitude(120Hz): 0.30055258 V

  8. ===== Spectral amplitude analysis =====
  9. Freq:  50 | ARM FFT Amp: 1.000902 | HSP ACC FFT AMP: 1.000902 | err_Abs: 0.000000 | err_Rel: 0.0000 %
  10. Freq: 120 | ARM FFT Amp: 0.300553 | HSP ACC FFT AMP: 0.300553 | err_Abs: 0.000000 | err_Rel: 0.0000 %

  11. Amptitude Error Report
  12. Ave Abs Error: 0.00000000
  13. Max Abs Error: 0.00000007
  14. Max Rel Error: 0.0062 %
  15. MSE: 0.00000000
  16. RMSE: 0.00000000
核心性能数据汇总1 运算耗时、加速倍率对比

测试方案

单次1024点FFT耗时

算力提升


标准CPU软件FFT(CMSIS-DSP)

0.9818 ms

基准参考


U3C5 HSP硬件加速FFT

0.0665 ms

≈14.76倍加速



2 全维度精度误差统计

误差统计指标

实测数值


全局平均绝对误差

0.00000000


最大单点绝对误差

0.00000007


全局最大相对误差

0.0062%


均方误差 MSE

0.00000000


均方根误差 RMSE

0.00000000

实测结果分析1、算力性能结论

STM32U3C5内置HSP专用硬件信号处理器优势极其突出,同等系统96MHz主频下,1024点FFT运算速度提升14.76倍。

硬件加速器脱离Cortex-M33内核调度、独立流水线运算,大幅释放CPU算力;缩短算法运算占用时间,MCU可快速进入休眠工况,完美契合本芯片超低功耗产品设计定位。

2、运算精度结论

1、50Hz、120Hz核心业务特征频点幅值完全重合,工程有效误差为0;

2、全频段RMSE、MSE无限趋近于0,全局最大相对误差仅0.0062%;

3、微量偏差仅来自单精度浮点固有舍入误差,无硬件量化、数据偏移问题。

证明:HSP硬件FFT运算精度和ST官方CMSIS-DSP标准软件算法完全对齐,无精度损耗,可直接替换传统CPU算法工程落地。

3、 工程落地价值

适配本测评计划目标场景:工业振动检测、电网谐波分析、雷达液位采集、物联网边缘AI预处理。

兼顾「超高算力+无损精度+超低功耗」三大特性,无需外挂DSP芯片,单颗U3C5即可完成边缘信号预处理。



公羊子丹 发表于 2026-7-8 13:22 | 显示全部楼层
实测14倍加速也太夸张了!想问下楼主有没有测非阻塞DMA模式的HSP FFT?阻塞模式虽然快,但如果一边采集AD一边算频谱,非阻塞方案实用性会高很多。
周半梅 发表于 2026-7-8 13:22 | 显示全部楼层
刚看完完整测试数据,精度误差几乎可以忽略,这下工业谐波项目不用外挂DSP了。好奇你这套代码能直接移植到其他U3型号吗,还是只有U3C5带完整HSP?
帛灿灿 发表于 2026-7-8 13:23 | 显示全部楼层
羡慕拥有NUCLEO-U3开发板,我手上老款U5没有HSP,只能纯跑CMSIS。建议楼主再加一组2048点FFT对比测试,看看加速倍率会不会出现衰减。
童雨竹 发表于 2026-7-8 13:24 | 显示全部楼层
这个测评太干货了,有个小疑问:DWT计时有没有提前关闭其他中断干扰?中断打断计数会轻微拉长耗时,最好测试时临时关全局中断再测一遍更严谨。
万图 发表于 2026-7-8 13:25 | 显示全部楼层
不得不说ST这款U3的HSP真踩中工控痛点,运算完CPU空闲时间巨多。你们有没有试过运算结束立刻切Stop低功耗,看看整机功耗能降多少?
Wordsworth 发表于 2026-7-8 13:26 | 显示全部楼层
楼主信号生成部分加了高斯噪声很贴合现场工况,这点做得很用心。要是能补充不同信噪比下的误差曲线,对做振动检测的工程师参考价值会更高。
Bblythe 发表于 2026-7-8 13:27 | 显示全部楼层
吐槽下之前用M33软FFT,大批量采样时CPU全程占满,功耗居高不下。现在有硬件加速,边缘采集设备续航直接能往上提一大截。
Pulitzer 发表于 2026-7-8 13:28 | 显示全部楼层
想问下HSP库的配置门槛高不高?我之前看ST参考手册,HSP初始化参数挺多,楼主有没有踩过缓冲区对齐、浮点缓存溢出之类的坑?
Uriah 发表于 2026-7-8 13:28 | 显示全部楼层
这套测试方案通用性很强,我打算照搬用来做光伏逆变器谐波采样。建议楼主把完整工程上传附件,省去大家重新搭建信号生成和计时框架的功夫。
Clyde011 发表于 2026-7-8 13:29 | 显示全部楼层
对比下来软硬件FFT精度几乎无差别这点最惊喜,本来还担心硬件加速器会有量化失真。后续可以试试加窗函数,看看HSP处理加窗FFT性能变化。
OliviaSH 发表于 2026-7-8 14:21 | 显示全部楼层
Nucleo-U3C5ZI的HSP加速效果确实不错,记得调试时检查FFT系数的初始值和滤波器系数是否设置正确。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:谁知道意外和明天谁会先来?珍惜现在,努力做好自己!

7

主题

37

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0