如何将浮点数组平滑插入到更大的数组中?

aib*_*iba 10 interpolation vdsp cubic-spline swift accelerate

我被 Swift 中的插值卡住了。任何人都可以帮助我吗?

我想将浮点数组(例如[0, 0, 100, 25, 0, 0, 0, 25, 0, 0, 0])插入另一个具有给定大小(例如128)的数组中。我找到了一篇文章(Use Linear Interpolation to Construct New Data Points),它展示了如何实现这些东西。

有两种方法(您可以在下面看到结果,它们的表现如何):

  • 使用vDSP_vgenp和的线性插值
  • 更平滑(但不是为了我的目的)插值使用 vDSP_vlint

问题是这两种技术都没有实现我的期望,如截图 3 所示。如何使插值分布更平滑?我想看到一个立方体状的曲线

初始情节:

截图 1

线性插值:

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))
Run Code Online (Sandbox Code Playgroud)

截图 2

平滑插值:

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))
Run Code Online (Sandbox Code Playgroud)

截图 3

Kei*_*thB 0

在我看来,vDSP_vqint二次插值函数可以解决这个问题。请参阅https://developer.apple.com/documentation/accelerate/1449942-vdsp_vqint上的讨论。

  • 对于整数部分,“,”之前的内容和小数部分之后的内容。另外,我认为在你的情况下,你正在寻找三次样条插值而不是线性插值。我还没有找到如何使用 Accelerate Framework 来实现这一点,但这里有一个库可以实现相同的功能。https://github.com/gscalzo/SwiftCubicSpline (3认同)