2014-11-16 21 views
7

Tôi muốn tạo ra một máy phát tiếng ồn màu sử dụng Java mà sẽ có thể tạo ra tất cả các màu sắc được xác định trong bài viết này: http://en.wikipedia.org/wiki/Colors_of_noiseTạo màu sắc của tiếng ồn trong Java

  1. Bắt đầu với đơn giản nhất, White Noise , làm thế nào tôi sẽ tạo ra tiếng ồn để nó có thể chơi vô thời hạn?
  2. Từ đó, làm cách nào để tôi sửa đổi trình tạo của mình để tạo bất kỳ màu nào?

Tôi vừa nhầm lẫn về cách tự tạo tiếng ồn và nhầm lẫn về cách tạo ra một lần tôi có thể có đầu ra thông qua loa.

Bất kỳ liên kết hoặc mẹo nào sẽ được đánh giá cao!

Tôi cũng đã xem xét một câu hỏi khác: Java generating sound

Nhưng tôi không hoàn toàn hiểu những gì đang xảy ra trong các mã được đưa ra trong một trong các ý kiến. Nó cũng không cho tôi biết tiếng ồn sẽ được tạo ra với mã đó, và vì vậy tôi sẽ không biết làm thế nào để sửa đổi nó để nó sẽ tạo ra tiếng ồn trắng.

+0

Câu hỏi bạn đã liên kết thỏa thuận với việc tạo "bíp" và phát chúng. "Tiếng bíp" chỉ là sóng tuần hoàn ole đơn giản của bạn, trong đó tần số tỉ lệ với tần số sóng bạn chơi (trong ví dụ đó là sóng sin). –

Trả lời

1

Tôi hiện đang thực hiện dự án lấy tiếng ồn trắng và lấy mẫu để tạo ra các số ngẫu nhiên. Những gì bạn cần là ngược lại!

Âm thanh là áp lực so với thời gian. Về cơ bản bắt đầu với 0 áp lực và thêm một số lượng ngẫu nhiên của áp lực từ - (biên độ tối đa) đến (biên độ tối đa). Biên độ của nhiễu trắng là ngẫu nhiên và được phân phối bình thường, do đó bạn có thể sử dụng Random.nextGaussian() để tạo ra điểm số z ngẫu nhiên. Nhân điểm số z với độ lệch chuẩn (bạn có thể phải thực hiện một số thử nghiệm để tìm độ lệch chuẩn trong biên độ bạn thích) và sau đó cho phép đó là biên độ cho mỗi mẫu trong tệp âm thanh.

Theo cách tự tạo tệp âm thanh, nếu bạn chưa có, bạn nên xem xét Java Sound API. Nó có tính năng rất nhiều phương pháp tốt đẹp cho cả việc tạo ra các tập tin âm thanh cũng như phát lại.

Phần tiếp theo của câu hỏi của bạn, tiếng ồn không phải màu trắng, tôi sợ rằng tôi không chắc chắn về dạng sóng trông như thế nào. Nó có thể theo sau tương tự tạo ra z-điểm ngẫu nhiên và nhân chúng với một số độ lệch chuẩn biên độ (hoặc nhiều khả năng bởi một số hàm biên độ thay đổi theo thời gian).

+2

Phương pháp phổ biến để tạo ra các âm thanh màu khác là lọc nhiễu trắng. Ví dụ, nhiễu màu hồng có thể được tạo ra bằng cách áp dụng bộ lọc lowpass 3dB/octave với nhiễu trắng, nhiễu màu nâu là lowpass 6dB/octave, màu xanh đường cao tốc 3dB/octave, màu tím cao 6dB/octave và cuối cùng là tiếng ồn màu xám. bộ lọc trọng lượng. – jaket

3

Đây là chương trình tạo tiếng ồn trắng trong Java thuần túy. Nó có thể dễ dàng thay đổi để tạo ra các màu sắc khác của tiếng ồn.

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

Bạn có thể vui lòng cung cấp một số nhận xét giải thích mã của bạn không, ví dụ: tại sao kích thước gói 5000 và tại sao bạn nhân nó với 2? Tôi tin vào triết lý "dạy con cá" và điều này có nghĩa là "cho con người một con cá". – jamie

Các vấn đề liên quan