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)
}
Was ist das Problem/die Frage? –
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. –