首页 > 解决方案 > 以编程方式为 DSPSplitComplex 复数创建存储阵列

问题描述

我正在使用 Apple 的 Accelerate 框架。我正在使用 DSPSplitComplex 数字来处理复杂的向量。

我想创建一个过滤器库(过滤器数组)。为此,我遍历一个循环,并使用以下代码将结果添加到我的数组中:

func makeSine(freq:Float, N:Int) -> DSPSplitComplex {
    var sreal:[Float] = Array(repeating: 0, count: N)
    var simag:[Float] = Array(repeating: 0, count: N)
    var compSine = DSPSplitComplex(realp: UnsafeMutablePointer(mutating:sreal), imagp: UnsafeMutablePointer(mutating:simag))
    for i in 0..<t.count{
        var x = 2 * Float.pi * freq * t[i]
        sreal[i] = cos(x)
        simag[i] = sin(x)
    }
    return compSine
}

上面的函数产生一个复杂的正弦波。我用以下方法调用该函数:

var s = makeSine(freq:400.0, N:2048)

我的问题是使用 DSPSplitComplex 我正在创建指向函数中初始化的数组的指针。我无法直接在 Xcode 的调试区域中检查变量 s,但是我使用以下代码实现了这一点:

 var inspect:[Float]=[]

        for i in 0..<t.count {
            inspect.append(s.realp[I])
}

t.count 是过滤器的长度。将此数组的值与在 makeSine 函数中打印的值进行比较,它们都非常不同。因为这只是一个指针,我相信它没有传递实际值,并且这些数组正在被释放。

我的问题是我正在考虑迭代 makeSine(和其他函数)几百次,从而产生数百个 realp 和 imagp 数组。我如何以编程方式处理这些?

标签: arraysswiftcomplex-numbersaccelerate

解决方案


好的,我实际上比我想象的更早找到了解决这个问题的方法,并发布以帮助他人。

在我班的顶部,我为实部和虚部初始化了单独的数组:

var realSines:[[Float]]=[]
var imagSines:[[Float]]=[]

那么重写的 makeSine 函数是:

func makeSine(freq:Float, N:Int, iteration:Int) -> DSPSplitComplex {
    var sreal:[Float] = Array(repeating: 0, count: N)
    var simag:[Float] = Array(repeating: 0, count: N)
    var compSine = DSPSplitComplex(realp: UnsafeMutablePointer(mutating:sreal), imagp: UnsafeMutablePointer(mutating:simag))
    for i in 0..<t.count{
        var x = 2 * Float.pi * freq * t[i]
        sreal[i] = cos(x)
        simag[i] = sin(x)
    }
    realSines.append(sreal)
    imagSines.append(simag)
}

然后每当我想使用 DSPSplitComplex 时,我都会声明它:

 var tempSineReal = realSines[iteration]
 var tempSineImag = imagSines[iteration]
 var tempSine = DSPSplitComplex(realp: UnsafeMutablePointer(mutating:tempSineReal), imagp: UnsafeMutablePointer(mutating: tempSineImag))

推荐阅读