Флаттер / Java Plot Mp3 Интенсивность частоты - PullRequest
0 голосов
/ 31 августа 2018

Я не совсем правильно знаю, как объяснить, чего именно добиваюсь. Мне нужно отследить интенсивность определенных частот из mp3-файла определенное количество раз на Android (Java) (или, если возможно, на Dart (Flutter)) . Это изображение, объясняющее, что я имею в виду:

Я сделал этот скриншот в Blender, используя Bake Sound to f-Curve Modifier , и это именно то, чего я пытаюсь достичь, но он написан на C ++, поэтому первым делом я попытался получить некоторые подсказки из исходного кода, но мне не удалось ничего найти.

Как вы можете видеть это не в режиме реального времени, но это значение определенной частоты (диапазон частот в данном случае: 80-255 Гц) во времени .

увеличенная версия Как вы можете видеть, это просто график интенсивности этой частоты во времени. и «деления» по оси X в этом случае составляют около 180 с / 600 кадров.

Что касается формата файла : Входные файлы в формате mp3 или wav.

За то, что касается языка :

Моя главная цель - добиться этого в java, но если это возможно, было бы неплохо сделать это во Флаттере (так что Дарт). Я спрашиваю один из двух. Если Flutter невозможен или слишком труден, реализация Java в любом случае хороша, я использую канал платформы в приложении, так что это не большая проблема.

Я посмотрел в Интернете, но единственными учебниками, которые я смог найти, были примеры в реальном времени, в которых использовался FFT.

Лучшее объяснение того, что мне нужно: У меня есть несколько кадров: скажем, 300. Мне нужна функция, которая выглядит примерно так:

List<Integer> calculateFrequencies(int number_of_frames, double freq_low, 
freq_high, String FilePath){
List<Integer> result = new ArrayList<>();
double length = //Here I need to obtain the length of the song in units as small as possible, for example, milliseconds or nanoseconds

for(int v = 0, v < number_of_frames; v++){

    double currFrame = lenght/300 * v;
    double intensity = get_intensity(currFrame, freq_low, freq_high) //How Could I do this?? 


    result.add(intensity);
 }

return result;

}

Как я мог это сделать?

Это возможно? И если это так, возможно ли и в Android?

1 Ответ

0 голосов
/ 31 августа 2018

Дискретное преобразование Фурье (для которого БПФ является наиболее часто используемым алгоритмом) - это именно то, что вам нужно, поскольку оно сопоставит ваши выборки временной области с частотной областью. Предполагая, что у вас есть сэмплы звука за определенный период времени и частота, с которой они были сэмплированы, вы сможете достичь своей цели, на самом деле не имеет значения, в реальном времени это или нет.

Вторым шагом будет обработка результатов вашего БПФ, в результате чего будут получены амплитуды частот, присутствующих в вашей выборке.

Попробуйте Github для реализаций FFT на основе Java https://github.com/search?q=java+fft, и вы, вероятно, найдете там также несколько примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...