Частота фильтрации по данным.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). Надеюсь, что это дает вам направление.