Как сгенерировать аудиофайл с обращенной фазой из входного аудиофайла в Swift? - PullRequest
0 голосов
/ 22 января 2019

Я записываю звук через аудио-движок и создаю имя файла my_file.caf и пытаюсь создать другой файл с инверсией фазы, чтобы я мог отменить его голос в моно.

Но когда я делаю некоторыеоперации и расчеты, он обратил свою греховную волну, но также обратил звук.

do {
    let inFile: AVAudioFile = try AVAudioFile(forReading: URLFor(filename: "my_file.caf")!)
    let format: AVAudioFormat = inFile.processingFormat
    let frameCount: AVAudioFrameCount = UInt32(inFile.length)
    let outSettings = [AVNumberOfChannelsKey: format.channelCount,
                       AVSampleRateKey: format.sampleRate,
                       AVLinearPCMBitDepthKey: 16,
                       AVFormatIDKey: kAudioFormatMPEG4AAC] as [String : Any]

    let outFile: AVAudioFile = try AVAudioFile(forWriting: URLFor(filename: "my_file1.caf")!, settings: outSettings)
    let forwardBuffer: AVAudioPCMBuffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCount)!
    let reverseBuffer: AVAudioPCMBuffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCount)!

    try inFile.read(into: forwardBuffer)
    let frameLength = forwardBuffer.frameLength
    reverseBuffer.frameLength = frameLength
    let audioStride = forwardBuffer.stride

    for channelIdx in 0..<forwardBuffer.format.channelCount {
        let forwardChannelData = forwardBuffer.floatChannelData?.advanced(by: Int(channelIdx)).pointee
        let reverseChannelData = reverseBuffer.floatChannelData?.advanced(by: Int(channelIdx)).pointee

        var reverseIdx: Int = 0
        for idx in stride(from: frameLength, to: 0, by: -1) {
            memcpy(reverseChannelData?.advanced(by: reverseIdx * audioStride), forwardChannelData?.advanced(by: Int(idx) * audioStride), MemoryLayout<Float>.size)
            reverseIdx += 1
        }
    }
    try outFile.write(from: reverseBuffer)
} catch let error {
    print(error.localizedDescription)        
}

Я перепробовал все возможные способы, и я застрял, так что кто-то может помочь?

1 Ответ

0 голосов
/ 29 января 2019

Мой наивный подход был бы таким: вычесть среднее (смещение), умножить на -1, добавить среднее обратно.

...