Решено
Мой код никогда прежде не использовался для обработки значений со знаком, и, таким образом, байты -> короткое преобразование неправильно обрабатывало бит знака.Выполнение этого правильно решило проблему.
Вопрос был ...
Я пытаюсь изменить объем потока данных PCM.Я могу извлекать одноканальные данные из стереофайла, делать различные глупые экспериментальные эффекты с семплами, пропуская / дублируя их / вставляя нули / и т. Д., Но я не могу найти способ каким-либо образом изменить действительные значения семплов и получитьразумный вывод.
Мои попытки действительно просты: http://i.imgur.com/FZ1BP.png
- исходные аудиоданные
- значения - 10000
- значения +10000
- значения * 0,9
- значения * 1,1
(значение = -значение работает отлично - переворачивает волну и звучит одинаково)
Код для этого одинаково прост: (при вводе-выводе используются значения без знака в диапазоне 0-65535) <- <strong>, с которой возникла проблема; чтение значений со знаком решило проблему :
// NOTE: INVALID CODE
int sample = ...read unsigned 16 bit value from a stream...
sample -= 32768;
sample = (int)(sample * 0.9f);
sample += 32768;
...write unsigned 16 bit value to a stream...
// NOTE: VALID CODE
int sample = ...read *signed* 16 bit value from a stream...
sample = (int)(sample * 0.9f);
...write 16 bit value to a stream...
Я пытаюсь сделать образец тише.Я полагаю, что уменьшение амплитуды (выборка * 0,9) приведет к более тихому файлу, но оба значения 4. и 5. выше недопустимы.Есть аналогичный вопрос по SO , где MusiGenesis говорит, что он получил правильные результаты с типом кода «sample * = 0,75» (да, я экспериментировал с другими значениями, кроме 0,9 и 1,1).
Вопрос в том, делаю ли я что-то глупое, или вся идея умножения на постоянную неверна?Я бы хотел, чтобы конечный результат был примерно таким: http://i.imgur.com/qUL10.png