Filter löschen
Filter löschen

sound normalization made distortion bigger

3 Ansichten (letzte 30 Tage)
L am 26 Okt. 2023
Kommentiert: Walter Roberson am 30 Okt. 2023
Hi.. I normalized some wav files using the following code. The reason to normalize is that I need the sound to have the same power.
When I played it in low volume everything is okay. But when I get the volume up, the sounds get terrible and distorted.
What is going on?
data_dir = sprintf('%s/data/audio_wav/Uniq_uncued',root_dir);
% Get a list of all files in the directory with the .wav extension.
files = dir(sprintf('%s/*.wav', data_dir)); %we only want control for cues.
%% Loop through each file
for idx = 1:length(files)
% read file
file = sprintf('%s/%s', data_dir, files(idx).name);
% get sound
[y,Fs] = audioread(file);
% get sound power
signalPower = sum(y.^2,1)/size(y,1);
soundsc(y,Fs); pause(3);
%normalize power (L2 norm normalization)
new_y = y ./ sqrt( signalPower )/10;
% check sound power
new_signalPower = sum(new_y.^2,1)/size(new_y,1);
soundsc(new_y,Fs); pause(3);
% This part of the code is trying to prevent the distortion (got it from a post, but it is not working)
yInt = new_y * 32768;
yInt(yInt == 32768) = 32767;
% save
[pathstr, name, ext] = fileparts(file);
audiowrite(sprintf('%s/%s_norm.wav', data_dir, name), yInt, Fs);
  1 Kommentar
L am 26 Okt. 2023
I think that the sound is being clipped when saving using audiowrite. That is the problem.
Just don't know how to solve it.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 26 Okt. 2023
yInt = new_y * 32768;
You need to convert to int16 after you zap the 32768.
You could consider using im2int16 instead of your current steps.
  4 Kommentare
L am 30 Okt. 2023
Thanks for your answer.
I actually solved the problem by using BitsPerSample as 64.
Walter Roberson
Walter Roberson am 30 Okt. 2023
yes, that should work, as it would trigger saving in double precision. However, the code
yInt = new_y * 32768;
strongly implies that you are converting to unsigned 16 bit integer.
When you read in the file with audioread(), it is likely (but not certain) that the "information content" is only 16 bits per sample. You do a computation to arrive at a scalar and divide all of the samples by that same scalar: the "information content" of each scalar would continue to be 16 bits. But you are writing out the results as 64 bits -- it is a waste of space.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)


Mehr zu Measurements and Spatial Audio finden Sie in Help Center und File Exchange


Community Treasure Hunt

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

Start Hunting!

Translated by