There is a Flow which will emit data every 100ms, and I hope to get a average value of every latest 5 data of the Flow, and convert the average value as Double value into another Flow.
How can I design the Flow?
Code A
fun soundDbFlow(period: Long = 100) = flow {
while (true) {
var data = getAmplitude()
emit(data)
delay(period)
}
}
.get_Average_Per5_LatestData {...} //How can I do? or is there other way?
.map { soundDb(it) }
private fun getAmplitude(): Int {
var result = 0
mRecorder?.let {
result = it.maxAmplitude
}
return result
}
private fun soundDb(input:Int, referenceAmp: Double = 1.0): Double {
return 20 * Math.log10(input / referenceAmp)
}
Added Content:
To plplmax: Thanks!
I assume Code B will emit 1,2,3,4,5,6,7,8,9,10.....
Do you guarantee Code C will calculate (1+2+3+4+5)/5 first, then calculate (6+7+8+9+10)/5 second, .... ? It's my expectation.
I worry that Code C maybe calculate (1+2+3+4+5)/5 first, the calculate (2+3+4+5+6)/5 sencond, ...
Code B
suspend fun soundDbFlow(period: Long) = flow {
while (true) {
val data = getAmplitude()
emit(data)
delay(period)
}
}
Code C
private fun reduceFlow(period: Long = 100) = flow {
while (true) {
val result = soundDbFlow(period)
.take(5)
.map { soundDb((it / 5.0).roundToInt()) }
.reduce { accumulator, value -> accumulator + value }
emit(result)
}
}