MCU上三角函数计算速度对比

文章详细比较了STM32G431芯片上使用不同方法(CORDIC、ARM_DSP库和基本数学函数)计算三角函数的速度和精度,包括Q15、Q31、F32浮点类型以及泰勒展开法,展示了不同算法在实时性能上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

使用170M主频M4f核芯片(STM32G431),启用浮点加速,启用arm_dsp库。
对比条件:

方式 输入 输出
cordic q15 q15
arm_dsp_q15 q15 q15
arm_dsp_q31 q31 q31
arm_dsp_f32 float float
math float float
math double double
taylor6 float float

测试代码

硬件cordic

/**
  * @brief  Trigonometrical functions type definition
  */
typedef struct
{
   
  int16_t hCos;
  int16_t hSin;
} Trig_Components;
/* CORDIC FUNCTION: COSINE q1.15 */
#define CORDIC_CONFIG_COSINE    (LL_CORDIC_FUNCTION_COSINE | LL_CORDIC_PRECISION_6CYCLES | LL_CORDIC_SCALE_0 |\
         LL_CORDIC_NBWRITE_1 | LL_CORDIC_NBREAD_1 |\
         LL_CORDIC_INSIZE_16BITS | LL_CORDIC_OUTSIZE_16BITS)

__weak Trig_Components MCM_Trig_Functions(int16_t hAngle)
{
   
  union u32toi16x2 {
   
    uint32_t CordicRdata;
    Trig_Components Components;
  } CosSin;

  WRITE_REG(CORDIC->CSR, CORDIC_CONFIG_COSINE);
  LL_CORDIC_WriteData(CORDIC, ((uint32_t)0x7FFF0000) + ((uint32_t)hAngle));
  CosSin.CordicRdata = LL_CORDIC_ReadData(CORDIC);
  return (CosSin.Components);
 
}

泰勒展开函数

float factorial(int n) {
   
    if (n == 0) {
   
        return 1.0f;
    } else {
   
        return n * factorial(n - 1);
    }
}

float taylor_sin(float x, int n) {
   
    float result = 0.0f;
    float sign = 1.0f;
    for (int i = 0; i < n; i++) {
   
        result += (sign * powf(x, 2 * i + 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值