From 8148ca48af86ec89894edf631ac25fce07e1a917 Mon Sep 17 00:00:00 2001 From: Doug Hoffman Date: Sun, 1 May 2022 05:57:32 -0400 Subject: [PATCH] Normalize audio before recording (#1213) #1213 Normalize audio before recording --- .../io/github/dsheirer/audio/AudioUtils.java | 42 +++++++++++++++++++ .../audio/convert/MP3AudioConverter.java | 2 + 2 files changed, 44 insertions(+) diff --git a/src/main/java/io/github/dsheirer/audio/AudioUtils.java b/src/main/java/io/github/dsheirer/audio/AudioUtils.java index 0f0dd223..06632176 100644 --- a/src/main/java/io/github/dsheirer/audio/AudioUtils.java +++ b/src/main/java/io/github/dsheirer/audio/AudioUtils.java @@ -24,7 +24,10 @@ import org.slf4j.LoggerFactory; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.Float; +import java.lang.Math; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.List; public class AudioUtils @@ -78,4 +81,43 @@ public class AudioUtils return stream.toByteArray(); } + + /** + * Normalize audio samples + */ + public static List normalize(List audioBuffers) + { + float targetMax = 0.95f; // -0.44dBFS + float max = 0.1f; // Initialize at 0.1 (-20dBFS) to limit maximum gain + + for(float[] audioBuffer: audioBuffers) + { + for(float value: audioBuffer) + { + float newMax = Math.max(max, Math.abs(value)); + if(!Float.isNaN(newMax)) + { + max = newMax; + } + } + } + + if(targetMax == max) + { + return audioBuffers; + } + + float gain = targetMax / max; + + for(float[] audioBuffer: audioBuffers) + { + for(int i=0;i convert(List audioPackets) { List converted = new ArrayList<>(); + audioPackets = AudioUtils.normalize(audioPackets); if(mResampler != null) {