7490


リアルタイムFFTを用いた音声解析アプリをswiftで制作しており、その過程でポインタから配列に高速に変換する必要がでてしまいました。

音声をEZAudio(<https://github.com/syedhali/EZAudio>)で取得し、FFTはSurge(<https://github.com/mattt/Surge>)を使用したいのですが、EZAudioで取得される音声のバッファーの型は

[code]

    UnsafeMutablePointer<Float>
    
[/code]

一方、SurgeのFFT関数は

[code]

    func fft(input: [Float]) -> [Float]
    
[/code]

となっているので変換の必要があるのですが、for文をバッファーの要素数だけ回して、配列に１つ１つ値を入れていくと、非常にステップが増えてしまいパフォーマンスに影響が出てしまいます。  
なのでポインタのアドレスから、一気にFloatの配列に値を割り当てたいと考えているのですが、そういった方法はあるのでしょうか。

よろしくお願いいたします。


CC BY-SA 3.0
2015-03-05T05:41:37.063
7469
2015-03-05T14:10:39.620
8693
question
ios swift iphone
swiftでポインタ型から配列への変換


パフォーマンスが良いかどうかは検証していませんが、以下のコードでポインタから配列に変換できます。

[code]

    func ptrToArray(src: UnsafeMutablePointer<Float>, length: Int) -> Array<Float> {
        var dst = [Float](count: length, repeatedValue: 0.0)
    
        dst.withUnsafeMutableBufferPointer({
            ptr -> UnsafeMutablePointer<Float> in
            return ptr.baseAddress
        }).initializeFrom(src, count: length)
    
        return dst
    }
    
[/code]


CC BY-SA 3.0
2015-03-05T11:49:45.783
7490
2015-03-05T14:10:39.620
2015-03-05T14:10:39.620
3639
3639
7469
answer