tags:

views:

78

answers:

2

Hello people,

I am using C# and Microsoft.Xna.Framework.Audio;

I have managed to record some audio into a byte[] array and I am able to play it back.

The audio comes in as 8 bit unsigned data, and I would like to convert it into 16 bit mono signed audio so I can read the frequency what not.

I have read a few places that for sound sampling you perform a Bitwise Operator Or and shift the bits 8 places.

I have performed the code as follows;

soundArray[i] = (short)(buffer[i] | (buffer[i + 1] << 8));

What I end up with is a lot of negative data.

From my understanding it would mostly need to be in the positive and would represent a wave length of data.

Any suggestions or help greatly appreciated,

Cheers.

MonkeyGuy.

A: 

Have you tried converting the byte to short before shifting?

Marco
You can't shift bytes. If you use `<<` on a byte, it's automatically converted to an `int`/`Int32`.
dtb
Yes I do it right before the bitwise conversion on;soundArray[i] = (short)(buffer[i] | (buffer[i + 1] << 8));
monkeyguy
A: 

This combines two 8-bit unsigned integers into one 16-bit signed integer:

soundArray[i] = (short)(buffer[i] | (buffer[i + 1] << 8));

I think what you might want is to simply scale each 8-bit unsigned integer to a 16-bit signed integer:

soundArray[i] = (short)((buffer[i] - 128) << 8);

alt text

dtb
Still getting quite a few negative but a lot of positives now and they're quite high in the range up to the 32,000 mark.The Sample Bit Rate is apparently 16000hz.
monkeyguy
Thanks for the graph!
monkeyguy
I can confirm that the lowest number is -32768, thanks Dtb!
monkeyguy