Knacken nach runtersamplen von 48kHz PCM auf 8kHz



  • Hi an alle,

    ich zeichne Sprache vom Mikrofon mit DirectSound in einem RingBuffer auf.
    Und zwar mit 48kHz 16bit PCM.
    Dabei fange ich alle 20ms aufgezeichnetes ab.
    Dieses 20ms Sample nehme ich nun und sample es auf 8kHz runter.

    int CAudioOut::Reduce48to8kHz(short* pBuffer, int nBytesToReduce)
    {
        ASSERT((nBytesToReduce % 6) == 0);
        short* pSrc = pBuffer;
        short* pDst = pBuffer;
        for(int i = 0; i < (nBytesToReduce / 6); i++)
        {
            long val = 0;
            val = *pSrc++;
            val += (long)*pSrc++ * 4;
            val += (long)*pSrc++ * 14;
            val += (long)*pSrc++ * 14;
            val += (long)*pSrc++ *4;
            val += *pSrc++;
            *pDst++ = (short)(val/38);
        }
        return (pDst - pBuffer);
    }
    

    pBuffer sind die Rohdaten des Samples. nBytesToReduce in diesem Fall 960byte.

    Dann gehe ich hin und encodiere dies mit ulaw und zwar folgendermaßen.

    static short seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF,
    			    0x3FF, 0x7FF, 0xFFF, 0x1FFF};
    
    static int search(	int val,	short *table, int size)
    {
        int i;
        for (i = 0; i < size; i++) 
        {
    	if (val <= *table++)
                return (i);
        }
        return (size);
    }
    
    unsigned char CG711::encodeULaw(short pcm_val)
    {
    
        static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
                                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
                                 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
                                 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
                                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                                 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                                 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
        int sign, exponent, mantissa;
        unsigned char ulawbyte;
    
        /* Get the sample into sign-magnitude. */
        sign = (pcm_val >> 8) & 0x80;		/* set aside the sign */
        if (sign != 0) pcm_val = -pcm_val;		/* get magnitude */
        if (pcm_val > CLIP) pcm_val = CLIP;		/* clip the magnitude */
    
        /* Convert from 16 bit linear to ulaw. */
        pcm_val = pcm_val + BIAS;
        exponent = exp_lut[(pcm_val >> 7) & 0xFF];
        mantissa = (pcm_val >> (exponent + 3)) & 0x0F;
        ulawbyte = ~(sign | (exponent << 4) | mantissa);
        #ifdef ZEROTRAP
          if (ulawbyte == 0) ulawbyte = 0x02;	/* optional CCITT trap */
        #endif
    
        return(ulawbyte);
    }
    
    //Diese Methode rufe ich aus meiner Funktion folgendermaßen auf.
    for(int i = 0; i < size2; i++)
            newPacket.m_payload[i] = g711.encodeULaw(downsampledAudio[i]);
    //downsampledAudio ist mein vorher reduzierter Buffer
    

    Nach dem ich dies nun alles ausgeführt habe und das Packet versende kommt auf der anderen Seite(IP Phone) zwar etwas verständliches raus, das Ergebnis ist aber nur befriedigend, da immer noch regelmäßig ein störendes Knacken auftritt.

    Ich weiß nicht mehr warum dies so ist. Vllt. sieht ja jemand von euch wo mein Fehler liegt.

    Gruß

    CrazyPlaya


Anmelden zum Antworten