diff --git a/src/net/torvald/terrarum/audio/FFT.kt b/src/net/torvald/terrarum/audio/FFT.kt index b195cafda..13bbca9bb 100644 --- a/src/net/torvald/terrarum/audio/FFT.kt +++ b/src/net/torvald/terrarum/audio/FFT.kt @@ -10,14 +10,14 @@ import org.bytedeco.javacpp.Loader import org.jtransforms.fft.FloatFFT_1D import java.util.concurrent.locks.ReentrantLock +private val RE0 = 0 +private val IM0 = 1 -class ComplexArray(val reim: FloatArray) { +private val RE1 = -1 +private val IM1 = 0 - private val RE0 = 0 - private val IM0 = 1 +@JvmInline value class ComplexArray(val reim: FloatArray) { - private val RE1 = -1 - private val IM1 = 0 val indices: IntProgression get() = 0 until size @@ -40,6 +40,10 @@ class ComplexArray(val reim: FloatArray) { return ComplexArray(out) } + + fun getReal(): FloatArray { + return FloatArray(size) { reim[it * 2] } + } } /** @@ -138,7 +142,7 @@ object FFT: Disposable { val signal = signal0.reim val fft = FloatFFT_1D(signal0.size.toLong()) fft.complexInverse(signal, true) - return FloatArray(signal0.size) { signal[it * 2] } + return signal0.getReal() } // org.apache.commons.math3.transform.FastFouriesTransformer.java:214 diff --git a/src/net/torvald/terrarum/audio/TerrarumAudioFilter.kt b/src/net/torvald/terrarum/audio/TerrarumAudioFilter.kt index 97117253d..9a784c16e 100644 --- a/src/net/torvald/terrarum/audio/TerrarumAudioFilter.kt +++ b/src/net/torvald/terrarum/audio/TerrarumAudioFilter.kt @@ -2,6 +2,7 @@ package net.torvald.terrarum.audio import com.jme3.math.FastMath import com.jme3.math.FastMath.sin +import net.torvald.terrarum.App.measureDebugTime import net.torvald.terrarum.audio.AudioMixer.SPEED_OF_SOUND import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.BUFFER_SIZE import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATEF @@ -375,9 +376,12 @@ class Convolv(ir: File, val gain: Float = 1f / 256f): TerrarumAudioFilter() { for (ch in outbuf.indices) { push(inbuf[ch].applyGain(gain), this.inbuf[ch]) - val inputFFT = FFT.fft(this.inbuf[ch]) - val Y = inputFFT * convFFT[ch] - val y = FFT.ifftAndGetReal(Y) + var inputFFT: ComplexArray? = null + var Y: ComplexArray? = null + lateinit var y: FloatArray + measureDebugTime("audio.convolve.inputFFT") { inputFFT = FFT.fft(this.inbuf[ch]) } + measureDebugTime("audio.convolve.multiply") { Y = inputFFT!! * convFFT[ch] } + measureDebugTime("audio.convolve.inputIFFT") { y = FFT.ifftAndGetReal(Y!!) } val u = y.takeLast(BLOCKSIZE).toFloatArray()