使用Swift Accelerate vDSP_ctoz进行分段错误

时间:2017-07-07 22:00:55

标签: swift segmentation-fault accelerate-framework vdsp

我正在尝试使用Swift Accelerate库中的 File progress = new File(Environment.getExternalStorageDirectory(), "TestFolder"); if (!progress.exists()) { progress.mkdir(); } 将交错的android.permission.WRITE_EXTERNAL_STORAGE向量转换为DSPComplex向量。下面代码的最后一行产生错误DSPSplitComplex

我不明白为什么vDSP_ctoz会在我分配大型向量时尝试访问越界内存并且只是尝试处理少量元素。向量的大小为2048,Segmentation fault: 11vDSP_ctoz的参数(要处理的元素数)为1。

我在调用N时也尝试使用不同的步幅和vDSP_ctoz值,但无济于事。

N

1 个答案:

答案 0 :(得分:2)

DSPSplitComplex是一个包含指针数组的结构, 所以你需要一个DSPSplitComplex元素并且必须分配 存储其realpimagp属性。

" stride"参数不是以字节为单位,而是以"元素"单位。 所以你传递__IZ == 1因为你想要填充连续的元素 在目标数组中。

您必须将__IC == 2传递给源数组可能并不明显,即 源数组的步幅以Float单位给出,而不是。{ DSPComplex单位。这可以从vDSP_ctoz documentation推断出来 提到函数有效地做了

for (n = 0; n < N; ++n)
{
  Z->realp[n*IZ] = C[n*IC/2].real;
  Z->imagp[n*IZ] = C[n*IC/2].imag;
}

最后,vDSP_ctoz的最后一个参数是要素的数量 过程

总而言之,这就是它应该如何运作:

import Accelerate

let N = 16

var interleaved = UnsafeMutablePointer<DSPComplex>.allocate(capacity: N)
for index in 0..<N {
    interleaved[index] = DSPComplex(real: Float(2*index), imag: Float(2*index+1))
}

let realp = UnsafeMutablePointer<Float>.allocate(capacity: N)
let imagp = UnsafeMutablePointer<Float>.allocate(capacity: N)
var splitComplex = DSPSplitComplex(realp: realp, imagp: imagp)

vDSP_ctoz(interleaved, 2, &splitComplex, 1, vDSP_Length(N))

for index in 0..<N {
    print(splitComplex.realp[index], splitComplex.imagp[index])
}

当然你最终必须释放内存。