我在Swift中卡住了插值。有人能帮我吗?
我想将浮点数组(例如[0,0,100,25,0,0,0,25,0,0,0]
)插入到另一个给定大小的数组中(例如128)。我找到了一篇文章(使用线性插值构造新数据点),展示了如何实现这个东西。
有两种方式(可以看到下面的结果,它们的表现如何):
- 使用
vDSP_vgenp
进行线性插值和 - 更平滑(但不适用于我的目的)的插值使用
vDSP_vlint
问题是这两种技术都没有实现我的期望,这在截图3中说明。如何使我的插值分布更平滑?我想看到一个立方体状的曲线。
初始图:
线性插值:
import Accelerate
let n = vDSP_Length(128)
let stride = vDSP_Stride(1)
let values: [Float] = [0, 0, 100, 25, 0, 0, 0, 25, 0, 0, 0]
let indices: [Float] = [0, 11, 23, 34, 46, 58, 69, 81, 93, 104, 116]
var result = [Float](repeating: 0, count: Int(n))
vDSP_vgenp(values, stride, indices, stride, &result, stride, n, vDSP_Length(values.count))
平滑插值:
import Accelerate
import AVFoundation
let n = vDSP_Length(1024)
let stride = vDSP_Stride(1)
let values: [Float] = [0, 0, 100, 25, 0, 0, 0, 25, 0, 0, 0]
let denominator = Float(n) / Float(values.count - 1)
let control: [Float] = (0 ... n).map {
let x = Float($0) / denominator
return floor(x) + simd_smoothstep(0, 1, simd_fract(x))
}
var result = [Float](repeating: 0, count: Int(n))
vDSP_vlint(values, control, stride, &result, stride, n, vDSP_Length(values.count))