我最初尝试使用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生成介于10和20000Hz之间的正弦波全部内容,希望文章能够帮你解决使用SoundPool生成介于10和20000Hz之间的正弦波所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)