Mixing 16 bit linear PCM streams and avoiding clipping/overflow

前端 未结 6 639
逝去的感伤
逝去的感伤 2021-01-31 12:45

I\'ve trying to mix together 2 16bit linear PCM audio streams and I can\'t seem to overcome the noise issues. I think they are coming from overflow when mixing samples together.

6条回答
  •  名媛妹妹
    2021-01-31 13:24

    Here is what I did on my recent synthesizer project.

    int* unfiltered = (int *)malloc(lengthOfLongPcmInShorts*4);
    int i;
    for(i = 0; i < lengthOfShortPcmInShorts; i++){
        unfiltered[i] = shortPcm[i] + longPcm[i];
    }
    for(; i < lengthOfLongPcmInShorts; i++){
         unfiltered[i] = longPcm[i];
    }
    
    int max = 0;
    for(int i = 0; i < lengthOfLongPcmInShorts; i++){
       int val = unfiltered[i];
       if(abs(val) > max)
          max = val;
    }
    
    short int *newPcm = (short int *)malloc(lengthOfLongPcmInShorts*2);
    for(int i = 0; i < lengthOfLongPcmInShorts; i++){
       newPcm[i] = (unfilted[i]/max) * MAX_SHRT;
    }
    

    I added all the PCM data into an integer array, so that I get all the data unfiltered.

    After doing that I looked for the absolute max value in the integer array.

    Finally, I took the integer array and put it into a short int array by taking each element dividing by that max value and then multiplying by the max short int value.

    This way you get the minimum amount of 'headroom' needed to fit the data.

    You might be able to do some statistics on the integer array and integrate some clipping, but for what I needed the minimum amount of headroom was good enough for me.

提交回复
热议问题