странный шум после уменьшения громкости на пкм - PullRequest
1 голос
/ 25 февраля 2012

Кто-нибудь знает, почему после того, как я применил этот алгоритм в c ++ для уменьшения громкости pcm, появляется белый шум на фоне?

for(int i = 0; i<pcm.length(); i+=2) {
   quint16 byte0 = pcm[i];
   quint16 byte1 = pcm[i+1];

   //merge byte0 and byte1
   qint16 n = (byte1 << 8) + byte0;

   n *= volume; // multiplier;

   //split n into byte0 and byte1
   byte1   = (n >> 8) & 255;
   byte0    = n & 255;

   //save the new values
   pcm[i] = byte0;
   pcm[i+1] = byte1;
}

Ответы [ 4 ]

3 голосов
/ 25 марта 2012

Через долгое время я прихожу с решением.Проблема была в том, что я слил два кусочка.

 for(int i = 0; i<pcm.length(); i+=2) {
   quint16 byte0 = pcm[i];
   quint16 byte1 = pcm[i+1];

   //merge byte0 and byte1
   qint16 n = 0;
   n |= speakersRaw[j][i+1] & 0xFF;
   n <<= 8;
   n |= speakersRaw[j][i] & 0xFF;

   n *= volume; // multiplier;

   //split n into byte0 and byte1
   byte1   = (n >> 8) & 255;
   byte0    = n & 255;

   //save the new values
   pcm[i] = byte0;
   pcm[i+1] = byte1;
}
0 голосов
/ 25 февраля 2012

Возможно, вы упаковываете и распаковываете свои байты в неправильном порядке?

qint16 n = (byte0 << 8) + byte1;

byte0   = (n >> 8) & 255;
byte1   = n & 255;  
0 голосов
/ 25 февраля 2012

Упомянутый Марком Рэнсом порядок байтов является очевидной возможной проблемой. Вы должны это проверить.

Другая возможная проблема - расширение знака.

Если у вас есть подписанные сэмплы и вы манипулируете ими беззнакового типа, вы потеряете бит знака на всех отрицательных сэмплах.

Если ваш тип байта подписан, то вы получите расширение знака в старшем байте при загрузке byte0 и byte1, опять же не того, что вы хотите.

Соответствует ли тип quint16 фактическому типу образцов? Если нет, вы должны использовать тот же тип. Вы должны заставить пользователя использовать unsigned char в качестве типа байта.

Обновление от информации в комментариях:

Чтобы проверить теорию расширения знака, измените:

n *= 0.5;

строка:

n = ((short) n) * 0.5;
0 голосов
/ 25 февраля 2012

Ваш n *= 0.5 фактически делает то же самое, что и n >>= 1. Вы переводите младший значащий бит из byte1 в самый значащий бит byte0, который, вероятно, является источником вашего шума.

Почему вы объединяете два значения в одно целое, а не делаете каждое отдельно?

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