2017-01-26 12 views
0

도와주세요. FFT를 내 오디오 파일에 사용하고 싶습니다. 더 작은 버퍼 배열에서 내 오디오 파일을 자르고 모든 하위 버퍼와 함께 FFT를 사용하고 싶습니다.신속한 FFT 청크 오디오 파일을 통해 진폭을

왜 ?? 필자의 fréquence가 어떻게 특수성을 가지는지 알 필요가 있기 때문입니다. 나는 오디오 파일에서 잡음이 시작되는 방법을 알고 싶다.

이것이 내 FFT 코드입니다. 나는 무엇을 잘못하고 있는지 모른다. 당신의 도움이

편집 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

문제점/질문은 무엇입니까? –

+0

이 코드를 사용할 때 FFT가 잘못된 값을 반환합니다. 신호 처리 능력이 뛰어난 사람과 논의함으로써 FFT를 적용 할 x 초의 조각을 만들기 위해 속도 샘플의 배수에 따라 노래를 분해하라는 권고를 받았습니다. 따라서 내가 원하는 곡선을 찾거나 원하는 곡선에 가까운 곡선을 찾으면 오디오에서 찾고있는 잡음을 고려해야합니다. 그래서 분해의 횟수는 떨어지기 전에 처음부터 시간을 줄 것입니다. 내 타이머가 시작되어야하는 곳. –

답변

0

에 대한

들으 기본적으로, 대신

frameCount = UInt32(audioFile.length) 

를 만드는 당신은 (예 : 4096 등, 약에 대한 frameCount에 대한 훨씬 더 작은을 사용하려면 오디오의 1/10th), 오디오 파일을 루프하여 proce 대신 frameCount 길이의 데이터를 더 작은 단위로 읽고 처리합니다 (짧은 창으로 표시된 FFT를 개별적으로 수행). 하나의 거대한 FFT에서 전체 파일을 검색합니다.

오디오 파일 샘플 데이터를 반복하고 동일한 길이의 일련의 FFT를 수행 할 때 fftSetup을 한 번만 수행하면됩니다.

원한다면 더 긴 시간 동안 결과 크기 벡터의 벡터 합계를 벡터화하여 인쇄 시간 해상도와 인쇄 길이를 줄일 수 있습니다. 이것은형태의 스펙트럼 밀도 추정입니다.

+0

정말 고마워요. 나는 그것이 굉장하다고 생각한다. AVEngine을 사용하여 오디오 파일에 필터를 적용하고 필터를 적용 할 때 오디오 파일을 저장하기 위해 버스에서 한 번 탭합니다. 내 새 파일을 저장하기 위해, mixecode를 framecount = 4096으로 버퍼에 넘깁니다. 무슨 뜻인지 정확히 이해했다면 작동하지 않을 수도 있습니다. 나는 2 초 길이의 노래로 21 버퍼를 사용하기 때문에 괜찮다고 생각합니다. 마지막 질문이 하나 있습니다. 나는 FFT로 크기를 줄인다. 내 normalizedMagnitudes의 인덱스는 무엇인지 모르겠다. 가치는 크기지만 내 색인 난 모르겠다 ... 죄송합니다 –