When I just copy the microphone input buffer to the output buffer the sound plays OK. But if I encode and decode the buffer through Speex I get a high pitched constant tone in the background. I actually do hear my voice speaking when I talk, but it's faint and much quieter than the tone. Here's what my data looks like: Input is the first 5 floats of each input buffer. Output is after Speex runs on it. Input: 0.000 0.000 0.000 0.000 -0.000 Out: -0.029 -0.008 0.020 0.018 -0.001 Input: 0.000 0.000 0.000 0.000 0.000 Out: -0.029 -0.008 0.020 0.018 -0.001 Input: -0.000 0.000 0.000 0.000 -0.000 Out: -0.029 -0.008 0.020 0.018 -0.001 Input: -0.000 -0.000 -0.000 -0.000 0.000 Out: -0.029 -0.008 0.020 0.018 -0.001 My samples are 4 byte floats. My sample rate is 8000 Here's pretty much all my speex code: ENCODING INIT: channel->enc_state=speex_encoder_init(&speex_nb_mode); speex_encoder_ctl(channel->enc_state, SPEEX_GET_FRAME_SIZE, &channel->speexOutgoingFrameSampleCount); DECODING INIT: channel->dec_state=speex_decoder_init(&speex_nb_mode); speex_decoder_ctl(channel->dec_state, SPEEX_GET_FRAME_SIZE, &channel->speexIncomingFrameSampleCount); ENCODING: speex_encode(channel->enc_state, (float *) inputBuffer, &speexBits); bytesWritten = speex_bits_write(&speexBits, tempOutput+1, 2048-1); DECODING: speex_bits_read_from(&speexBits, (char*)(packet->data+1), packet->length-1); speex_decode(channel->dec_state, &speexBits, (float*)tempOutput); That's pretty much the extent of the Speex code. For the output, I write all 0.0 to the buffer first, then add the equivalent inputs from speex. When I copy bytes of input data, I use that speexOutgoingFrameSampleCount * sizeof(float) to determine how many bytes to consider read and written. Any idea?
On May 21, 2006, at 6:33 PM, Kevin Jenkins wrote:> When I just copy the microphone input buffer to the output buffer > the sound plays OK. But if I encode and decode the buffer through > Speex I get a high pitched constant tone in the background. I > actually do hear my voice speaking when I talk, but it's faint and > much quieter than the tone. > > Here's what my data looks like: > Input is the first 5 floats of each input buffer. > Output is after Speex runs on it. > > Input: 0.000 0.000 0.000 0.000 -0.000 > Out: -0.029 -0.008 0.020 0.018 -0.001 > Input: 0.000 0.000 0.000 0.000 0.000 > Out: -0.029 -0.008 0.020 0.018 -0.001 > Input: -0.000 0.000 0.000 0.000 -0.000 > Out: -0.029 -0.008 0.020 0.018 -0.001 > Input: -0.000 -0.000 -0.000 -0.000 0.000 > Out: -0.029 -0.008 0.020 0.018 -0.001 > > My samples are 4 byte floats. > > My sample rate is 8000 > > Here's pretty much all my speex code: > ENCODING INIT: > channel->enc_state=speex_encoder_init(&speex_nb_mode); > speex_encoder_ctl(channel->enc_state, SPEEX_GET_FRAME_SIZE, > &channel->speexOutgoingFrameSampleCount); > > DECODING INIT: > channel->dec_state=speex_decoder_init(&speex_nb_mode); > speex_decoder_ctl(channel->dec_state, SPEEX_GET_FRAME_SIZE, > &channel->speexIncomingFrameSampleCount); > > ENCODING: > speex_encode(channel->enc_state, (float *) inputBuffer, &speexBits); > bytesWritten = speex_bits_write(&speexBits, tempOutput+1, 2048-1); > > DECODING: > speex_bits_read_from(&speexBits, (char*)(packet->data+1), packet- > >length-1); > speex_decode(channel->dec_state, &speexBits, (float*)tempOutput); > > That's pretty much the extent of the Speex code. For the output, I > write all 0.0 to the buffer first, then add the equivalent inputs > from speex. > > When I copy bytes of input data, I use that > speexOutgoingFrameSampleCount * sizeof(float) to determine how many > bytes to consider read and written.> > Any idea?It seems like your samples may all be in the range -1.0 .. 1.0. For speex, they should be +-32767 or so. -SteveK
Changing from using floats to shorts did fix the high pitched tone problem. I'm having other problems but I'll look into it more first. SteveK wrote:> > On May 21, 2006, at 6:33 PM, Kevin Jenkins wrote: > >> When I just copy the microphone input buffer to the output buffer the >> sound plays OK. But if I encode and decode the buffer through Speex I >> get a high pitched constant tone in the background. I actually do >> hear my voice speaking when I talk, but it's faint and much quieter >> than the tone. >> >> Here's what my data looks like: >> Input is the first 5 floats of each input buffer. >> Output is after Speex runs on it. >> >> Input: 0.000 0.000 0.000 0.000 -0.000 >> Out: -0.029 -0.008 0.020 0.018 -0.001 >> Input: 0.000 0.000 0.000 0.000 0.000 >> Out: -0.029 -0.008 0.020 0.018 -0.001 >> Input: -0.000 0.000 0.000 0.000 -0.000 >> Out: -0.029 -0.008 0.020 0.018 -0.001 >> Input: -0.000 -0.000 -0.000 -0.000 0.000 >> Out: -0.029 -0.008 0.020 0.018 -0.001 >> >> My samples are 4 byte floats. >> >> My sample rate is 8000 >> >> Here's pretty much all my speex code: >> ENCODING INIT: >> channel->enc_state=speex_encoder_init(&speex_nb_mode); >> speex_encoder_ctl(channel->enc_state, SPEEX_GET_FRAME_SIZE, >> &channel->speexOutgoingFrameSampleCount); >> >> DECODING INIT: >> channel->dec_state=speex_decoder_init(&speex_nb_mode); >> speex_decoder_ctl(channel->dec_state, SPEEX_GET_FRAME_SIZE, >> &channel->speexIncomingFrameSampleCount); >> >> ENCODING: >> speex_encode(channel->enc_state, (float *) inputBuffer, &speexBits); >> bytesWritten = speex_bits_write(&speexBits, tempOutput+1, 2048-1); >> >> DECODING: >> speex_bits_read_from(&speexBits, (char*)(packet->data+1), >> packet->length-1); >> speex_decode(channel->dec_state, &speexBits, (float*)tempOutput); >> >> That's pretty much the extent of the Speex code. For the output, I >> write all 0.0 to the buffer first, then add the equivalent inputs from >> speex. >> >> When I copy bytes of input data, I use that >> speexOutgoingFrameSampleCount * sizeof(float) to determine how many >> bytes to consider read and written. > >> >> Any idea? > > It seems like your samples may all be in the range -1.0 .. 1.0. For > speex, they should be +-32767 or so. > > -SteveK