【问题标题】:How to smooth interpolation of a float array into a bigger array?如何将浮点数组平滑插值到更大的数组中?
【发布时间】:2020-12-26 23:45:44
【问题描述】:

我被 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 进行更平滑的插值(但不是出于我的目的)

问题是这两种技术都没有实现我的期望,这在Screenshot 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))

【问题讨论】:

  • 我无法回答你的问题,但我不得不说,这是一个很好的问题,特别是对于第一次发帖的人!明确的问题、努力的证明、代码示例、实际结果与预期结果。干得好,欢迎!
  • 非常感谢@Alexander-ReinstateMonica!我尽力证明,我想解决什么^_^

标签: swift interpolation cubic-spline vdsp accelerate


【解决方案1】:

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

【讨论】:

  • 可能。我见过这个函数,但不明白参数应该是什么样子。尤其是第二个 - _ __B: UnsafePointer<Float>。他们说:“单精度实数输入向量。整数部分是 A 的索引,小数部分是插值常数”。对我来说没有胶水,什么是 fractional 和什么是 integer 部分。也许你可以解释一下?
  • 参数和你在线性插值函数中使用的一样。诀窍是更改您的输入函数及其坐标(以及所需的输出坐标),以便它们很好地重叠。按摩您的输入函数,使其具有 f(i) 的形式,其中 i 是整数序列(从 0 到最大值)。然后按摩您想要的输出函数 g(j),使其坐标沿着同一轴下降,值也从 0 到最大值。这些输出函数坐标通常会落在输入函数中使用的整数值之间。
  • @aiba 单精度向量和双精度向量,仅表示浮点和双精度。如果您查看文档,您可以看到只有指针的类型发生了变化developer.apple.com/documentation/accelerate/1449771-vdsp_vgenpdeveloper.apple.com/documentation/accelerate/… 我认为这在 Swift 文档的浮点数中也有很好的解释docs.swift.org/swift-book/LanguageGuide/TheBasics.html 您还可以打印 Float 的值。 pi 和 Double.pi 看看有什么区别。
  • 对于整数部分之后,, 之前的内容和小数部分之后的内容。另外,我认为在您的情况下,您正在寻找三次样条插值而不是线性插值。我还没有找到如何使用 Accelerate Framework 来实现这一点,但这里有一个可以做到这一点的库。 github.com/gscalzo/SwiftCubicSpline
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 2014-10-23
  • 2015-08-04
  • 2020-08-06
  • 2021-07-16
相关资源
最近更新 更多