Как изменить объем потока данных PCM (неудачный эксперимент) - PullRequest
10 голосов
/ 31 декабря 2011

Решено

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

Вопрос был ...

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

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

  1. исходные аудиоданные
  2. значения - 10000
  3. значения +10000
  4. значения * 0,9
  5. значения * 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

1 Ответ

9 голосов
/ 31 декабря 2011

Ваша 4-я попытка определенно является правильным подходом.Предполагая, что диапазон сэмплирования сосредоточен вокруг 0, умножение каждого сэмпла на другое значение - это то, как вы можете изменить громкость или усиление сигнала.

В этом случае, однако, я предполагаю, что за кулисами происходит нечто забавное, когдавы умножаете int на float и возвращаете обратно к int.Трудно сказать, не зная, какой язык вы используете, но это может быть причиной проблемы.

...