Bagaimana cara memuluskan interpolasi dari float array menjadi array yang lebih besar?

Sep 08 2020

Saya terjebak dengan interpolasi di Swift. Dapatkan seseorang menolong saya dengan itu?

Saya ingin menginterpolasi array float (katakanlah [0, 0, 100, 25, 0, 0, 0, 25, 0, 0, 0]) ke dalam array lain dengan beberapa ukuran tertentu (misalnya 128 ). Saya menemukan sebuah artikel ( Gunakan Interpolasi Linear untuk Membangun Titik Data Baru ) yang menunjukkan, bagaimana mencapai hal ini.

Ada dua cara (Anda dapat melihat hasilnya di bawah ini, bagaimana kinerjanya):

  • Interpolasi Linear menggunakan vDSP_vgenpdan
  • Lebih halus (tetapi tidak untuk tujuan saya) Penggunaan interpolasi vDSP_vlint

Masalahnya, kedua teknik tersebut tidak sesuai dengan harapan saya, yang diilustrasikan pada Screenshot 3 . Bagaimana cara membuat distribusi interpolasi saya lebih lancar? Saya ingin melihat kurva seperti kubus .

Plot Awal:

Interpolasi Linear:

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))

Interpolasi Halus:

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))

Jawaban

KeithB Sep 13 2020 at 03:01

Menurut saya, vDSP_vqintfungsi interpolasi kuadrat akan menyelesaikan masalah. Lihat pembahasannya dihttps://developer.apple.com/documentation/accelerate/1449942-vdsp_vqint.