gpt4 book ai didi

java - 如何从已知点产生声音?

转载 作者:行者123 更新时间:2023-11-30 06:36:42 26 4
gpt4 key购买 nike

我有 10 个点列表(每个点都是时间振幅对),其中每个列表属于已知频率

所以我有一个类InputValue,其中有两个字段sampleDate(long)和sampleValue(double),以及10个列表 - 列表samples800Hz、samples400Hz等等。

800Hz 列表每秒包含大约 1600 个点(不是固定值,因为数据采样器可能有不可预测的延迟),400Hz 列表每秒包含大约 800 个点,依此类推。

我怎样才能:

  • 从点列表生成声音
  • 将多个或所有列表混合到一种声音中?

如果我做对了,我需要将每个列表重新采样为一个采样率(java soundformat 可以采用自定义采样率,例如 1600,或者我应该使用标准采样率,最低为 8000?),然后填充样本缓冲区,例如

AudioFormat af = new AudioFormat( (float )1600, 8, 1, true, false );
SourceDataLine sdl = AudioSystem.getSourceDataLine( af );
sdl.open();
sdl.start();
for( int i = 0; i < 1600; i++ ) {
buf[ 0 ] = ???
sdl.write( buf, 0, 1 );
}
sdl.drain();
sdl.stop();

但是我如何告诉 sdl 我的振幅值属于​​某个频率?我怎样才能混合不同的频率?

顺便说一句,我可以不重新采样每个列表,而是创建 10 种具有不同采样率的音频格式(800Hz 为 1600,400Hz 为 800 等等),然后将 10 个 sdls 混合在一起吗?

最佳答案

听起来您正在尝试使用波表来生成声音。如果您只是简单地重新创建 800 Hz 音调,这很简单:

static int sample = 0;
for (int i = 0; i < 1600; i++) {
buf[i] = samples800Hz[sample];
sample = (sample + 1) % SAMPLES_800HZ_SIZE;
}

假设您想要组合 800 Hz 和 1600 Hz 音调...只需将其添加在一起(您可能必须混合这些值,这样它们就不会削波):

static int sample1 = 0, sample2 = 0;
for (int i = 0; i < 1600; i++) {
// Multiply each sample by 0.5; this gives us a 50% mix between the two
buf[i] = (samples800Hz[sample1] * 0.5) + (samples1600Hz[sample2] * 0.5);
sample1 = (sample1 + 1) % SAMPLES_800HZ_SIZE;
sample2 = (sample2 + 1) % SAMPLES_1600HZ_SIZE;
}

现在我的答案不考虑您的系统运行回调的次数/帧数。你必须自己解决这个问题。另外,如果您想要生成多个音调而不是无休止地制作列表,我建议您查找波表振荡器。波表基本上是创建一个音调数组,然后调整您读取表的速度/相位以生成所需的频率。

祝你好运!

关于java - 如何从已知点产生声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45100012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com