3

我最初尝试使用 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 开始和结束。这会叠加不需要的信号吗?

4

1 回答 1

4

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

您的测试设备几乎不可能有一个扬声器,它在物理上能够产生干净的 19 Khz 输出,因为那几乎是毫无意义的。因此,如果您尝试使用以 44 Khz 采样的 19 Khz 信号来驱动它,它将产生其他意想不到的频率。

于 2010-11-19T08:56:31.287 回答