3

最初に 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 で開始および終了していないことがわかります。

4

1 に答える 1

4

私の最初の推測は物理学であり、プログラミングではありません。

テスト デバイスに物理的にクリーンな 19 Khz 出力を生成できるスピーカーが搭載されている可能性はほとんどありません。その結果、44 Khz でサンプリングされた 19 Khz 信号で駆動しようとすると、意図しない他の周波数が生成されます。

于 2010-11-19T08:56:31.287 に答える