2014-11-16 13 views
7

vorrei creare un generatore di rumore di colore utilizzando Java che sarà in grado di generare tutti i colori definiti in questo articolo: http://en.wikipedia.org/wiki/Colors_of_noiseGenerazione di colori del rumore in Java

  1. partire con la più semplice, White Noise , come potrei generare il rumore in modo che possa giocare indefinitamente?
  2. Da lì, come modifico il mio generatore per generare uno qualsiasi dei colori?

Sono entrambi confuso su come generare il rumore stesso, e confuso su come una volta generato posso farlo essere emesso attraverso gli altoparlanti.

Qualsiasi link o suggerimento sarebbe molto apprezzato!

Ho anche guardato un'altra domanda: Java generating sound

Ma io non comprendere appieno quello che sta succedendo nel codice data in uno dei commenti. Inoltre non mi dice quale rumore sarebbe generato con quel codice, e quindi non saprei come modificarlo in modo da generare rumore bianco.

+0

La domanda che hai collegato si occupa di generare "bip" e riprodurli. I "bip" sono solo la tua semplice onda periodica in cui la frequenza è proporzionale alla frequenza dell'onda che suoni (in questo esempio, un'onda sinusoidale). –

risposta

1

Attualmente sto lavorando a un progetto per l'acquisizione del rumore bianco e il campionamento per produrre numeri casuali. Ciò di cui hai bisogno è il contrario!

Il suono è pressione rispetto al tempo. Fondamentalmente inizia con 0 pressione e aggiungi una quantità casuale di pressione da - (ampiezza massima) a (ampiezza massima). L'ampiezza del rumore bianco è casuale e normalmente distribuita in modo da poter utilizzare Random.nextGaussian() per generare z-score casuali. Moltiplicare i punteggi z per la deviazione standard (potrebbe essere necessario eseguire alcuni test per trovare una deviazione standard nell'ampiezza desiderata) e lasciare che sia l'ampiezza per ciascun campione nel file audio.

Per quanto riguarda la generazione del file audio stesso, se non lo si è già, è necessario esaminare Java Sound API. Dispone di molti bei metodi sia per la creazione di file audio che per la riproduzione.

La parte successiva della domanda, il rumore non bianco, temo di non essere sicuro di come siano le forme d'onda. Probabilmente segue il simile generare z-score casuali e moltiplicarli per una deviazione standard di ampiezza (o più probabilmente per una funzione di ampiezza che cambia col tempo).

+2

Il metodo comune per generare altri rumori colorati è filtrare il rumore bianco. Ad esempio, il rumore rosa può essere prodotto applicando un filtro passa basso 3dB/ottava al rumore bianco, il rumore marrone è un passa basso 6dB/ottava, blu un passa alto 3dB/ottava, viola un passa alto 6dB/ottava e infine il rumore grigio utilizza un A invertito filtro di peso – jaket

3

Ecco un programma per generare rumore bianco in Java puro. Può essere facilmente modificato per generare altri colori di rumore.

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

Potresti fornire alcuni commenti per spiegare cosa fa il tuo codice, ad esempio, perché la dimensione del pacchetto è 5000 e perché la si moltiplica per 2? Credo nella filosofia "insegnare a un uomo a pescare" e questo sembra "dare a un uomo un pesce". – jamie

Problemi correlati