Как создать изображение спектрограммы из org.datavec.audio.Spectrogram из Deeplearning4J? - PullRequest
0 голосов
/ 20 сентября 2018

Я ищу способы создания изображения спектрограммы в приложении для Android.Я нашел этот проект , который, кажется, выполняет половину требуемой работы: он загружает аудио-файл и создает двумерный массив интенсивностей в заданное время и частоту.Тем не менее, теперь я немного растерялся: как генерировать видимую человеком картину из этих данных?

Насколько я понимаю, это будет включать отображение значений интенсивности из [-1,1] floatдиапазон цветов пикселей.Но, будучи новичком в обработке звука, я не знаю, как это делают другие приложения.

Я не ищу точный код: я был бы признателен просто за описание общего подхода.

1 Ответ

0 голосов
/ 18 апреля 2019

Библиотека предоставляет функцию public double[][] getNormalizedSpectrogramData() для возврата данных аудиоспектрограммы, которые являются нормализованными числовыми данными (между 0 и).

Возвращаемое значение первого индекса - это число выборок, тогда как второй индексэто значения частотного диапазона (возможно, я не прав, исправления приветствуются!).

Есть много способов отобразить это, я создал рабочий пример в JavaFX:

import javafx.event.ActionEvent;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.paint.Color;
import org.datavec.audio.Wave;
import org.datavec.audio.extension.*;

import java.io.InputStream;

public class Controller {
    public ImageView imgDisplay;

    public void loadMusic(ActionEvent actionEvent) {
        InputStream is = getClass().getResourceAsStream("/sounds/oxp.wav");
        Wave wave = new Wave(is);
        Spectrogram sptr = new Spectrogram(wave);

        double[][] spData = sptr.getNormalizedSpectrogramData();
        WritableImage resImg = new WritableImage(spData.length,spData[0].length);
        PixelWriter pxWr = resImg.getPixelWriter();

        int x = 0, y = 0;
        for(double[] col : spData) /* or row?! */
        {
            y = 0;
            for(double item : col)
            {
                resImg.getPixelWriter().setColor(x,y, Color.rgb((int)(item * 255),(int)(item * 255),(int)(item * 255)));
                y++;
            }
            x++;
        }

        System.out.println("Done! Image size is: " + x + "," + y);
        imgDisplay.setFitWidth(x);
        imgDisplay.setFitHeight(y);
        imgDisplay.setImage(resImg);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...