Я пытаюсь сделать простой генератор сигналов для изохронных пульсирующих звуков.
По сути, «beatFrequency» контролирует изменение амплитуды основной частоты (высоты тона).
Это работает довольно хорошо, за исключением того, что для некоторых частот основного тона выше 4-5 кГц есть второй тон, генерируемый с более низкой частотой.
Это не для всех частот, но для довольно многих я определенно слышу второй тон.
Что это может быть? Какой-то резонанс? Я пробовал увеличивать частоту дискретизации, но это ничего не меняет, а использования 44100 должно хватить примерно до 20 кГц, если я правильно понимаю?
Я действительно не могу понять это самостоятельно, так что спасибо всем за помощь!
Вот пример кода с beatFreequency 1 Гц, частотой тона 5000 Гц и частотой дискретизации 44100.
public void playSound() {
double beatFreq = 1;
double pitch = 5000;
int mSampleRate = 44100;
AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, mSampleRate,
AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
256, AudioTrack.MODE_STREAM);
int loopLength = 2 * this.mSampleRate;
while (isPlaying) {
double[] mSound = new double[loopLength];
for (int i = 0; i < loopLength; i = i + 1) {
mSound[i] = beatFreq*Math.sin((1.0*Math.PI * i/(this.mSampleRate/pitch)));
mBuffer[i] = (short) (mSound[i] * Short.MAX_VALUE);
}
mAudioTrack.play();
mAudioTrack.write(mBuffer, 0, loopLength);
}
}
Вот (добавлено) изображение частот, когда я играю тон 4734 Гц. И, например, есть довольно большой пик около 1100 Гц, а также многие выше.
Код теперь просто использует высоту тона, я удалил частоту ударов: