问题描述
我在Swift中一直插值。有人可以帮我吗?
我想将float数组(例如[0,100,25,0]
)插入到具有给定大小(例如 128 )的另一个数组中。我找到了一篇文章(Use Linear Interpolation to Construct New Data Points),其中显示了如何实现这些目标。
- 使用
vDSP_vgenp
和 的线性插值
- 使用
vDSP_vlint
进行平滑处理(但不是出于我的目的)
问题是两种技术都无法实现我的期望,Screenshot 3中对此进行了说明。如何使插值分布更平滑?我想看到一个类似立方体的曲线。
初始图:
线性插值:
import Accelerate
let n = vDSP_Length(128)
let stride = vDSP_Stride(1)
let values: [Float] = [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,&result,n,vDSP_Length(values.count))
平滑插值:
import Accelerate
import AVFoundation
let n = vDSP_Length(1024)
let stride = vDSP_Stride(1)
let values: [Float] = [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,vDSP_Length(values.count))
解决方法
在我看来vDSP_vqint
二次插值函数可以解决此问题。参见https://developer.apple.com/documentation/accelerate/1449942-vdsp_vqint上的讨论。