微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 vDSP 对向量进行去交错

如何解决使用 vDSP 对向量进行去交错

假设我有一个向量:

let input: [Float] = [1,2,3,4,5,6,7,8,...]

我想要做的是通过选择每隔一个值来生成 2 个新向量作为输出来对这个向量进行去隔行扫描,如下所示:

[1,...]
[2,...]

vDSP 中执行此操作的最佳方法是什么?

解决方法

您需要的工具是vDSP.convert(interleavedComplexVector:toSplitComplexVector:)。不要让“复杂向量”迷惑你。这些是否“复杂”并不重要。 “交错的复向量”只是“一系列偶数和奇数值”。而“拆分复杂向量”只是“一个包含偶数列表和赔率列表的结构”。这些有时被解释为实部和虚部,但这种解释与 convert 的工作方式无关(并且通常与这些值在实践中的使用方式无关)。

因此假设 [Float] 如下:

let input: [Float] = [1,2,3,4,5,6,7,8]

还有两个输出列表(“向量”),例如:

var evens: [Float] = Array(repeating: 0,count: input.count / 2)
var odds = evens

你可以这样拆分它们:

evens.withUnsafeMutableBufferPointer { evenPtr in
    odds.withUnsafeMutableBufferPointer { oddPtr in

        var split = DSPSplitComplex(realp: evenPtr.baseAddress!,imagp: oddPtr.baseAddress!)

        input.withUnsafeBytes {
            vDSP.convert(interleavedComplexVector: Array($0.bindMemory(to: DSPComplex.self)),toSplitComplexVector: &split)
        }
    }
}

// At this point,evens and odds are filled in.

这是故意模仿 Apple's example code 来设置 FFT。

如果您碰巧需要以这种方式拆分更多值(尤其是 4 个值),请查看 vImageConvert_ARGBFFFFtoPlanarF 和相关函数。就像“复杂”实际上只表示“两个浮点数”,“ARGBFFFF”仅表示“4 个浮点数”。数字只是数字,有时您需要的函数恰好是根据另一个用例命名的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。