Я использую 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.Как мне справиться с этим программно?