From b0ae92c64be898f4df369a2d912bad4b13b93384 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 20 Dec 2023 23:07:52 +0900 Subject: [PATCH] optimised convolve op --- src/net/torvald/terrarum/audio/AudioMixer.kt | 16 ++++++-- src/net/torvald/terrarum/audio/dsp/Convolv.kt | 38 ++++++++++++------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index 00fd53ebd..b1b0837ad 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -247,6 +247,8 @@ object AudioMixer: Disposable { private var testAudioMixRatio = 0.0 + private var muteLatched = false + fun update(delta: Float) { // test the panning /*musicTrack.getFilter().let { @@ -262,14 +264,20 @@ object AudioMixer: Disposable { if (Gdx.input.isKeyPressed(Input.Keys.UP)) testAudioMixRatio += mixDelta - else if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) + if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) testAudioMixRatio -= mixDelta - else if (Gdx.input.isKeyPressed(Input.Keys.NUM_1)) + if (Gdx.input.isKeyPressed(Input.Keys.NUM_1)) testAudioMixRatio = -1.0 - else if (Gdx.input.isKeyPressed(Input.Keys.NUM_2)) + if (Gdx.input.isKeyPressed(Input.Keys.NUM_2)) testAudioMixRatio = 0.0 - else if (Gdx.input.isKeyPressed(Input.Keys.NUM_3)) + if (Gdx.input.isKeyPressed(Input.Keys.NUM_3)) testAudioMixRatio = 1.0 + if (!muteLatched && Gdx.input.isKeyPressed(Input.Keys.NUM_4)) { + AudioMixer.sumBus.volume = 1.0 - AudioMixer.sumBus.volume + muteLatched = true + } + else if (!Gdx.input.isKeyPressed(Input.Keys.NUM_4)) + muteLatched = false testAudioMixRatio = testAudioMixRatio.coerceIn(MaterialCodex["AIIR"].sondrefl.absoluteValue * -1.0, 1.0) diff --git a/src/net/torvald/terrarum/audio/dsp/Convolv.kt b/src/net/torvald/terrarum/audio/dsp/Convolv.kt index 180e0422c..95bec94a3 100644 --- a/src/net/torvald/terrarum/audio/dsp/Convolv.kt +++ b/src/net/torvald/terrarum/audio/dsp/Convolv.kt @@ -10,7 +10,8 @@ class Convolv(ir: File, val gain: Float = 1f / 512f): TerrarumAudioFilter() { val fftLen: Int private val convFFT: Array - private val inbuf: Array +// private val inbuf: Array + private val sumbuf: ComplexArray private val BLOCKSIZE = TerrarumAudioMixerTrack.AUDIO_BUFFER_SIZE @@ -30,7 +31,8 @@ class Convolv(ir: File, val gain: Float = 1f / 512f): TerrarumAudioFilter() { println("IR '${ir.path}' Sample Count = $sampleCount; FFT Length = $fftLen") val conv = Array(2) { FloatArray(fftLen) } - inbuf = Array(2) { ComplexArray(FloatArray(fftLen * 2)) } +// inbuf = Array(2) { ComplexArray(FloatArray(fftLen * 2)) } + sumbuf = ComplexArray(FloatArray(fftLen * 2)) ir.inputStream().let { for (i in 0 until sampleCount) { @@ -72,10 +74,8 @@ class Convolv(ir: File, val gain: Float = 1f / 512f): TerrarumAudioFilter() { private val realtime = (BLOCKSIZE / TerrarumAudioMixerTrack.SAMPLING_RATEF * 1000000000L) private val fftIn = ComplexArray(FloatArray(fftLen * 2)) private val fftMult = ComplexArray(FloatArray(fftLen * 2)) - private val fftOut_lL = FloatArray(fftLen) // small l/r: input audio - private val fftOut_rL = FloatArray(fftLen) // large L/R: impulse response - private val fftOut_lR = FloatArray(fftLen) - private val fftOut_rR = FloatArray(fftLen) + private val fftOutL = FloatArray(fftLen) + private val fftOutR = FloatArray(fftLen) private fun convolve(x: ComplexArray, h: ComplexArray, output: FloatArray) { FFT.fftInto(x, fftIn) @@ -91,17 +91,14 @@ class Convolv(ir: File, val gain: Float = 1f / 512f): TerrarumAudioFilter() { - push(gain, inbuf[0], this.inbuf[0]) - push(gain, inbuf[1], this.inbuf[1]) + pushSum(gain, inbuf[0], inbuf[1], sumbuf) - convolve(this.inbuf[0], convFFT[0], fftOut_lL) - convolve(this.inbuf[1], convFFT[0], fftOut_rL) - convolve(this.inbuf[0], convFFT[1], fftOut_lR) - convolve(this.inbuf[1], convFFT[1], fftOut_rR) + convolve(sumbuf, convFFT[0], fftOutL) + convolve(sumbuf, convFFT[1], fftOutR) for (i in 0 until BLOCKSIZE) { - outbuf[0][i] = fftOut_lL[fftLen - BLOCKSIZE + i] + fftOut_rL[fftLen - BLOCKSIZE + i] - outbuf[1][i] = fftOut_rR[fftLen - BLOCKSIZE + i] + fftOut_lR[fftLen - BLOCKSIZE + i] + outbuf[0][i] = fftOutL[fftLen - BLOCKSIZE + i] + outbuf[1][i] = fftOutR[fftLen - BLOCKSIZE + i] } @@ -113,7 +110,9 @@ class Convolv(ir: File, val gain: Float = 1f / 512f): TerrarumAudioFilter() { fun push(gain: Float, samples: FloatArray, buf: ComplexArray) { + // shift numbers System.arraycopy(buf.reim, samples.size * 2, buf.reim, 0, buf.reim.size - samples.size * 2) + // fill in the shifted area val baseI = buf.reim.size - samples.size * 2 samples.forEachIndexed { index, fl -> buf.reim[baseI + index * 2 + 0] = fl * gain @@ -121,4 +120,15 @@ class Convolv(ir: File, val gain: Float = 1f / 512f): TerrarumAudioFilter() { } } + fun pushSum(gain: Float, sampleL: FloatArray, sampleR: FloatArray, buf: ComplexArray) { + // shift numbers + System.arraycopy(buf.reim, sampleL.size * 2, buf.reim, 0, buf.reim.size - sampleL.size * 2) + // fill in the shifted area + val baseI = buf.reim.size - sampleL.size * 2 + for (index in sampleL.indices) { + buf.reim[baseI + index * 2 + 0] = (sampleL[index] + sampleR[index]) * gain + buf.reim[baseI + index * 2 + 1] = 0f + } + } + } \ No newline at end of file