2017-01-26 3 views
0

zu bekommen Ich brauche deine Hilfe. Ich möchte die FFT in meiner Audiodatei verwenden. Ich möchte meine Audiodatei in mehr kleine Puffer-Array schneiden und meine FFT mit allen Sub-Puffer verwenden.swift FFT Chunk-Audiodatei, um Amplitude

warum? weil ich wissen und sehen muss (mit plot daten) wie meine fréquence besonderheit haben. Ich möchte wissen, wie ein Geräusch in meiner Audiodatei beginnt.

das ist mein FFT-Code. Ich weiß nicht, was ich falsch mache.

thx für Ihre Hilfe

EDITING CODE

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

Was ist das Problem/die Frage? –

+0

Wenn ich diesen Code verwende, gibt meine FFT falsche Werte an mich zurück. Bei der Besprechung mit jemandem, der kompetenter in der Signalverarbeitung ist, wurde mir geraten, mein Lied selbst um ein Vielfaches des Sample zu zerlegen, um Stücke von x Sekunden zu erzeugen, in denen die FFT angewendet wird. Wenn ich also eine bestimmte Kurve finde oder näher an der gewünschten bin, könnte ich meinen, dass das Geräusch, das ich in meinem Audio suche, das ist. Die Anzahl der Zersetzungen wird mir also von Anfang an Zeit geben. Der Ort, an dem mein Timer starten soll. –

Antwort

0

Grundsätzlich statt Herstellung

frameCount = UInt32(audioFile.length) 

wollen Sie für Framecount einen viel kleineren verwenden (wie etwa 4096, für etwa 1/10tel Audio-Sekunde) und dann durch die Audiodatei, wobei jeder kleinere Datenblock der frameCount-Länge (anstelle von kürzeren gefensterten FFTs) separat gelesen und verarbeitet wird, anstatt proce Die gesamte Datei in einer großen FFT.

Beachten Sie, dass Sie die fftSetup nur einmal ausführen müssen, wenn Sie die Audiodatei-Beispieldaten durchlaufen und eine Reihe von FFTs gleicher Länge ausführen.

Wenn Sie möchten, können Sie Summensätze von resultierenden Betragsvektoren über einen längeren Zeitraum vektorisieren, um die Zeitauflösung und die Länge Ihres Ausdrucks zu reduzieren. Dies ist eine Form der Welch's method Spektraldichteschätzung.

+0

vielen Dank. Ich finde es toll. Ich verwende die AVEngine, um Filter auf meine Audiodatei anzuwenden, und ich habe einen Tipp auf Bus, um die Audiodatei zu speichern, wenn mein Filter angewendet wurde. um meine neue datei zu speichern, gebe ich meinen mixernode an meinen buffer mit framecount = 4096. wenn ich richtig verstanden habe was meinst du, könnte das auch funktionieren nein? ich denke, es ist in Ordnung, weil ich 21 Puffer für ein Lied mit der Dauer von 2 seconde verwenden. Ich habe eine letzte Frage dazu. Ich nehme die Größe mit meiner FFT. Ich weiß nicht, was der Index meiner normalisierten Magnituden ist. der Wert ist die Größe, aber mein Index weiß ich nicht ... Entschuldigung –