Java 产生噪声和削波的混响算法
我不熟悉java编程,也不熟悉DSP编程,但我试图将混响应用到.wav文件中。我使用的一些代码来自:但似乎我不完全理解它。当我运行我的代码时,我会得到一个噪声,它会随着时间的推移而增长,最终也会“剪裁”。我想这与我的缓冲区大小有关,或者我用“clip”播放回放的音频流,但我不确定。 如果有人能看一看并提出一些改进我的代码的想法,我将非常感激 我使用以下代码:Java 产生噪声和削波的混响算法,java,algorithm,Java,Algorithm,我不熟悉java编程,也不熟悉DSP编程,但我试图将混响应用到.wav文件中。我使用的一些代码来自:但似乎我不完全理解它。当我运行我的代码时,我会得到一个噪声,它会随着时间的推移而增长,最终也会“剪裁”。我想这与我的缓冲区大小有关,或者我用“clip”播放回放的音频流,但我不确定。 如果有人能看一看并提出一些改进我的代码的想法,我将非常感激 我使用以下代码: public void Reverbstart() throws InterruptedException, UnsupportedAud
public void Reverbstart() throws InterruptedException, UnsupportedAudioFileException, IOException, LineUnavailableException {
int bufferLength = 4000_000;
Clip clip;
Line line;
Line.Info linfo = new Line.Info(Clip.class);
line = AudioSystem.getLine(linfo);
clip = (Clip) line;
File sourceFile = new File("some audiofile");
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(sourceFile);
AudioFormat audioFormat = fileFormat.getFormat();
System.out.println(audioFormat);
AudioInputStream ais = AudioSystem.getAudioInputStream(sourceFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int nBufferSize = bufferLength * audioFormat.getFrameSize();
byte[] byteBuffer = new byte[nBufferSize];
int nBytesRead = ais.read(byteBuffer);
baos.write(byteBuffer, 0, nBytesRead);
byte[] AudioData = baos.toByteArray();
int delayMilliseconds = 3000;
int delaySamples = (int)((float)delayMilliseconds * 44.1f); //44100 Hz sample rate
float decay = 0.5f;
for (int i = 0; i < AudioData.length - delaySamples; i++){
AudioData[i] += (short)((float)AudioData[i]);
AudioData[i + delaySamples] += (short)((float)AudioData[i] * decay);
}
ByteArrayInputStream bais = new ByteArrayInputStream(AudioData);
AudioInputStream outputAis = new AudioInputStream(bais, audioFormat,AudioData.length/ audioFormat.getFrameSize());
clip.open(outputAis);
clip.start();
Thread.sleep(10000);
System.out.println(clip.getFramePosition());
}
public void reverstart()引发InterruptedException、UnsupportdAudioFileException、IOException、LineUnavailableException{
int bufferLength=4000_000;
夹子;
线条;
Line.Info linfo=新行.Info(Clip.class);
line=AudioSystem.getLine(linfo);
clip=(clip)行;
File sourceFile=新文件(“某些音频文件”);
AudioFileFormat fileFormat=AudioSystem.getAudioFileFormat(sourceFile);
AudioFormat AudioFormat=fileFormat.getFormat();
System.out.println(音频格式);
AudioInputStream ais=AudioSystem.getAudioInputStream(源文件);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
int nBufferSize=bufferLength*audioFormat.getFrameSize();
byte[]byteBuffer=新字节[nBufferSize];
int nBytesRead=ais.read(byteBuffer);
写入(byteBuffer,0,nBytesRead);
byte[]AudioData=baos.toByteArray();
整数延迟毫秒=3000;
int delaySamples=(int)((float)delay毫秒*44.1f);//44100 Hz采样率
浮子衰减=0.5f;
对于(int i=0;i
字节[]是原始数据,您将每个数组元素与衰减因子相乘,具体取决于格式实际样本分布在多个元素上,您需要衰减每个样本,而不是每个字节。好的,因此我使用PCM_签名44100.0 Hz,16位,立体声,4字节/帧,小端。但我仍然不确定这给了我什么。我想我必须在某个地方乘以字节(以获得样本)?这超出了我所知道的范围。我会尝试找出PCM_SIGNED的ByTestStream是如何定义的,也许你可以将数据分成两个通道,应用每个通道的衰减,然后再次合并以获得你的音频。我只是指出了对我来说似乎显而易见的东西,希望这足以让你自己解决剩下的问题,或者我们可以等待更有知识的人出现:)好的,谢谢你的意见:)。我试图自己去弄清楚,但我现在似乎走到了死胡同。将读取混响Balgos。解决方法是使用bytebuffer包装bytearray并用作短缓冲区,然后再次返回字节。这样地: