使用SoundPool生成10到20000Hz之间的正弦波

时间:2010-11-17 16:18:24

标签: android generator wave soundpool sine

我最初尝试使用AudioTrack生成正弦波。结果并不令人满意。然后我转到了Soundpool课程。我使用Audacity创建了1秒的音频文件,然后修改了播放速度(.5 - 2.0)以获得所需的频率。 (阵列,因为还有锯和三角形波形文件)

    sig10000[0]=soundPool01.load(context,R.raw.sine10000,1);
    sig2500[0]=soundPool01.load(context,R.raw.sine2500,1);
    sig625[0]=soundPool01.load(context,R.raw.sine625,1);
    sig157[0]=soundPool01.load(context,R.raw.sine156,1);
    sig40[0]=soundPool01.load(context,R.raw.sine40,1);

然后,根据所选频率,播放音频:

    public void play(){

    Signal s=null;
    float factor;
    for(int i=0;i<this.size();i++){
        s=this.get(i);
            if(s.getFreq()>4999){
                factor = s.getFreq()/10000f;
                s.setStreamID(soundPool01.play(sig10000[s.getWaveType()],.99f,.99f,0,-1,factor));                   
            }else if(s.getFreq()>1249){
                factor = s.getFreq()/2500f;
                s.setStreamID(soundPool01.play(sig2500[s.getWaveType()],.99f,.99f,0,-1,factor));
            }else if(s.getFreq()>312){
                factor = s.getFreq()/625f;
                s.setStreamID(soundPool01.play(sig625[s.getWaveType()],.99f,.99f,0,-1,factor));
            }else if(s.getFreq()>77){
                factor = s.getFreq()/156f;
                s.setStreamID(soundPool01.play(sig157[s.getWaveType()],.99f,.99f,0,-1,factor));
            }else {
                factor = s.getFreq()/40f;
                s.setStreamID(soundPool01.play(sig40[s.getWaveType()],.99f,.99f,0,-1,factor));
            }

    }
}

现在我看到了,除了5000-20000 Hz的范围外,该方法工作正常。我对此不以为然,不知道为什么它不起作用,我找不到问题的任何模式。

这种方法有一些基本问题吗?

提前感谢你

编辑:“不工作解释” 当我在5000-20000赫兹的范围内播放正弦波时,很明显频率是不准确的。这意味着音调很远。例如。 19000赫兹太低,耳朵很容易检测到。我可以说10000赫兹(5000Hz-我的错误也是如此),所以正常播放率是正确的。 在14kHz左右,信号音调不再正确。

思考/可能原因(?): (A)播放速度(SoundPool)有多少步?文档说0.5-2.0是否有可能这意味着有15种不同的播放速度? (B)我使用Audacity生成.ogg文件。当我放大10000Hz正弦时,我可以看到它不太平滑(采样率44100)并且波不能精确地开始和结束为0.这可能会叠加不需要的信号吗?

1 个答案:

答案 0 :(得分:4)

我的第一个猜测是物理,而不是编程。

你的测试设备几乎没有机会拥有能够产生干净的19 Khz输出的扬声器,因为这几乎毫无意义。因此,如果您尝试以44 Khz采样的19 Khz信号驱动它,它将产生其他非预期的频率。