Why does audiowrite modify my data frames slightly?

3 views (last 30 days)
Hafsa Asad
Hafsa Asad on 31 Jul 2018
Commented: Hafsa Asad on 11 Aug 2018
I have a vector that I want to write to an audio file (any format, .wav or .mp4 or any other audio format). Afterwards, I want the exact decimal floating point values back when I read that audio file later. It is a project about audio stenography. Problem is that reading that audio file gives values that are slightly different. I want exact. I cannot even truncate them to any fixed length because different elements of my vector have different number of digits in floating point. Here is a brief version of the code I am having trouble with:
>> Fs= 8000
>> my_vector= [-0.74446 , 0.009]
>> audiowrite('newfile.wav', my_vector, Fs)
>> recovered_vector= audioread('newfile.wav')
recovered_vector =
-0.744476318359375
0.008972167968750
I wanted the same values back, -0.74446 and 0.009. I tried with different audio formats (.og, .ogg, .mp4, .wav). wav was giving closest results but they are still not exact. I also tried with changing the image quality parameter with .ogg (it does not work with .wav) but it did not help.
I think its a really basic thing that I am missing here....Any help would be much appreciated.
Thanks.

Accepted Answer

Dinesh Iyer
Dinesh Iyer on 3 Aug 2018
Edited: Dinesh Iyer on 3 Aug 2018
For MP4 and OGG, you cannot expect sample accuracy because they are lossy compression formats.
For WAV, the difference is because the audiowrite call writes the data to the WAV file as 16-bit integers and not double precision. So, there is a loss of precision going from double -> int16 -> double.
Try
audiowrite('myfile.wav', my_vector, 44100, 'BitsPerSample', 64)
For FLAC, the maximum supported bits per sample is 24 which will again result in a loss of precision because of double -> 24-bit -> double conversion.
  1 Comment
Hafsa Asad
Hafsa Asad on 11 Aug 2018
thank you. your answer explains why i am getting those values but your code gives same results as mine.... values are not same. i guess its not possible

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!