On Tue, 11 Nov 2008 10:19:14 +1100
Erik de Castro Lopo <mle+la(a)mega-nerd.com> wrote:
Folderol wrote:
OK, there are four files:
http://www.musically.me.uk/music/Test1.wav
http://www.musically.me.uk/music/Test2.wav
http://www.musically.me.uk/music/Test3.wav
http://www.musically.me.uk/music/Test4.wav
Test1 is a short excerpt from the original recording that I
investigated. It is well clear of any clipping margins etc.
Test2-4 are copies made with Audacity's export function, and were made
one after the other, within seconds of each other, and without touching
anything else in Audacity (or any other application for that matter).
All have exactly the same byte count, and look identical to me in
Audacity.
Visual inspection is not really up the the task :-).
I've got a little curses hexdump utility that I use for this kind of
comparison:
http://www.mega-nerd.com/erikd/Blog/Tools/hv.html
which shows something like this for "hv Test[234].wav":
00000000: 52 49 46 46 A8 02 49 00 57 41 56 45 66 6D 74 20 RIFF..I. WAVEfmt
52 49 46 46 A8 02 49 00 57 41 56 45 66 6D 74 20 RIFF..I. WAVEfmt
52 49 46 46 A8 02 49 00 57 41 56 45 66 6D 74 20 RIFF..I. WAVEfmt
00000010: 10 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00 ........ D.......
10 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00 ........ D.......
10 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00 ........ D.......
00000020: 04 00 10 00 64 61 74 61 84 02 49 00 00 00 02 00 ....data ..I.....
04 00 10 00 64 61 74 61 84 02 49 00 FE FF 02 00 ....data ..I.....
04 00 10 00 64 61 74 61 84 02 49 00 01 00 FF FF ....data ..I.....
00000030: FC FF 05 00 FB FF 02 00 01 00 FE FF 02 00 FE FF ........ ........
FD FF 03 00 FD FF 01 00 02 00 FC FF 05 00 FA FF ........ ........
00 00 00 00 00 00 FF FF 02 00 FE FF 02 00 FD FF ........ ........
The differences are small, about 2 least significant bits, which suggests
that the audio has been dithered.
My guess is that Audacity has a default internal format of normalized
floats (ie range [-1.0, 1.0]) and that by default it dithers when saving
internal floating point data to a 16 bit WAV files.
In general, when converting from float to 16 bit int, dither should be
applied. However, one case where it makes sense not to dither is when
you load 16 bit integer audio data into a float internal format and then
save it back to a 16 bit integer format. In other words, the int16_t ->
float -> int16_t chain should be lossless.
If you are interested in lossless conversion from integer format to
integer format, you should try sndfile-convert which (obviously)
handles all the formats supported by libsndfile. The sndfile-convert
program by default does all conversions in 32 bit integer format
(hence int16_t -> int16_t is lossless) and only uses floating
point if either the source or destination format is float.
HTH,
Erik
Thank you very much for going into this in such detail and so quickly.
I can confirm that using sndfile-convert directly gives completely
identical files.
This is true when going wav -> wav and also wav -> flac -> wav
--
Will J Godfrey