使用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