Программно создавать массивы хранения для комплексных чисел DSPSplitComplex - PullRequest
0 голосов
/ 29 марта 2019

Я использую Apple Accelerate Framework с Swift.Я работаю с числами 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. Я создаю указатели на массивы, инициализированные в функции.Я не могу проверить переменную s непосредственно в области отладки в XCode, однако я достигаю этого, используя следующий код:

 var inspect:[Float]=[]

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

t.count, являющийся длиной фильтра.Сравнивая значения этого массива со значениями, напечатанными в функции makeSine, они оба сильно различаются.Поскольку это всего лишь указатель, я считаю, что он не передает фактические значения, и эти массивы освобождаются.

Моя проблема в том, что я смотрю на итерации по makeSine (и другим функциям) несколько сотен раз, что приводит к сотням массивов realp и imagp.Как мне справиться с этим программно?

1 Ответ

0 голосов
/ 29 марта 2019

Ладно, я действительно нашел способ обойти это раньше, чем думал и писал, чтобы помочь другим.

В начале моего класса я инициализирую отдельные массивы для реальной и мнимой частей:

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))
...