2017-01-26 25 views
0

我需要你的幫助。想要在我的音頻文件上使用FFT。我想在更小的緩衝區陣列中剪切我的音頻文件,並將我的FFT與所有的子緩衝區一起使用。快速FFT塊音頻文件得到Amplitude

爲什麼??因爲我需要知道和看到(與情節數據)我的fréquence有多特別。我想知道,如何在我的音頻文件中開始噪音。

這是我的FFT代碼。我不知道我做錯了什麼。

THX對您有所幫助

編輯代碼

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會給我返回不正確的值。通過與更能勝任信號處理的人討論,我建議將歌曲分解成多倍速率樣本,以便創建x秒的片段,以便在其中應用FFT。所以如果在那些如果我找到一條特定曲線或更接近我想要的曲線的地方,我可能會認爲我在我的音頻中尋找的噪音是。所以分解的次數會讓我在開始之前從頭開始計時。我的計時器應該開始的地方。 –

回答

0

基本上,反而讓

frameCount = UInt32(audioFile.length) 

你想使用的幀數又小得多(如4096,用於粗略1/10秒的音頻),然後遍歷音頻文件,分別讀取和處理frameCount長度較小的數據塊(做較短的窗口FFT),而不是過程在一個巨大的FFT中查看整個文件。

請注意,當循環播放音頻文件採樣數據並執行一系列相同長度的FFT時,您只需執行一次fftSetup即可。

如果需要,您可以在較長的時間內矢量合成所得幅度矢量的和集,以縮短打印輸出的時間分辨率和長度。這是譜密度估計的一種形式。

+0

非常感謝。我認爲這很好。我使用AVEngine在我的音頻文件上應用過濾器,並且在應用過濾器時,我在總線上點擊一下以保存音頻文件。爲了保存我的新文件,我將我的mixernode傳遞給framecount = 4096的緩衝區。如果我正確地理解了你的意思,那甚至可能不起作用? 我認爲它可以,因爲我使用了21緩衝區來播放持續時間爲2秒的歌曲。 我還有最後一個問題。我採用FFT進行測量。我不知道我的歸一化魔獸的指數是什麼。價值是數量級,但我的指數我不知道...對不起 –