2016-05-18 4 views
1

私は掃引でサイントーンを生成しようとしています。私はhereから得た以下のコードを使用しています。問題は、私は200Hz以上の音が聞こえますが、200Hz以下の音(20Hzや50Hzなど)は聞こえません。 正確な正弦波を生成してください。あなたが代わりに位置開始位置に、各サンプルの相対的な計算のため、現在の周波数に基づいて正弦波内の現在の位置を追跡し、それをインクリメントする場合掃引でサイントーンを生成する - Android

private final int sampleRate = 44100;    


public void generateTone(double startFreq, double endFreq, float duration) 
{ 
    double dnumSamples = duration * sampleRate; 
    dnumSamples = Math.ceil(dnumSamples); 
    numSamples = (int) dnumSamples; 
    double sample[] = new double[numSamples]; 

    double currentFreq = 0,numerator; 

    for (int i = 0; i < numSamples; ++i) { 
     numerator = (double) i/(double) numSamples; 
     currentFreq = startFreq + (numerator * (endFreq - startFreq))/2; 
     if ((i % 1000) == 0) { 
      Log.e("Current Freq:", String.format("Freq is: %f at loop %d of %d", currentFreq, i, numSamples)); 
     } 
     sample[i] = Math.sin(2 * Math.PI * i/(sampleRate/currentFreq)); 
    } 

    generatedSnd = new byte[2 * numSamples]; 
    int idx = 0; 
    for (final double dVal : sample) { 
     // scale to maximum amplitude 
     final short val = (short) ((dVal * 32767)); 
     // in 16 bit wav PCM, first byte is the low order byte 
     generatedSnd[idx++] = (byte) (val & 0x00ff); 
     generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8); 

    } 
} 

答えて

1

あなたのコードはより堅牢になります。

double currentPos = 0.0; 
for (int i = 0; i < numSamples; ++i) { 
    numerator = (double) i/(double) numSamples; 
    currentFreq = startFreq + (numerator * (endFreq - startFreq))/2; 
    if ((i % 1000) == 0) { 
     Log.e("Current Freq:", String.format("Freq is: %f at loop %d of %d", currentFreq, i, numSamples)); 
    } 
    currentPos += 2 * Math.PI * (currentFreq/sampleRate); 
    sample[i] = Math.sin(currentPos); 
} 

これにより、周波数が低下し、現在の位置が後方に移動する可能性があるという問題が回避されます。

あなたはトーンは、あなたがこのコードを追加することができ、サンプルの一定数の上にフェードインしたい場合は:今、私は音を聞くことができ

int fadeInSamples = 5000; 
double fadeIn = (i < fadeInSamples) ? (double)i/(double)fadeInSamples : 1.0; 

sample[i] = Math.sin(currentPos) * fadeIn; 
+0

..しかし、音の開始時に迷惑なビープ音があります。私はこの調子 –

+0

'audioTrack =新しいAudioTrack(AudioManager.STREAM_MUSIC、 は、sampleRate、AudioFormat.CHANNEL_CONFIGURATION_MONO、 AudioFormat.ENCODING_PCM_16BIT、(int型)numSamples * 2、 AudioTrack.MODE_STATIC)を再生するためにAudioTrackを使用しています。 audioTrack.write(generatedSnd、0、generatedSnd.length); //トラックをロードする audioTrack.play(); //トラックを再生する ' –

+1

何が原因なのか分かりませんが、トーンが始まると不連続になることがあります。うまくマスクするフェードインを行うためのコードをいくつか追加しました。 – samgak

関連する問題