2017-01-26 6 views
0

私はあなたの助けが必要です。私のオーディオファイルにFFTを使用したいと思っています。私はより小さなバッファ配列で私のオーディオファイルをカットし、すべてのサブバッファで自分のFFTを使用したい。スウィフトFFTチャンクオーディオファイルの振幅を

なぜですか?なぜなら私のfréquenceがいかに特殊性を持っているかを(プロットデータで)知り、見る必要があるからです。私は知りたい、どのようにノイズが私のオーディオファイルから始まる。

これは私のFFTコードです。私は間違って何をしているのかわかりません。あなたの助け

のコードの編集

func FFT (buffer: AVAudioPCMBuffer){ 

    let frameCount = buffer.frameCapacity 
    let log2n = UInt(round(log2(Double(frameCount)))) 

    print (" log2n \(log2n)"); 

    let bufferSizePOT = Int(1 << log2n) 

    print (" bufferSizePot \(bufferSizePOT)"); 
    let inputCount = bufferSizePOT/2 
    let fftSetup = vDSP_create_fftsetup(log2n, Int32(kFFTRadix2)) 

    var realp = [Float](repeating: 0, count: inputCount) 
    var imagp = [Float](repeating: 0, count: inputCount) 
    var output = DSPSplitComplex(realp: &realp, imagp: &imagp) 


    let windowSize = bufferSizePOT 
    var transferBuffer = [Float](repeating: 0, count: windowSize) 
    var window = [Float](repeating: 0, count: windowSize) 

    vDSP_hann_window(&window, vDSP_Length(windowSize), Int32(vDSP_HANN_NORM)) 
    vDSP_vmul((buffer.floatChannelData?.pointee)!, 1, window, 
       1, &transferBuffer, 1, vDSP_Length(windowSize)) 

    let temp = UnsafePointer<Float>(transferBuffer) 

    temp.withMemoryRebound(to: DSPComplex.self, capacity: transferBuffer.count) { (typeConvertedTransferBuffer) -> Void in 
     vDSP_ctoz(typeConvertedTransferBuffer, 2, &output, 1, vDSP_Length(inputCount)) 

    } 

    // Do the fast Fourier forward transform, packed input to packed output 
    vDSP_fft_zrip(fftSetup!, &output, 1, log2n, FFTDirection(FFT_FORWARD)) 


    //--------------------------------------------------- 


    var magnitudes = [Float](repeating: 0.0, count: inputCount) 
    vDSP_zvmags(&output, 1, &magnitudes, 1, vDSP_Length(inputCount)) 

    var normalizedMagnitudes = [Float](repeating: 0.0, count: inputCount) 
    vDSP_vsmul(sqrt(x: magnitudes), 1, [2.0/Float(inputCount)], 
       &normalizedMagnitudes, 1, vDSP_Length(inputCount)) 


    for f in 0..<normalizedMagnitudes.count 
    { 
     print("\(f), \(normalizedMagnitudes[f])") 
    } 


    vDSP_destroy_fftsetup(fftSetup) 

} 
+1

問題/質問は何ですか? –

+0

このコードを使用すると、私のFFTが誤った値を返します。信号処理能力の高い人と話し合って、FFTを適用するx秒の部分を作成するために、レートサンプルの倍数のあとに曲を分解するように勧められました。ですから、私が望むものに近い特定のカーブを見つけたら、私が私のオーディオで探しているノイズは、私が考えているかもしれません。だから分解の回数は私が前に落ちる前から時間を与えるでしょう。私のタイマーが始まるべき場所。 –

答えて

0

ため

THX基本的には、代わりに

frameCount = UInt32(audioFile.length) 

を作るのあなたは、(4096など、おおよそのためframeCountのためのはるかに小さいを使用したいですオーディオファイルの1/10th)、オーディオファイルをループし、proceの代わりにframeCountの長さの小さなデータチャンクを読み込んで処理します(より短いウィンドウFFTを実行する)。 1つの巨大なFFTでファイル全体をシングします。オーディオファイルのサンプルデータをループと同じ長さののFFTのシリーズをやったとき、あなたは一度だけfftSetupを行う必要があることを

注意。

あなたがしたい場合は、あなたのプリントアウトの時間分解能と長さを短くするために、より長い期間にわたってマグニチュードベクトルを結果の和集合をベクトルすることができます。これは、スペクトル密度推定のWelch's methodの形式です。

+0

ありがとうございました。私はそれが素晴らしいと思います。 AVEngineを使用してオーディオファイルにフィルタを適用し、フィルタが適用されたときにオーディオファイルを保存するためにバスに1回タップします。私の新しいファイルを保存するために、私はmixecodeをframecount = 4096のバッファに渡します。何を意味するのか正しく理解していれば、それはうまく動作しないかもしれませんか? 2秒間の長さのソングに21バッファーを使用しているので、私はその大丈夫だと思います。 私は最後の質問が1つあります。私は自分のFFTで大きさを取る。私は私のnormalizedMagnitudesのインデックスは何か知りません。値は大きさですが、私の知りたいことはわかりません...ごめんなさい –