- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 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/
我是一名优秀的程序员,十分优秀!