You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift如何实现实时连续数据的毫秒级平滑插值过渡

实现方案

方案1:对齐MaxMSP线性斜坡效果(最贴合需求)

这个方案可以实现严格20毫秒线性过渡,过渡过程中收到新值会从当前平滑值重新开始计算过渡,和MaxMSP的行为完全一致:

import CoreMedia // 用到CACurrentMediaTime获取高精度时间戳

// 过渡时长设置为20毫秒
private let transitionDuration: TimeInterval = 0.02
// 记录过渡起始值
private var startValue: Double = 0
// 记录当前目标值
private var targetValue: Double = 0
// 记录过渡开始的时间戳
private var transitionStartTime: TimeInterval = CACurrentMediaTime()

var value: Double = 0 {
    didSet {
        // 新值到达时重置过渡状态
        startValue = currentSmoothedValue
        targetValue = value
        transitionStartTime = CACurrentMediaTime()
    }
}

// 随时调用这个属性获取当前平滑后的值
var currentSmoothedValue: Double {
    let now = CACurrentMediaTime()
    // 计算过渡进度,最大为1代表过渡完成
    let progress = min(1, (now - transitionStartTime) / transitionDuration)
    return startValue + (targetValue - startValue) * progress
}

方案2:指数平滑(更柔和的曲线过渡)

如果不需要严格线性过渡,只需要平滑的流式插值,可以用计算量更低的指数平滑方案,不需要维护过渡状态,适配任意实时数据流场景:

// 平滑系数,数值越大过渡越快,0.3对应约3~4次更新收敛到目标值
private let smoothingFactor: Double = 0.3
// 存储上一次的平滑结果
private var lastSmoothedValue: Double = 0

var value: Double = 0 {
    didSet {
        lastSmoothedValue = lastSmoothedValue * (1 - smoothingFactor) + value * smoothingFactor
        // lastSmoothedValue就是当前平滑后的值
    }
}

如果需要严格按时间控制过渡速度,可以给指数平滑加入时间差计算,不管调用频率多少都能保证过渡时长一致:

import CoreMedia

private let transitionDuration: TimeInterval = 0.02
private var lastUpdateTime: TimeInterval = CACurrentMediaTime()
private var lastSmoothedValue: Double = 0
private var targetValue: Double = 0

var value: Double = 0 {
    didSet {
        targetValue = value
    }
}

// 按你的刷新频率调用这个方法更新平滑值
private func updateSmoothedValue() {
    let now = CACurrentMediaTime()
    let timeDelta = now - lastUpdateTime
    lastUpdateTime = now
    
    let factor = 1 - exp(-timeDelta / transitionDuration)
    lastSmoothedValue = lastSmoothedValue * (1 - factor) + targetValue * factor
}

说明

你不需要使用vDSP.convolve,卷积是批处理接口,并不适配单值实时更新的流式场景,上面两个方案都只需要维护少量状态变量,性能远高于卷积实现,完全满足需求。

内容的提问来源于stack exchange,提问作者Frans-Jan Wind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:36:00