Java中噪声颜色的生成
我想使用Java创建一个有色噪声生成器,它将能够生成本文中定义的所有颜色:Java中噪声颜色的生成,java,audio,noise,noise-generator,Java,Audio,Noise,Noise Generator,我想使用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中似乎有一些钓鱼课程: