10

Java を使用して、この記事で定義されているすべての色を生成できるカラード ノイズ ジェネレーターを作成したいと思います: http://en.wikipedia.org/wiki/Colors_of_noise

  1. 最も単純なものであるホワイト ノイズから始めて、無期限に再生できるようにノイズを生成するにはどうすればよいでしょうか?
  2. そこから、ジェネレーターをどのように変更して任意の色を生成しますか?

ノイズ自体を生成する方法と、生成されたノイズをスピーカーから出力する方法について混乱しています。

リンクやヒントをいただければ幸いです。

私は別の質問も見ました: Java 生成音

しかし、コメントの 1 つで指定されたコードで何が起こっているのか完全には理解できません。また、そのコードでどのようなノイズが生成されるかがわからないため、ホワイト ノイズを生成するように変更する方法もわかりません。

4

3 に答える 3

4

Pure 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;
        }
    }
}
于 2014-11-17T00:44:04.643 に答える
1

私は実際に現在、ホワイトノイズを取得してサンプリングして乱数を生成するプロジェクトに取り組んでいます。必要なのは逆です!

音は圧力対時間です。基本的には圧力 0 から始めて、-(最大振幅) から (最大振幅) までのランダムな量の圧力を追加します。ホワイト ノイズの振幅はランダムで正規分布しているため、Random.nextGaussian()を使用してランダムな z スコアを生成できます。Z スコアに標準偏差を掛けて (必要な振幅の標準偏差を見つけるためにテストを行う必要がある場合があります)、それをオーディオ ファイル内の各サンプルの振幅とします。

サウンド ファイル自体の生成に関しては、まだ行っていない場合は、Java Sound APIを調べる必要があります。サウンドファイルの作成と再生の両方に便利な方法がたくさんあります。

質問の次の部分である非ホワイト ノイズですが、残念ながら波形がどのように見えるかわかりません。おそらく、同様のランダムな z スコアを生成し、それらに振幅標準偏差を掛けます (または、時間とともに変化する振幅関数を掛ける可能性が高くなります)。

于 2014-11-16T23:41:03.703 に答える