簡體   English   中英

在Swift中使用Accelerate Framework復數支持

[英]Using Accelerate Framework complex number support in Swift

我需要在Swift中使用Accelerate Multiply,Complex Conjugate和Exp執行以下操作。 我已經使用dankogaiComplex Swift代碼完成了此操作 ,但是對於我正在做的工作來說太慢了。 我在使用Accelerate框架創建工作版本時遇到了麻煩,希望能夠加深我的理解。

SWIFT代碼

let frequencyShift = (2 * M_PI * Double(self.centralFrequency) * delays).i / Double(self.samplingFrequencyHertz)
let result = conj(exp(frequencyShift))

delays是大約200k倍的數組,這些行將被稱為數百次。 我將它們轉換為Swift復雜樣式的Complex Number,然后在結果上調用complex exp()和conj()方法。

雙精度復數矢量標量乘法。

vDSP_zvzsmlD

共軛

復合矢量共軛 雙精度。

vDSP_zvconjD

Accelerate中是否有等效的exp() ,您將如何重組此代碼以執行等效的Accelerate'd版本的操作?

在Swift中使用Accelerate的一般原則

我發現第一次嘗試將您的代碼從使用for循環的幼稚實現轉換為映射很有用。 如果您的代碼結構適合與地圖一起使用,則由於您已經解決了將算法結構化為向量化操作的問題,因此切換加速變得非常容易。

循環映射

let array: [Int] = [1, 2, 3, 4]
let array2 = [Int]()
for value in array {
    array2 = value * 2
}

let array: [Int] = [1, 2, 3, 4]
array.map({ (value: Int) -> Int in
    return value * 2
})

在相等大小的陣列版本上運行

如果發現要枚舉兩個或更多個相同大小的數組,則上述方法可以將map與enumerate結合使用

let alphas: [Double] = betas.enumerate().map({ (index: Int, beta: Double) -> Double in
    return beta * phis[index]
})

設置陣列以與Accelerate一起使用

使用Accelerate的方法並不總是很明顯,特別是UnsafePointerUnsafeMutablePointer語法。 這基本上是不必要的。

var alphaLowers = [Double](count: elementDelays.count, repeatedValue: 0)
vDSP_vmulD(&alphas, 1, &x_ns, 1, &alphaLowers, 1, UInt(elementDelays.count))

因此,Swift允許您創建一個自動的內存管理對象,然后將其與&符號一起傳遞,從而避免了malloc和free的麻煩。 我之所以這樣說是因為它避免嘗試將對象包裝在此UnsafeMutablePointer<Double>(alphaLowers)

復數

我想做的大多數事情都依賴於涉及復數的運算。 因此,要創建可以在Accelerate中使用的對象,可以嘗試以下操作。

var reals = [Double](count: 100, repeatedValue: 0)
var imaginaries = [Double](count: 100, repeatedValue: 0)
var complexNumbers = DSPDoubleSplitComplex(realp: &reals, imagp: &imaginaries)

復雜的exp()

我沒有找到與exp相當的Accelerate等效項,但是您可以使用下面使用Complex Swift庫說明的Euler方法分解值並對實部和虛部執行必要的操作。

public func exp<T:RealType>(z:Complex<T>) -> Complex<T> {
    let r = T.exp(z.re)
    let a = z.im
    return Complex(r * T.cos(a), r * T.sin(a))
}

我沒有找到避免此問題的好方法,因此我實際上不使用Accelerate來執行此步驟。 簡單地通過對虛部進行求反即可計算出復共軛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM