UnsafeMutablePointer <Float>, возвращаемый vDSP_fft_zip, который немедленно перезаписывается - PullRequest
0 голосов
/ 10 октября 2018

В Swift 4 я создаю DSPSplitComplex для использования в vDSP_fft_zip (), но он сразу же перезаписывается при следующем создании другого DSPSplitComplex.

(структура DSPSplitComplex имеет 2 UnsafeMutablePointer<Float>)

//--Create the DSPSplitComplex    
var A = [Float](repeating:0, count:32); 
var B = [Float](repeating:0, count:32)
var splitComplex1 = DSPSplitComplex(realp: &A, imagp: &B)

//--Perform fft
log2Size = vDSP_Length(log2f(Float(32)))
setupFFT = vDSP_create_fftsetup(log2Size, FFTRadix(FFT_RADIX2))!;
vDSP_fft_zip(setupFFT, & splitComplex1, 1, log2Size, FFTDirection(FFT_FORWARD));

//--Create another DSPSplitComplex    
var C = [Float](repeating:0, count:32); 
var D = [Float](repeating:0, count:32)
var splitComplex2 = DSPSplitComplex(realp: &C, imagp: &D)

Теперь я вижу в отладчике, что UnsafeMutablePointer из splitComplex2.realp является тем же адресом, что и splitComplex1.realp, и, следовательно, все, что я делаю с splitComplex2, перезаписывает splitComplex1

Я предполагаю, что ключ может бытьв заголовке «небезопасно», но если это на самом деле непригодно, то какова правильная стратегия хранения содержимого возвращенного DSPSplitComplex?

Я думаю, создание из них новых массивов [Float] - это способ сделатьпостоянная копия

let arrary = Array(UnsafeBufferPointer(start: splitComplex1.realp, count: 32))

... но, похоже, несмотря на чтение документов Swift, я все еще неправильно понимаю смысл UnsafeMutablePointer, так как почему vDSP_fft_zip () возвращает что-то, что не может быть использовано с самого начала?

1 Ответ

0 голосов
/ 10 октября 2018

Ваш способ создания DSPSplitComplex неверен.

Когда вы передаете Array<Float> в UnsafeMutablePointer<Float>, используя &, адрес, переданный функции, действителен только внутри функции.

Таким образом, в вашем коде два переданных адреса DSPSplitComplex(realp: &A, imagp: &B) недопустимы, когда инициализатор DSPSplitComplex завершен.

Чтобы избежать такого поведения, вы можете попробовать что-то вроде этого:

var A = [Float](repeating:0, count:32)
var B = [Float](repeating:0, count:32)
A.withUnsafeMutableBufferPointer {aumbp in
    B.withUnsafeMutableBufferPointer {bumbp in
        var splitComplex1 = DSPSplitComplex(realp: aumbp.baseAddress!, imagp: bumbp.baseAddress!)

        //--Perform fft
        let log2Size = vDSP_Length(log2f(Float(32)))
        let setupFFT = vDSP_create_fftsetup(log2Size, FFTRadix(FFT_RADIX2))!
        vDSP_fft_zip(setupFFT, &splitComplex1, 1, log2Size, FFTDirection(FFT_FORWARD))
    }
}

Или вы можете выделить UnsafeMutableBufferPointer<Float> с и использовать их вместо Array<Float>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...