Амплитуда сигнала от времени в Java - PullRequest
3 голосов
/ 12 апреля 2010

Я ломаю голову, чтобы решить запутанную проблему (по крайней мере, для меня).

Во время воспроизведения аудиофайла (с использованием Java) я хочу, чтобы амплитуда сигнала отображалась в зависимости от времени.

Я имею в виду, что я хотел бы реализовать небольшую панель, показывающую своего рода осциллограф (анализатор спектра). Аудиосигнал следует просматривать во временной области (вертикальная ось - амплитуда, а горизонтальная ось - время).

Кто-нибудь знает, как это сделать? Есть ли хороший учебник, на который я могу положиться? Поскольку я очень мало знаю о Java, я надеюсь, что кто-нибудь сможет мне помочь.

Обновление:

В основном я хочу, чтобы амплитуда зависела от времени, а не от частоты. Аудиосигнал следует просматривать во временной области (вертикальная ось - амплитуда, а горизонтальная ось - время).

Ответы [ 4 ]

3 голосов
/ 27 апреля 2010

Основной подход заключается в следующем:

  1. собирать аудио данные, которые вы хотите отобразить. Это могут быть необработанные аудиосэмплы или результат обработки (например, усреднение по N выборкам или взятие каждой N-й выборки) для обеспечения масштабирования по оси x. (Без масштабирования вам потребуется 48000 пикселей для отображения 1 секунды звука.)

  2. Учитывая этот массив выборок, вы должны превратить его в график зависимости времени от времени. Для начала вы можете создать новый JPanel и переопределить метод рисования для рисования графика.

* 1013 Е.Г. *

public void paint(Graphics g)
{
   short[] samples;  // the samples to render - get this from step 1.

   int height = getHeight();
   int middle = height/2;

   for (int i=0; i<samples.length; i++)
   {
      int sample = samples[i];
      int amplitude = sample*middle;
      g.drawLine(i, middle+amplitide, i, middle-amplitude); 
   }  
}

Это нарисует график амплитуды-времени в вашем компоненте. он будет таким же высоким, как и компонент, и таким же широким, как количество образцов.

Чтобы получить анимацию, вы регулярно вставляете новый короткий массив [] в компонент и вызываете repaint () (конечно, все в потоке событий Swing!).

Удачи!

1 голос
/ 12 апреля 2010

Анализаторы спектра основаны на быстрых преобразованиях Фурье . Вы преуспеете, чтобы прочитать на тех. Они преобразуют сигналы от времени в частотную область.

Так вы хотите время или частоту?

0 голосов
/ 11 июня 2010

Это довольно крутой урок, который отвечает на большинство ваших вопросов: Цифровая обработка сигналов и быстрое преобразование Фурье в Java

0 голосов
/ 12 апреля 2010
...