Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How to interpret WAV data?

0 views
Skip to first unread message

Peter Reichard

unread,
May 18, 2005, 8:07:15 AM5/18/05
to
Hi,

I am writting a program to draw a sample curve. I have read some online
documents about the WAV formate, however, my curve doesn't look like in
other sample editors.

If I have a 8bit mono sample, one article described that the data is saved
like:

channel 0 | channel 0 | channel 0
[BYTE] [BYTE] [BYTE]

The range for each value is therefore 0-255 (128 means zero). However, an
other article says that each channel ist stored as an integer. For me, that
means 2 bytes, like:

channel 0 | channel 0 | channel 0
[BYTE][BYTE] [BYTE][BYTE] [BYTE][BYTE]

Because it has the same range (0-255), it would be a waste of memory and
only applicable for 16bit mono samples. What is the correct storage scheme?

Thanks


Iain

unread,
May 18, 2005, 10:27:08 AM5/18/05
to

You can find the format for wavs in the MSDN documentation.

Basically there is a preamble then a format descriptor (which tells you how
many bits per sample among other things).

then there is a sized chunk of data.

If you know that your data is 8 bit mono, it will be stored as a sequence
of signed bytes.

If it were 16 bit stereo it would be stored as pairs of signed shorts.

Iain
--
Iain Downs (DirectShow MVP)
Software Product Consultant
www.idcl.co.uk

Alessandro Angeli [MVP::DigitalMedia]

unread,
May 18, 2005, 12:42:59 PM5/18/05
to
Iain wrote:

> If you know that your data is 8 bit mono, it will be
> stored as a sequence of signed bytes.

UNSIGNED bytes, not signed :-)

> If it were 16 bit stereo it would be stored as pairs of
> signed shorts.

--

// Alessandro Angeli
// MVP :: Digital Media
// a dot angeli at psynet dot net


Iain

unread,
May 18, 2005, 2:14:14 PM5/18/05
to
On Wed, 18 May 2005 18:42:59 +0200, Alessandro Angeli [MVP::DigitalMedia]
wrote:

> Iain wrote:
>
>> If you know that your data is 8 bit mono, it will be
>> stored as a sequence of signed bytes.
>
> UNSIGNED bytes, not signed :-)
>
>> If it were 16 bit stereo it would be stored as pairs of
>> signed shorts.

Surely the values go +/- zero? So FF == -1 and so on. And if cast to a
larger integer value the sign bit should be extended?

Phil Frisbie, Jr.

unread,
May 18, 2005, 5:23:33 PM5/18/05
to
Iain wrote:

> On Wed, 18 May 2005 18:42:59 +0200, Alessandro Angeli [MVP::DigitalMedia]
> wrote:
>
>>Iain wrote:
>>
>>>If you know that your data is 8 bit mono, it will be
>>>stored as a sequence of signed bytes.
>>
>>UNSIGNED bytes, not signed :-)
>>
>>>If it were 16 bit stereo it would be stored as pairs of
>>>signed shorts.
>
>
> Surely the values go +/- zero?

No. 8 bit PCM is unsigned, with 127 the 'zero' level.

> So FF == -1 and so on. And if cast to a
> larger integer value the sign bit should be extended?
>
> Iain

--
Phil Frisbie, Jr.
Hawk Software
http://www.hawksoft.com

Peter Reichard

unread,
May 18, 2005, 7:54:24 PM5/18/05
to
>> Surely the values go +/- zero?
>
> No. 8 bit PCM is unsigned, with 127 the 'zero' level.

That's right, 16bit has signed values and 0 is the zero level.


Alessandro Angeli [MVP::DigitalMedia]

unread,
May 19, 2005, 7:36:26 AM5/19/05
to
Phil Frisbie, Jr. wrote:

> No. 8 bit PCM is unsigned, with 127 the 'zero' level.

128 is the zero level.

Iain

unread,
May 20, 2005, 5:26:50 AM5/20/05
to
On Thu, 19 May 2005 13:36:26 +0200, Alessandro Angeli [MVP::DigitalMedia]
wrote:

> Phil Frisbie, Jr. wrote:


>
>> No. 8 bit PCM is unsigned, with 127 the 'zero' level.
>
> 128 is the zero level.

I sit corrected!

Alessandro Angeli [MVP::DigitalMedia]

unread,
May 24, 2005, 5:55:35 AM5/24/05
to
Harassment Panda wrote:

> I think I missed the answer ;-)
> Say you are using DirextX to strip out the header details
> i.e. Formats; is there a simple algorithm that can be
> used on all wave formats, something that say can be
> iterated through, dependant on the number of channels and
> format of the buffer?
> Or is there more than 2 storage possibilities which stops
> this from being so simple?

If your data is PCM (wFormatTag == WAVE_FORMAT_PCM), the
samples are wBitsPerSample/8 bytes wide, in little endian
order, and there are nChannels samples per frame, in channel
order. The samples are signed and silence is 0 but for 8-bit
samples which are unsigned and silence is 128.

0 new messages