如何解决使用 vDSP 对向量进行去交错
let input: [Float] = [1,2,3,4,5,6,7,8,...]
我想要做的是通过选择每隔一个值来生成 2 个新向量作为输出来对这个向量进行去隔行扫描,如下所示:
[1,...]
[2,...]
解决方法
您需要的工具是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 举报,一经查实,本站将立刻删除。