From 51407dbe1cd37ef4b6f6c08a6d7c4c42158bd6b4 Mon Sep 17 00:00:00 2001 From: "dmitry.i.sokolov" Date: Thu, 8 Dec 2016 14:36:40 +0400 Subject: [PATCH] sound level --- .../rxandroidaudio/example/MainActivity.kt | 4 +++- .../me/ilich/rxandroidaudio/AudioLevel.kt | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/me/ilich/rxandroidaudio/example/MainActivity.kt b/app/src/main/kotlin/me/ilich/rxandroidaudio/example/MainActivity.kt index b6a49fc..40d7c2b 100644 --- a/app/src/main/kotlin/me/ilich/rxandroidaudio/example/MainActivity.kt +++ b/app/src/main/kotlin/me/ilich/rxandroidaudio/example/MainActivity.kt @@ -92,13 +92,15 @@ class MainActivity : AppCompatActivity() { startLevelButton.setOnClickListener { val source = RecordObservable.create16bit(recordAudioOptions) + val lowpassFilter = LowpassFilter.crate16bit(32.0F, 1.0F, recordAudioOptions) subs = Observable. create(source). sample(500L, TimeUnit.MILLISECONDS). + map { samples -> lowpassFilter.filter(samples) }. map { samples -> AudioLevel.maxDecibel(samples) }. - map { peek -> peek + 110.0 }. + map { peek -> peek + 160.0 }. subscribeOn(Schedulers.newThread()). observeOn(AndroidSchedulers.mainThread()). subscribe { diff --git a/rxaa/src/main/kotlin/me/ilich/rxandroidaudio/AudioLevel.kt b/rxaa/src/main/kotlin/me/ilich/rxandroidaudio/AudioLevel.kt index 8441ff3..d2cdaff 100644 --- a/rxaa/src/main/kotlin/me/ilich/rxandroidaudio/AudioLevel.kt +++ b/rxaa/src/main/kotlin/me/ilich/rxandroidaudio/AudioLevel.kt @@ -4,6 +4,8 @@ class AudioLevel { companion object { + private const val EPSILON = 0.001; + fun rms(samples: ShortArray) = if (samples.isEmpty()) { 0.0 } else { @@ -12,11 +14,22 @@ class AudioLevel { fun maxDecibel(samples: ShortArray): Double = samples. - map { sh -> sh.toDouble() / Short.MAX_VALUE }. - map { db -> 20.0 * Math.log10(db) }. + map { sh -> + sh.toDouble() / Short.MAX_VALUE + }. + map { db -> + if (db == 0.0) { + EPSILON + } else { + Math.abs(db) + } + }. + map { db -> + 20.0 * Math.log10(db) + }. filter(Double::isFinite). max() ?: - 0.0 + Double.NEGATIVE_INFINITY }