Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Можно использовать NAudio и создать полученный WaveStream, что выходные синусоидальные волны или прямоугольные волны, которые Вы могли произвести на звуковую карту или записать в файл WAV . При использовании 32-разрядных образцов с плавающей точкой, Вы могли бы записать значения непосредственно из функции греха, не имея необходимость масштабироваться, поскольку она уже идет между-1 и 1.
Что касается точности, Вы имеете в виду точно правильную частоту или точно правильную форму волны? Нет такой вещи как истинная прямоугольная волна, и даже синусоидальная волна будет, вероятно, иметь несколько очень тихих артефактов на других частотах. Если это - точность частоты, которая имеет значение, Вы уверены в устойчивости и точности часов в Вашей звуковой карте. Однако я предположил бы, что точность будет достаточно хороша для большей части использования.
Вот некоторый пример кода, который делает 1 образец kHz в 8 частота дискретизации kHz и с образцами на 16 битов (то есть, не плавающая точка):
int sampleRate = 8000;
short[] buffer = new short[8000];
double amplitude = 0.25 * short.MaxValue;
double frequency = 1000;
for (int n = 0; n < buffer.Length; n++)
{
buffer[n] = (short)(amplitude * Math.Sin((2 * Math.PI * n * frequency) / sampleRate));
}