help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Audio Compressor


From: Ian McCallion
Subject: Re: Audio Compressor
Date: Tue, 18 Aug 2020 16:27:18 +0100

On Tue, 18 Aug 2020 at 14:41, Renato S. Yamane <renatoyamane@gmail.com> wrote:
Hi,

Is there an Audio Compressor available in Octave?
https://www.mathworks.com/help/audio/ref/compressor-system-object.html  

I'm compressing my noises in the worst way, as you can see in the "while" condition on the example below.

In my way, the peaks will be "clipped", and I would like to avoid my stupid workaround:

====================
crest_factor = 6;
typenoise = noise(10*44100, 1, 'pink');
[z, p, k] = butter(4, [100/(44100/2), 500/(44100/2)]);
sos = zp2sos (z, p, k);
filtered = sosfilt(sos, typenoise);
normalized = filtered / (rms(filtered) / 10^(-crest_factor/20));

#{
Now I'm making an stupid workaround, as the audio file must be in
a range from -1 to +1:
#}

while (normalized(normalized > 1) || normalized(normalized < -1))
  normalized(normalized > 1) = 1;
  normalized(normalized < -1) = -1;
  normalized = normalized / (rms(normalized) / 10^(-crest_factor/20));
endwhile

audiowrite ('AudioFile.wav', normalized, 44100);

I'm not aware there is an equivalent function on Octave to the Matlab compressor, but if I might make a couple of comments on the code:

1. Your while loop looks very strange to me and I believe the identical result would be achieved much faster by simply omitting the while and endwhile statements.

2.  The statement:
         normalized = filtered / (rms(filtered) / 10^(-crest_factor/20));
     normalises the signal to an RMS level of -6dB below 1. An RMS below 1 does not of 
     course guarantee there will be no samples greater than 1, but unless your signal is very
     peculiar I would expect there to be very few or none.

Possibly therefore the following code would meet your needs without the need for complex compression.

crest_factor = 6;
typenoise = noise(10*44100, 1, 'pink');
[z, p, k] = butter(4, [100/(44100/2), 500/(44100/2)]);
sos = zp2sos (z, p, k);
filtered = sosfilt(sos, typenoise);
normalized = filtered / (rms(filtered) / 10^(-crest_factor/20));
NumberOfClippedSamples = nnz( normalized > 1 |normalized<-1)
normalized(normalized > 1) = 1;
normalized(normalized < -1) = -1;

I hope this helps.

Cheers... Ian

reply via email to

[Prev in Thread] Current Thread [Next in Thread]