Генерация образцов аудиоданных: пытаетесь генерировать потрескивающий звук музыкальной пластинки? (C ++) - PullRequest
2 голосов
/ 28 ноября 2010

пытаюсь такой код:

static float shift = 0.0;
double amplitude = 1000000 * pow(10, 1 / 400.0);
for (int i = 0; i < nSampleSize / nBlockAlign; i ++)
{
    // Sound :)
    Buffer [i] = amplitude  * sin((shift + i)) / 100;
}
shift = shift + amplitude * nSampleSize / nBlockAlign ;

return (char *)Buffer;

Обычно это дает правильные результаты, но путь 2 громкий. Как сделать так, чтобы он был на 95% менее громким?

1 Ответ

1 голос
/ 29 ноября 2010

sin () вернет значение от -1 до 1, поэтому при умножении на число x результат будет варьироваться от -x до x.
Если x больше или меньше числовых границ типа массиваэто вызовет артефакты.

Похоже, что буфер - это массив символов, который на самом деле не является обычным для аудиобуфера.

Обычно это целые или двойные числа.Когда это массив целых чисел, амплитуда должна быть между INT_MIN и INT_MAX.Когда это массив двойных, амплитуда обычно будет варьироваться от -1 до 1.

В вашем случае я бы попытался использовать CHAR_MAX?(РЕДАКТИРОВАТЬ: и потерять "/ 100")

Но я предполагаю, что вызывающая функция не ожидает массива char, потому что есть максимум 256 дискретных возможных значений для амплитуды, что приведет к плохойКачество звука.Этот термин называется разрядностью.

Также взгляните на синусоиды

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...