Как изменить объем потока данных PCM (неудачный эксперимент)

Решен

Мой код никогда раньше не использовался для обработки значений со знаком, и поэтому преобразование байтов -> короткое преобразование некорректно обрабатывало знаковый бит. Это правильно решило проблему.

Вопрос был в том ...

Я пытаюсь изменить громкость потока данных PCM. Я могу извлекать одноканальные данные из стерео файла, делать различные глупые экспериментальные эффекты с образцами, пропуская / дублируя их / вставляя нули и т. Д., Но я не могу найти способ каким-либо образом изменить фактические значения образцов и получить разумный выход.

Мои попытки действительно просты: http://i.imgur.com/FZ1BP.png

  1. исходные аудиоданные
  2. значения - 10000
  3. значений + 10000
  4. значений * 0,9
  5. values ​​* 1.1

(value = -value отлично работает - переворачивает волну и звучит так же)

Код для этого одинаково прост (ввод-вывод использует беззнаковые значения в диапазоне 0 -65535) это была проблема, чтение правильно подписанных значений решило проблему :

// 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

10
задан Community 23 May 2017 в 12:24
поделиться