gpt4 book ai didi

android - 使用 SoundPool 生成 10 到 20000Hz 之间的正弦波

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:07 25 4
gpt4 key购买 nike

我最初尝试使用 AudioTrack 生成正弦波。结果并不尽如人意。然后我转到了 Soundpool 类(class)。我使用 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 信号驱动它,它将产生其他意外频率。

关于android - 使用 SoundPool 生成 10 到 20000Hz 之间的正弦波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4206535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com