2014-11-16 4 views
7

Я хотел бы создать цветной генератор шума с использованием Java, который будет в состоянии генерировать все цвета, определенные в этой статье: http://en.wikipedia.org/wiki/Colors_of_noiseГенерация цвета шума в Java

  1. Начиная с самого простого, White Noise , как бы я генерировал шум, чтобы он мог играть бесконечно?
  2. Оттуда, как мне изменить свой генератор для генерации любых цветов?

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

Любые ссылки или советы будут очень благодарны!

Я также посмотрел на другой вопрос: Java generating sound

Но я не совсем понимаю, что происходит в коде, приведенном в одном из комментариев. Он также не говорит мне, какой шум будет генерироваться с помощью этого кода, и поэтому я не знаю, как его модифицировать, чтобы он генерировал белый шум.

+0

Вопрос, который вы связываете, связан с генерированием «звуковых сигналов» и их воспроизведением. «Звуковые сигналы» - это просто ваша обычная периодическая волна, частота которой пропорциональна частоте волны, которую вы играете (в этом примере синусоида). –

ответ

1

Я на самом деле в настоящее время работает над проектом для принятия белого шума и отбора проб для создания случайных чисел. Что вам нужно, наоборот!

Звук - давление и время. В основном начните с давления 0 и добавьте случайное количество давления от - (макс. Амплитуда) до (макс. Амплитуда). Амплитуда белого шума является случайной и нормально распределенной, поэтому вы можете использовать Random.nextGaussian() для генерации случайных значений z. Умножьте z-баллы на стандартное отклонение (вам, возможно, придется провести некоторое тестирование, чтобы найти стандартное отклонение по амплитуде, которое вам нравится), а затем пусть это будет амплитудой для каждого образца в аудиофайле.

Что касается создания самого звукового файла, если вы еще этого не сделали, вы должны изучить Java Sound API. В нем есть много хороших методов для создания звуковых файлов, а также для воспроизведения.

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

+2

Общим методом для генерации других цветных шумов является фильтрация белого шума. Например, розовый шум можно получить, применив фильтр нижних частот 3dB/октавы к белому шуму, коричневый шум - это 6 дБ/октавный нижний предел, синий - 3 дБ/октавный верхний предел, фиолетовый - 6 дБ/октавный максимум и, наконец, серый шум использует инвертированный А - весовой фильтр. – jaket

3

Вот программа для создания белого шума в чистой Java. Его можно легко изменить, чтобы генерировать другие цвета шума.

import javax.sound.sampled.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.nio.ByteBuffer; 
import java.util.Random; 

public class WhiteNoise extends JFrame { 

    private GeneratorThread generatorThread; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        WhiteNoise frame = new WhiteNoise(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public WhiteNoise() { 
     addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
       generatorThread.exit(); 
       System.exit(0); 
      } 
     }); 

     setTitle("White Noise Generator"); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 200, 50); 
     setLocationRelativeTo(null); 
     getContentPane().setLayout(new BorderLayout(0, 0)); 
     generatorThread = new GeneratorThread(); 
     generatorThread.start(); 
    } 

    class GeneratorThread extends Thread { 

     final static public int SAMPLE_SIZE = 2; 
     final static public int PACKET_SIZE = 5000; 

     SourceDataLine line; 
     public boolean exitExecution = false; 

     public void run() { 

      try { 
       AudioFormat format = new AudioFormat(44100, 16, 1, true, true); 
       DataLine.Info info = new DataLine.Info(SourceDataLine.class, format, PACKET_SIZE * 2); 

       if (!AudioSystem.isLineSupported(info)) { 
        throw new LineUnavailableException(); 
       } 

       line = (SourceDataLine)AudioSystem.getLine(info); 
       line.open(format); 
       line.start(); 
      } catch (LineUnavailableException e) { 
       e.printStackTrace(); 
       System.exit(-1); 
      } 

      ByteBuffer buffer = ByteBuffer.allocate(PACKET_SIZE); 

      Random random = new Random(); 
      while (exitExecution == false) { 
       buffer.clear(); 
       for (int i=0; i < PACKET_SIZE /SAMPLE_SIZE; i++) { 
        buffer.putShort((short) (random.nextGaussian() * Short.MAX_VALUE)); 
       } 
       line.write(buffer.array(), 0, buffer.position()); 
      } 

      line.drain(); 
      line.close(); 
     } 

     public void exit() { 
      exitExecution =true; 
     } 
    } 
} 
+0

Не могли бы вы предоставить некоторые комментарии, объясняющие, что делает ваш код, например, почему размер пакета 5000 и почему вы умножаете его на 2? Я верю в философию «научить человека ловить рыбу», и это похоже на «дать человеку рыбу». – jamie