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);
}
}
..しかし、音の開始時に迷惑なビープ音があります。私はこの調子 –
'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(); //トラックを再生する ' –
何が原因なのか分かりませんが、トーンが始まると不連続になることがあります。うまくマスクするフェードインを行うためのコードをいくつか追加しました。 – samgak