2017-07-07 11 views
1

Swift AccelerateライブラリのvDSP_ctozを使用して、インターリーブされたDSPComplexベクタをDSPSplitComplexベクタに変換しようとしています。以下のコードの最後の行でエラーが発生するSegmentation fault: 11Swift Accelerateを使用したセグメンテーションエラーvDSP_ctoz

大きなベクトルを割り当てたときにvDSP_ctozがアウトオブバウンドメモリにアクセスしようとする理由がわかりません。少数の要素を処理しようとしています。ベクトルはvDSP_ctozにサイズ2048とNの引数(プロセスへの要素の数)ですvDSP_ctozを呼び出すときに、私はまた、無駄に、異なるストライドとN値を使用してみました。1.

です。

// set stride values 
let dspComplexStride = MemoryLayout<DSPComplex>.stride 
let dspSplitComplexStride = MemoryLayout<DSPSplitComplex>.stride 

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

// make split vector 
var splitComplex = UnsafeMutablePointer<DSPSplitComplex>.allocate(capacity: 2048) 
vDSP_ctoz(
    interleaved, dspComplexStride, splitComplex, dspSplitComplexStride, 1 
) 

答えて

2

DSPSplitComplexので、あなたは、単一のDSPSplitComplex要素を必要とし、そのrealpimagpプロパティの ストレージを割り当てる必要がありポインタの配列、 を含む構造です。

"ストライド"引数はバイト単位ではなく、 "要素"単位で測定されます。 したがって、__IZ == 1を渡すには、宛先配列に連続する要素 を埋めたいからです。これは、ソース・アレイの__IC == 2を通過しなければならないことは明らかではないかもしれない

、ソース配列のすなわち ストライドはFloat単位ではなく DSPComplex単位で与えられます。これは、関数が効果的に最後に、vDSP_ctozの最後の引数が プロセスへの要素の数である

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 documentation から推定することができます。

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]) 
} 

そしてもちろん、あなたは最終的にメモリを解放する必要があります。それをすべて一緒に置く

が、これはそれが動作するはず方法です。

関連する問題