最初に AudioTrack を使用して正弦波を生成しようとしました。結果は満足のいくものではありませんでした。その後、サウンドプールのクラスに移りました。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 (5000 Hz も同様です - 私の間違い) であり、通常の再生レートは正しいということです。14kHz あたりで、信号のピッチが正しくなくなります。
考え/考えられる原因(?): (A)再生速度 (SoundPool) には何段階ありますか? ドキュメントには 0.5-2.0 とありますが、これは 15 の異なる再生速度があることを意味しますか? (B) Audacity を使用して .ogg ファイルを生成しました。10000Hz の正弦波を拡大すると、滑らかすぎず (サンプル レート 44100)、波形が正確に 0 で開始および終了していないことがわかります。