如何对实数和复数数组进行交织以使用vDSP_ctoz?

时间:2019-03-02 20:59:53

标签: ios swift

多年来,迅速的语法发生了变化,这种可以正常运行的代码不再存在...

var zerosR = [Float](count: windowSizeOverTwo, repeatedValue: 0.0)
var zerosI = [Float](count: windowSizeOverTwo, repeatedValue: 0.0)
var cplxData = DSPSplitComplex( realp: &zerosR, imagp: &zerosI )

let xAsComplex = UnsafePointer<DSPComplex>( inputSignal.withUnsafeBufferPointer { $0.baseAddress } )
vDSP_ctoz( xAsComplex, 2, &cplxData, 1, vDSP_Length(windowSizeOverTwo) )

vDSP_fft_zrip( setup, &cplxData, 1, log2n, FFTDirection(kFFTDirection_Forward) )

这段代码的每一行在Swift 4下都显示一个错误

我能够转换除此行以外的所有内容

let xAsComplex = UnsafePointer<DSPComplex>( inputSignal.withUnsafeBufferPointer { $0.baseAddress } )

无法编译并显示此错误

  

无法转换“ UnsafePointer”类型的值?达到预期   参数类型'UnsafePointer <_>?'

1 个答案:

答案 0 :(得分:1)

指向Float数组中的inputSignal元素的指针必须被 rebound 指向指向DSPComplex值的数组:

let inputSignal: [Float] = ...

inputSignal.withUnsafeBufferPointer {
    floatPtr in
    floatPtr.withMemoryRebound(to: DSPComplex.self) {
        cmplxPtr in
        vDSP_ctoz(cmplxPtr.baseAddress!, 2, &cplxData, 1, vDSP_Length(windowSizeOverTwo) )
    }
}

另请参见UnsafeRawPointer Migration

请注意,这些指针仅在执行闭包期间有效,并且不得传递给外部。您在

中所做的
let xAsComplex = UnsafePointer<DSPComplex>( inputSignal.withUnsafeBufferPointer { $0.baseAddress } )

实际上是依靠未定义的行为。