# PLSR加减速算法优化说明 ## 问题描述 原始的加减速算法存在以下问题: 1. **直线加速算法**:使用进度计算频率变化,导致每步频率变化量不一致 2. **进度计算错误**:原始公式 `1.0f - ((float)route->accel_step_count / (float)(route->accel_step_count + 1))` 无法产生正确的线性进度 3. **频率计算基准不稳定**:每次都基于当前频率计算,导致累积误差 ## 优化方案 ### 1. 算法分类处理 **直线加速/减速(PLSR_ACCEL_LINEAR)**: - 使用固定频率增量/减量 - 每步频率变化量完全一致 - 计算公式: ```c // 加速 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)**: - 使用进度计算频率变化 - 通过算法函数产生非线性变化曲线 - 计算公式: ```c 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. 进度计算修正 **修正前**: ```c float progress = 1.0f - ((float)route->accel_step_count / (float)(route->accel_step_count + 1)); ``` **修正后**: ```c float progress = (float)(total_steps - remaining_steps) / (float)total_steps; ``` ## 算法特点对比 | 算法类型 | 频率变化特点 | 适用场景 | 计算方式 | |---------|-------------|----------|----------| | 直线加速 | 每步变化量固定 | 需要均匀加速的场合 | 固定增量 | | 曲线加速 | 先慢后快的变化 | 需要平滑启动的场合 | 进度函数 | | 正弦加速 | 正弦曲线变化 | 需要最平滑过渡的场合 | 进度函数 | ## 代码实现要点 ### 1. 状态初始化 ```c // 记录总步数和起始频率(仅在第一次进入时) if (total_accel_steps == 0) { total_accel_steps = route->accel_step_count; start_freq_accel = route->current_freq; } ``` ### 2. 算法选择 ```c switch (current_section->accel_config.accel_algorithm) { case PLSR_ACCEL_LINEAR: // 直线算法:固定增量 break; case PLSR_ACCEL_CURVE: case PLSR_ACCEL_SINE: // 非线性算法:进度计算 break; } ``` ### 3. 状态重置 ```c // 加速/减速完成时重置静态变量 total_accel_steps = 0; start_freq_accel = 0; ``` ## 优化效果 1. **直线加速**:真正实现每步频率变化量一致 2. **曲线/正弦加速**:保持原有的非线性特性,但进度计算更准确 3. **数值稳定性**:避免累积误差,频率变化更精确 4. **代码清晰性**:不同算法分别处理,逻辑更清晰 ## 测试建议 1. **直线加速测试**:验证每步频率增量是否完全一致 2. **曲线加速测试**:验证频率变化曲线是否符合预期 3. **边界条件测试**:验证起始和结束频率是否准确 4. **多段切换测试**:验证段间切换时静态变量重置是否正确 ## 注意事项 1. 静态变量在函数内部,多路径同时运行时可能需要考虑重入问题 2. 除法运算需要注意除零保护 3. 浮点运算精度可能影响最终结果,必要时可考虑定点运算