Java中噪声颜色的生成

Java中噪声颜色的生成,java,audio,noise,noise-generator,Java,Audio,Noise,Noise Generator,我想使用Java创建一个有色噪声生成器,它将能够生成本文中定义的所有颜色: 从最简单的白噪声开始,我如何产生噪声,使它可以无限期地播放 从那里,我将如何修改我的生成器以生成任何颜色 我既困惑于如何产生噪音本身,也困惑于一旦产生噪音,如何通过扬声器将其输出 任何链接或提示将非常感谢 我还研究了另一个问题: 但我不完全理解其中一条评论中给出的代码中发生了什么。它也没有告诉我该代码会产生什么噪声,因此我不知道如何修改它,使其产生白噪声。我目前正在进行一个项目,以获取白噪声并对其进行采样以产生随机数。你

我想使用Java创建一个有色噪声生成器,它将能够生成本文中定义的所有颜色:

  • 从最简单的白噪声开始,我如何产生噪声,使它可以无限期地播放
  • 从那里,我将如何修改我的生成器以生成任何颜色
  • 我既困惑于如何产生噪音本身,也困惑于一旦产生噪音,如何通过扬声器将其输出

    任何链接或提示将非常感谢

    我还研究了另一个问题:


    但我不完全理解其中一条评论中给出的代码中发生了什么。它也没有告诉我该代码会产生什么噪声,因此我不知道如何修改它,使其产生白噪声。

    我目前正在进行一个项目,以获取白噪声并对其进行采样以产生随机数。你需要的是相反的

    声音是压力与时间的关系。基本上从0压力开始,添加一个从-(最大振幅)到(最大振幅)的随机压力量。白噪声的振幅是随机且正态分布的,因此可以使用来生成随机z分数。将z分数乘以标准偏差(您可能需要进行一些测试以找到您喜欢的振幅的标准偏差),然后将其作为音频文件中每个样本的振幅

    至于生成声音文件本身,如果您还没有,您应该研究一下。它提供了许多创建声音文件和播放声音的好方法


    你问题的下一部分,非白噪声,恐怕我不确定波形是什么样子。它可能遵循类似的规则生成随机z分数并将其乘以某个振幅标准偏差(或者更可能乘以随时间变化的某个振幅函数)。

    下面是一个在纯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;
            }
        }
    }
    
    import javax.sound.sampled.*;
    导入javax.swing.*;
    导入java.awt.*;
    导入java.awt.event.WindowAdapter;
    导入java.awt.event.WindowEvent;
    导入java.nio.ByteBuffer;
    导入java.util.Random;
    公共类白噪声扩展JFrame{
    专用生成器读取生成器读取;
    公共静态void main(字符串[]args){
    invokeLater(新的Runnable(){
    公开募捐{
    试一试{
    WhiteNoise帧=新的WhiteNoise();
    frame.setVisible(true);
    }捕获(例外e){
    e、 printStackTrace();
    }
    }
    });
    }
    公共白噪音(){
    addWindowListener(新的WindowAdapter(){
    @凌驾
    公共无效窗口关闭(WindowEvent e){
    generatorThread.exit();
    系统出口(0);
    }
    });
    setTitle(“白噪声发生器”);
    可设置大小(假);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    立根(100,100,200,50);
    setLocationRelativeTo(空);
    getContentPane().setLayout(新的BorderLayout(0,0));
    generatorThread=新generatorThread();
    generatorThread.start();
    }
    类GeneratorThread扩展线程{
    最终静态公共int样本大小=2;
    最终静态公共int数据包大小=5000;
    源数据线;
    公共布尔exitExecution=false;
    公开募捐{
    试一试{
    AudioFormat格式=新的AudioFormat(44100,16,1,true,true);
    DataLine.Info=newdataline.Info(SourceDataLine.class、格式、数据包大小*2);
    如果(!AudioSystem.isLineSupported(信息)){
    抛出新的LineUnavailableException();
    }
    line=(SourceDataLine)AudioSystem.getLine(info);
    行。打开(格式);
    line.start();
    }捕获(LineUnavailableException e){
    e、 printStackTrace();
    系统退出(-1);
    }
    ByteBuffer缓冲区=ByteBuffer.allocate(数据包大小);
    随机=新随机();
    while(exitExecution==false){
    buffer.clear();
    对于(int i=0;i<数据包大小/样本大小;i++){
    buffer.putShort((short)(random.nextGaussian()*short.MAX_VALUE));
    }
    line.write(buffer.array(),0,buffer.position());
    }
    line.drain();
    line.close();
    }
    公共无效出口(){
    exitExecution=true;
    }
    }
    }
    
    您链接的问题涉及生成“嘟嘟声”并播放它们。“嘟嘟声”只是你的普通周期波,其频率与你播放的波的频率成正比(在该示例中为正弦波)。产生其他有色噪声的常用方法是过滤白噪声。例如,将3dB/倍频程低通滤波器应用于白噪声可以产生粉色噪声,棕色噪声是6dB/倍频程低通,蓝色是3dB/倍频程高通,紫色是6dB/倍频程高通,最后灰色噪声使用反向a加权滤波器。请提供一些注释,解释您的代码的作用,例如,为什么数据包大小是5000,为什么要乘以2?我相信“教一个人钓鱼”的哲学,这感觉就像“给一个人一条鱼”。这是另一条鱼,但在links和Javadoc中似乎有一些钓鱼课程: