【问题标题】:To much noise when I do sine wave generating on Android with Java当我使用 Java 在 Android 上生成正弦波时噪音很大
【发布时间】:2016-04-14 13:43:35
【问题描述】:

我在Android上研究了很长时间的正弦波生成,并在网上得到了一些示例代码。但是,当我自己编码时,我仍然感到困惑。 我使用如下代码

double[] buf = new double[(int) sampleRate];
byte[] buffer = new byte[(int) sampleRate];
double sampleInterval = sampleRate/frequency;
for(int i=0; i<sampleRate;i++){
    buf[i] = (Math.sin((2.0*Math.PI*i)/sampleInterval));
    buffer[i] = (byte)(buf[i]*Byte.MAX_VALUE);
}
while(flag) {
    audioTrack.write(buffer, 0, buffer.length);
}
  1. 播放“Math.sin((2.0*Math.PI*i)/sampleInterval)”公式生成的正弦波缓冲区时噪音太大。我不知道这是 Java 和 Android 的问题还是我的编码问题。在模拟器和我真正的索尼手机上都显示了噪音。但是在我同学的笔记本电脑上使用 Matlab 的相同公式可以很好地工作。 我还尝试在桌面 java 代码中使用 DataSourceLine。噪音也存在。

2.产生的声音往往不稳定,有时是连续的,但有时是断断续续的,声音有明显的规律起伏。

如何改进我的代码以使其稳定和准确?

【问题讨论】:

标签: java android audio pcm audiotrack


【解决方案1】:

为什么要有两个缓冲区?

你可以用一个来做

double phase = 0.0;
amp = 10000;
short[] buffer = new short[BUFSIZE]; // BUFSIZE should be result from audiotrack.getMinBufferSize
double phaseIncrement = (2 * Math.PI * frequency) / sampleRate;
for (int i = 0; i < BUFSIZE; i++) {
    buffer[i] = (short) (amp * Math.sin(phase));
    phase += phaseIncrement;
}

audioTrack.write(buffer, 0, buffer.length);

【讨论】:

  • 我尝试更新我的代码。它有效并且噪音降低了。但有时它们仍然存在。例如,当我将频率设置为 21000 时,它可能会发出非常刺耳的声音。会不会是Java的不稳定?
  • 为什么需要这么高的频率?
  • 这来自我在大学的研究项目。我需要发出人们听不到的声音。
  • 好的,如果设备完全能够发出这种高频率的声音,那我不知道。你可以用这个确切的问题问另一个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 2012-01-08
  • 1970-01-01
相关资源
最近更新 更多