硬汉嵌入式论坛

 找回密码
 立即注册
查看: 144|回复: 4
收起左侧

[算法] 一共180个点,想做平滑的曲线,1个点扩充8个点。

[复制链接]

100

主题

299

回帖

599

积分

金牌会员

123

积分
599
发表于 昨天 10:06 | 显示全部楼层 |阅读模式
一共180个点,想做平滑的曲线,1个点扩充8个点,一共1440个点,有没有成熟的算法?直接可以调用的,谢谢各位大佬
回复

使用道具 举报

10

主题

52

回帖

82

积分

初级会员

积分
82
发表于 昨天 10:11 | 显示全部楼层
算法不知道,数学里面有插值的公式
回复

使用道具 举报

100

主题

299

回帖

599

积分

金牌会员

123

积分
599
 楼主| 发表于 昨天 10:53 | 显示全部楼层
quanshimutou 发表于 2025-4-25 10:11
算法不知道,数学里面有插值的公式

这个算法用过吗

// Catmull-Rom核心插值函数(输入4点,输出插值点)
float catmull_rom(float t, float p0, float p1, float p2, float p3) {
    return 0.5 * ((-p0 + 3*p1 -3*p2 +p3)*t*t*t
                + (2*p0 -5*p1 +4*p2 -p3)*t*t
                + (-p0 + p2)*t
                + 2*p1);
}

// 全局插值流程(输入180点,输出1440点)
void interpolate(float input[180], float output[1440]) {
    for(int i=0; i<1440; i++) {
        float pos = i * (180-1.0) / 1440.0; // 计算原始坐标位置
        int idx = (int)pos;
        float t = pos - idx;

        // 边界处理(复制首尾点)
        float p0 = (idx>0) ? input[idx-1] : input[0];
        float p1 = input[idx];
        float p2 = (idx<179) ? input[idx+1] : input[179];
        float p3 = (idx<178) ? input[idx+2] : input[179];

        output = catmull_rom(t, p0, p1, p2, p3);
    }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 昨天 11:06 | 显示全部楼层
ssssssss 发表于 2025-4-25 10:53
这个算法用过吗

// Catmull-Rom核心插值函数(输入4点,输出插值点)

这个有专业的,使用这个

基于STM32H7的第2版DSP教程发布样条插补章节,波形绘制丝滑顺畅(2021-11-01)
https://www.armbbs.cn/forum.php? ... 9370&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

100

主题

299

回帖

599

积分

金牌会员

123

积分
599
 楼主| 发表于 昨天 14:26 | 显示全部楼层
eric2013 发表于 2025-4-25 11:06
这个有专业的,使用这个

基于STM32H7的第2版DSP教程发布样条插补章节,波形绘制丝滑顺畅(2021-11-01 ...

这个好像是一个库?我不是放在stm32上跑的,能直接拷贝库里面的函数吗?
我上面的算法是ai给出的答案,不知道能不能用?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 02:15 , Processed in 0.224299 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表