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

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

概述我最初尝试使用AudioTrack生成正弦波.结果不令人满意.然后,我进入了Soundpool课程.我使用Audacity创建了1秒的音频文件,然后修改了播放速度(.5-2.0)以获取所需的频率.(数组,也有锯齿波和三角波文件)sig10000[0]=soundPool01.load(context,R.raw.sine10000,1);sig2500[0

我最初尝试使用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之间的正弦波所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1083186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存