PLSR执行学习
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

3.6 KiB

PLSR加减速算法优化说明

问题描述

原始的加减速算法存在以下问题:

  1. 直线加速算法:使用进度计算频率变化,导致每步频率变化量不一致
  2. 进度计算错误:原始公式 1.0f - ((float)route->accel_step_count / (float)(route->accel_step_count + 1)) 无法产生正确的线性进度
  3. 频率计算基准不稳定:每次都基于当前频率计算,导致累积误差

优化方案

1. 算法分类处理

直线加速/减速(PLSR_ACCEL_LINEAR)

  • 使用固定频率增量/减量
  • 每步频率变化量完全一致
  • 计算公式:
    // 加速
    freq_increment = (target_freq - start_freq) / total_steps
    new_freq = start_freq + (freq_increment * completed_steps)
      
    // 减速
    freq_decrement = (start_freq - target_freq) / total_steps
    new_freq = start_freq - (freq_decrement * completed_steps)
    

曲线加速/减速(PLSR_ACCEL_CURVE)和正弦加速/减速(PLSR_ACCEL_SINE)

  • 使用进度计算频率变化
  • 通过算法函数产生非线性变化曲线
  • 计算公式:
    progress = completed_steps / total_steps
    freq_ratio = algorithm_function(progress)  // 0.0 到 1.0
    new_freq = start_freq + (freq_range * freq_ratio)
    

2. 静态变量管理

引入静态变量记录关键参数:

  • total_accel_steps / total_decel_steps:记录总步数
  • start_freq_accel / start_freq_decel:记录起始频率

这样确保:

  • 频率计算基准稳定
  • 避免累积误差
  • 进度计算准确

3. 进度计算修正

修正前

float progress = 1.0f - ((float)route->accel_step_count / (float)(route->accel_step_count + 1));

修正后

float progress = (float)(total_steps - remaining_steps) / (float)total_steps;

算法特点对比

算法类型 频率变化特点 适用场景 计算方式
直线加速 每步变化量固定 需要均匀加速的场合 固定增量
曲线加速 先慢后快的变化 需要平滑启动的场合 进度函数
正弦加速 正弦曲线变化 需要最平滑过渡的场合 进度函数

代码实现要点

1. 状态初始化

// 记录总步数和起始频率(仅在第一次进入时)
if (total_accel_steps == 0) {
    total_accel_steps = route->accel_step_count;
    start_freq_accel = route->current_freq;
}

2. 算法选择

switch (current_section->accel_config.accel_algorithm) {
    case PLSR_ACCEL_LINEAR:
        // 直线算法:固定增量
        break;
    case PLSR_ACCEL_CURVE:
    case PLSR_ACCEL_SINE:
        // 非线性算法:进度计算
        break;
}

3. 状态重置

// 加速/减速完成时重置静态变量
total_accel_steps = 0;
start_freq_accel = 0;

优化效果

  1. 直线加速:真正实现每步频率变化量一致
  2. 曲线/正弦加速:保持原有的非线性特性,但进度计算更准确
  3. 数值稳定性:避免累积误差,频率变化更精确
  4. 代码清晰性:不同算法分别处理,逻辑更清晰

测试建议

  1. 直线加速测试:验证每步频率增量是否完全一致
  2. 曲线加速测试:验证频率变化曲线是否符合预期
  3. 边界条件测试:验证起始和结束频率是否准确
  4. 多段切换测试:验证段间切换时静态变量重置是否正确

注意事项

  1. 静态变量在函数内部,多路径同时运行时可能需要考虑重入问题
  2. 除法运算需要注意除零保护
  3. 浮点运算精度可能影响最终结果,必要时可考虑定点运算