其他分享
首页 > 其他分享> > 使用SoundPool生成介于10和20000Hz之间的正弦波

使用SoundPool生成介于10和20000Hz之间的正弦波

作者:互联网

我最初尝试使用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 Hz范围内的正弦波时,很明显频率不准确.这意味着音高逐渐变小.例如. 19000 Hz太低,很容易被耳朵察觉.我能说的是10000 Hz(正确的是5000Hz,这是我的错误),因此正常播放速率是正确的.在14kHz左右时,信号音调不再正确.

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

解决方法:

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

您的测试设备几乎没有扬声器能够实际产生干净的19 Khz输出的机会,因为这几乎是毫无意义的.结果,如果您尝试使用以44 Khz采样的19 Khz信号来驱动它,它将产生其他意外频率.

标签:soundpool,generator,trigonometry,wave,android
来源: https://codeday.me/bug/20191105/1996773.html