24-bit wav files and other observations

Daniel J Sebald daniel.sebald at ieee.org
Thu Feb 21 19:01:10 CST 2008


John W. Eaton wrote:
> On 21-Feb-2008, Daniel J Sebald wrote:
> 
> | I wanted to read a WAV file with 24 bit data width using
> | auload()--rather than the 8, 16, or 32-bit facility.  I've made some
> | simple changes (see attached patch), which brings up a few issues.
> | 
> | 
> | 1) The fread() routine always returns a variable of type 'double'.
> | You'd think that the variable would have the native format.  E.g.,
> | 
> |   data = fread(file, samples, 'uint8', 0, arch);
> | 
> | would mean 'data' to be of type 'uint8'.
> 
> If you want that, then you need to write
> 
>   data = fread(file, samples, 'uint8=>uint8', 0, arch);
> 
> or
> 
>   data = fread(file, samples, '*uint8', 0, arch);
> 
> This feature is documented in the help for fread.

Ahh!

> 
> | 2) Why does Octave/Matlab not have 'uint24' throughout?  For
> | example, there'd be nothing unusual about
> | 
> |   data = fread(file, samples, 'int24', 0, arch);
> | 
> | and a type 'int24'.
> 
> What general-purpose systems have 24-bit ints as a native data type?

Well, probably few general-purpose systems.  There are many 24-bit embedded processors, of course, and then there are plenty of data files that use 24-bit data.  So, from an analytical standpoint there are reasons for having 24-bit "native" types.  It's similar to the situation that we have very few 8 bit CPU's anymore, but the 8-bit width "native" format is still ubiquitous.


> | I would think that bitor(-2,1) should be -1.  Is this a bug?
> 
> The documentation for bitor says:
> 
>  -- Built-in Function:  bitor (X, Y)
>      Return the bitwise OR of nonnegative integers.  X, Y must be in
>      range [0..bitmax]
> 
> Maybe it is a bug that it doesn't warn or give an error for negative
> values.

Ehhh, what I wrote isn't exactly true, as the behavior doesn't quite reflect what the documentation says.  Note the following:

octave:8> x = 1
x =  1
octave:9> y = -2
y = -2
octave:10> bitor(x,y)
ans =  1
octave:11> x = cast(1,"int8")
x = 1
octave:12> y = cast(-2,"int8")
y = -2
octave:13> bitor(x,y)
ans = -1

When the types are "double" then bit-wise ops behave in the range [0..bitmax].  But when the types are "int8" then bit-wise ops behave the way I would expect.  I suppose there is some logic to that, as "floating point" has a more arcane definition to it, i.e., mantisa, exponent.

Perhaps the behavior is acceptable and all that is needed is a bit more detail in the documentation?  Or is there more to this?

Dan


More information about the Octave-maintainers mailing list