Java 音频发生器播放错误的声音

Java 音频发生器播放错误的声音,java,android,Java,Android,我在产生特定频率的声音时遇到了一些问题。我已经设置了我的应用程序,这样你就可以在seekbar上来回滑动来选择一个特定的频率,然后应用程序应该使用该频率来生成音调 我现在听到的音调很好,但它的频率与你设定的完全不同。(我知道问题不在于将值从seekbar传递到“音调生成过程”,所以这一定是我生成音调的方式。) 这个代码怎么了? 谢谢 private final int duration=3;//秒 私人最终int采样器=8000; 私有最终整数样本=持续时间*采样器; 私人最终双样本[]=新双样

我在产生特定频率的声音时遇到了一些问题。我已经设置了我的应用程序,这样你就可以在seekbar上来回滑动来选择一个特定的频率,然后应用程序应该使用该频率来生成音调

我现在听到的音调很好,但它的频率与你设定的完全不同。(我知道问题不在于将值从seekbar传递到“音调生成过程”,所以这一定是我生成音调的方式。)

这个代码怎么了? 谢谢

private final int duration=3;//秒
私人最终int采样器=8000;
私有最终整数样本=持续时间*采样器;
私人最终双样本[]=新双样本[numSamples];
双dbFreq=0;//我把频率分配给这个双精度放大器
生成的私有最终字节SND[]=新字节[2*个样本];
...
void genTone(双dbFreq){
//填写数组
对于(int i=0;i>>8);
}
}
void playSound(){
最终音轨音轨=新音轨(AudioManager.STREAM_MUSIC,
采样器,AudioFormat.CHANNEL\u配置\u单声道,
AudioFormat.ENCODING_PCM_16位,数字样本,
音频跟踪模式(静态);
audioTrack.write(generatedSnd,0,generatedSnd.length);
音轨播放();
}

您的代码实际上是正确的,但是请看下面的代码


简而言之:必须将采样率设置为高于2*最大频率。因此,设置
sampleRate=44000
,您应该会听到更高的正确频率。

这里有一个完全胡乱的猜测:也许您需要使用“无符号字节”?在这种情况下,由于Java中缺少无符号字节,您可以使用这里描述的技术:谢谢,这很有效!如果你有时间,我还有一个问题。问题中发布的代码基本上是源代码,只是做了一些修改。你能告诉我怎么做才能让声音持续到点击按钮为止吗?我真的搞不懂,因为持续时间int乘以了很多其他值。
private final int duration = 3; // seconds
 private final int sampleRate = 8000;
 private final int numSamples = duration * sampleRate;
 private final double sample[] = new double[numSamples];
 double dbFreq = 0; // I assign the frequency to this double
 private final byte generatedSnd[] = new byte[2 * numSamples];

 ...


    void genTone(double dbFreq){

        // fill out the array
        for (int i = 0; i < numSamples; ++i) {
            sample[i] = Math.sin(2 * Math.PI * i / (sampleRate/dbFreq));
        }

        // convert to 16 bit pcm sound array
        // assumes the sample buffer is normalised.
        int idx = 0;
        for (final double dVal : sample) {
            // scale to maximum amplitude
            final short val = (short) ((dVal * 32767));
            // in 16 bit wav PCM, first byte is the low order byte
            generatedSnd[idx++] = (byte) (val & 0x00ff);
            generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
        }
    }

    void playSound(){
        final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT, numSamples,
                AudioTrack.MODE_STATIC);
        audioTrack.write(generatedSnd, 0, generatedSnd.length);
        audioTrack.play();
   }