Частота фильтрации по данным.m4a

Я пытаюсь проанализировать звуковой файл (.m4a), чтобы получить амплитуды во времени и построить график. Я нашел некоторый код онлайн, который прекрасно работает (ниже). Однако я хотел бы дополнительно отфильтровать все звуки, которые не находятся в заданном диапазоне частот. Например, я хочу только построить график звуков, которые находятся между 1900-2100 Гц. Как я могу это сделать?

    var processingBuffer = [Float](repeating: 0.0, count: Int(readFile.arrayFloatValues.count))
    let sampleCount = vDSP_Length(readFile.arrayFloatValues.count)

    vDSP_vabs(readFile.arrayFloatValues, 1, &processingBuffer, 1, sampleCount);

    let samplesPerPixel = 1
    let filter = [Float](repeating: 1.0 / Float(samplesPerPixel), count: Int(samplesPerPixel))
    let downSampledLength = Int(readFile.arrayFloatValues.count / samplesPerPixel)
    var downSampledData = [Float](repeating:0.0, count:downSampledLength)

    vDSP_desamp(processingBuffer,
                vDSP_Stride(samplesPerPixel),
                filter, &downSampledData,
                vDSP_Length(downSampledLength),
                vDSP_Length(samplesPerPixel))

    readFile.points = downSampledData.map{CGFloat($0)}

редактировать

Запись фактически записывается с микрофона устройства в более раннее время. Возможно, проще применить фильтр на этапе записи?

1 ответ

Возможным способом было бы применить дискретное преобразование Фурье к выбранному файлу. Преобразование Фурье передает аудиоданные из временной области в частотную область. Получив эти данные в частотной области, вы можете просто "обрезать" частоту, которую вы не хотите иметь, и выполнить обратное преобразование Фурье с вашими сокращенными данными, чтобы снова получить их во временной области и перейти к код вы упомянули. Взгляните на https://github.com/christopherhelf/Swift-FFT-Example, он содержит пример кода, как работать с быстрым и быстрым преобразованием Фурье (FFT). Надеюсь, что это дает вам направление.

Другие вопросы по тегам