Я использую приведенную ниже функцию для генерации звука с частотой 18 кГц и длительностью около 1 секунды на двух разных телефонах: 1. Nokia 6.1 2. Pixel 3 XL
Я измеряю БПФ Спектр результатов с использованием iPad mini.
Nokia приводит к пику на 18 кГц, как и ожидалось. Однако Pixel 3XL показывает не только пик на 18 кГц (-40 дБ), но и второй пик на 6 кГц (-65 дБ).
Почему результат звучания между двумя телефонами такой разный, хотя я использую точно такой же Java код и та же версия операционной системы (Android 10)?
Как получается, что Pixel 3XL генерирует дополнительный звук примерно на одну треть частоты по сравнению с фактически запрограммированным звуком ?
В чем причина такого поведения и как я могу устранить дополнительный звук на частоте 6 кГц, так как этот дополнительный звук будет очень мешающим?
void playSoundManual(double freqOfTone, int numSamples){
double sampleRate = 44100.;
double sample[] = new double[numSamples];
byte generatedSnd[] = new byte[2 * numSamples];
double freq1 = freqOfTone;
double freq2 = freq1 * 1.3;
// fill out the array
boolean isSinus = true;
if (isSinus) {
for (int i = 0; i < numSamples; ++i) {
double indexAsFloat = 1. * i;
sample[i] = Math.sin(2. * Math.PI * indexAsFloat / (sampleRate/freqOfTone));
}
} else {
double instfreq=0, numerator;
for (int i=0;i<numSamples; i++ )
{
numerator=(double)(i)/(double)numSamples;
instfreq =freq1+(numerator*(freq2-freq1));
if ((i % 1000) == 0) {
Log.e("Current Freq:", String.format("Freq is: %f at loop %d of %d", instfreq, i, numSamples));
}
sample[i]=Math.sin(2*Math.PI*i/(sampleRate/instfreq));
}
}
// convert to 16 bit pcm sound array
// assumes the sample buffer is normalised.
int idx = 0;
for (double dVal : sample) {
short val = (short) (dVal * 32767);
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
44100, AudioFormat.CHANNEL_OUT_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT, numSamples,
AudioTrack.MODE_STREAM);
audioTrack.write(generatedSnd, 0, numSamples);
audioTrack.play();
}
´´´