Ios 使用vDSP解交错矢量

Ios 使用vDSP解交错矢量,ios,swift,accelerate-framework,vdsp,Ios,Swift,Accelerate Framework,Vdsp,假设我有一个向量: let input:[Float]=[1,2,3,4,5,6,7,8,] 我想做的是,通过选择每隔一个值来生成2个新向量作为输出,从而对该向量进行逐行扫描,如下所示: [1, 3, 5, 7, ...] [2, 4, 6, 8, ...] 在中执行此操作的最佳方法是什么?此处需要的工具是vDSP.convert(interleavedComplexVector:toSplitComplexVector:)。不要让“复数向量”迷惑你。这些是否“复杂”并不重要。“交错复向量”

假设我有一个向量:

let input:[Float]=[1,2,3,4,5,6,7,8,]
我想做的是,通过选择每隔一个值来生成2个新向量作为输出,从而对该向量进行逐行扫描,如下所示:

[1, 3, 5, 7, ...]
[2, 4, 6, 8, ...]

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

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

因此,假设一个
[Float]
如下:

let input: [Float] = [1, 2, 3, 4, 5, 6, 7, 8]
和两个输出列表(“向量”),如:

您可以通过以下方式将其拆分:

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.
为了建立FFT,有意对其进行密切建模


如果您碰巧需要以这种方式拆分更多的值(特别是4个值),请查看
vImageConvert_argbffftoplanarf
和相关函数。就像“complex”实际上只是指“两个浮点”,“argbfff”只是指“4个浮点”数字只是数字,有时您需要的函数恰好是根据另一个用例命名的。

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

因此,假设一个
[Float]
如下:

let input: [Float] = [1, 2, 3, 4, 5, 6, 7, 8]
和两个输出列表(“向量”),如:

您可以通过以下方式将其拆分:

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.
为了建立FFT,有意对其进行密切建模


如果您碰巧需要以这种方式拆分更多的值(特别是4个值),请查看
vImageConvert_argbffftoplanarf
和相关函数。就像“complex”实际上只是指“两个浮点”,“argbfff”只是指“4个浮点”。“数字只是数字,有时您需要的函数恰好是根据另一个用例命名的。

您的值真的是整数,还是浮点数或双精度?它们是浮点数-为clarityUse更新的
vDSP_ctoz
。(如果您需要将其编写为实际代码,我可以稍后再做,但如果您已经熟悉vDSP,它应该很简单。)事实上,我忘了现在更容易了:看看DSPSplitComplex。谢谢你的帮助。我熟悉vDSP的一些部分,但不是复数向量……你的值真的是整数,还是浮点数或双精度?它们是浮点数-更新为clarityUse
vDSP_ctoz
。(如果您需要将其写成实际代码,我可以稍后再做,但如果您已经熟悉vDSP,它应该很简单。)事实上,我忘了现在更简单:看看DSPSplitComplex。感谢您的帮助。我熟悉vDSP的部分,但不熟悉复杂向量。。。