我最初尝试使用AudioTrack生成一个正弦波。结果并不令人满意。然后我转到了桑德普尔班。我使用奥迪创建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赫兹。我正为这件事绞尽脑汁,不知道为什么它不起作用,我也找不到任何解决问题的模式。
这种方法有什么根本问题吗?
提前感谢你
编辑:“不工作解释”当我在5000-20000赫兹范围内播放正弦波时,很明显频率是不准确的。这意味着球场离我们很远。例如,19000赫兹太低,很容易被耳朵探测到。我可以说的是,10000赫兹(5000赫兹-我的错误),所以正常的播放率,是正确的。在14 the左右,信号的螺距不再正确。
的想法/可能的原因(?): (A)对于回放速度(SoundPool)有多少步?文档中说0.52.0是否可能意味着有15种不同的回放速度?(B)我使用Audacity生成.ogg文件。当我放大10000赫兹正弦波时,我可以看到它不是太平滑(采样率为44100),并且波不精确地在0开始和结束。这种叠加的信号可能是多余的吗?
发布于 2010-11-19 08:56:31
我的第一个猜想是物理,而不是编程。
你的测试设备几乎不可能有一个能够产生干净的19千赫输出的扬声器,因为这几乎是没有意义的。因此,它将产生其他的,意外的频率,如果你试图用一个19千赫的信号采样在44千赫。
https://stackoverflow.com/questions/4206535
复制相似问题