mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
more small optimisation of FFT
This commit is contained in:
@@ -14,7 +14,6 @@ import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.COL_METER_GRAD_YEL
|
|||||||
import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.FILTER_NAME_ACTIVE
|
import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.FILTER_NAME_ACTIVE
|
||||||
import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.STRIP_W
|
import net.torvald.terrarum.ui.BasicDebugInfoWindow.Companion.STRIP_W
|
||||||
import net.torvald.terrarum.ui.Toolkit
|
import net.torvald.terrarum.ui.Toolkit
|
||||||
import java.io.File
|
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -63,7 +62,7 @@ class Convolv(irModule: String, irPath: String, val crossfeed: Float, gain: Floa
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
pushSum(gain, inbuf[0], inbuf[1], sumbuf)
|
pushSumCircular(gain, inbuf[0], inbuf[1], sumbuf)
|
||||||
|
|
||||||
convolve(sumbuf[0], convFFT[0], fftOutL)
|
convolve(sumbuf[0], convFFT[0], fftOutL)
|
||||||
convolve(sumbuf[1], convFFT[1], fftOutR)
|
convolve(sumbuf[1], convFFT[1], fftOutR)
|
||||||
@@ -80,30 +79,16 @@ class Convolv(irModule: String, irPath: String, val crossfeed: Float, gain: Floa
|
|||||||
processingSpeed = realtime / ptime
|
processingSpeed = realtime / ptime
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var bufferIndex = 0
|
||||||
private fun push(gain: Float, samples: FloatArray, buf: ComplexArray) {
|
private fun pushSumCircular(gain: Float, sampleL: FloatArray, sampleR: FloatArray, sumbuf: Array<ComplexArray>) {
|
||||||
// shift numbers
|
val baseIdx = bufferIndex * 2
|
||||||
System.arraycopy(buf.reim, samples.size * 2, buf.reim, 0, buf.reim.size - samples.size * 2)
|
for (i in sampleL.indices) {
|
||||||
// fill in the shifted area
|
sumbuf[0].reim[baseIdx + i * 2] = (sampleL[i] + sampleR[i] * crossfeed) * gain
|
||||||
val baseI = buf.reim.size - samples.size * 2
|
sumbuf[0].reim[baseIdx + i * 2 + 1] = 0f
|
||||||
samples.forEachIndexed { index, fl ->
|
sumbuf[1].reim[baseIdx + i * 2] = (sampleL[i] * crossfeed + sampleR[i]) * gain
|
||||||
buf.reim[baseI + index * 2 + 0] = fl * gain
|
sumbuf[1].reim[baseIdx + i * 2 + 1] = 0f
|
||||||
buf.reim[baseI + index * 2 + 1] = 0f
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun pushSum(gain: Float, sampleL: FloatArray, sampleR: FloatArray, sumbuf: Array<ComplexArray>) {
|
|
||||||
// shift numbers
|
|
||||||
System.arraycopy(sumbuf[0].reim, sampleL.size * 2, sumbuf[0].reim, 0, sumbuf[0].reim.size - sampleL.size * 2)
|
|
||||||
System.arraycopy(sumbuf[1].reim, sampleL.size * 2, sumbuf[1].reim, 0, sumbuf[1].reim.size - sampleL.size * 2)
|
|
||||||
// fill in the shifted area
|
|
||||||
val baseI = sumbuf[0].reim.size - sampleL.size * 2
|
|
||||||
for (index in sampleL.indices) {
|
|
||||||
sumbuf[0].reim[baseI + index * 2 + 0] = (sampleL[index] * 1.000000f + sampleR[index] * crossfeed) * gain
|
|
||||||
sumbuf[0].reim[baseI + index * 2 + 1] = 0f
|
|
||||||
sumbuf[1].reim[baseI + index * 2 + 0] = (sampleL[index] * crossfeed + sampleR[index] * 1.000000f) * gain
|
|
||||||
sumbuf[1].reim[baseI + index * 2 + 1] = 0f
|
|
||||||
}
|
}
|
||||||
|
bufferIndex = (bufferIndex + sampleL.size) % (fftLen - sampleL.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun drawDebugView(batch: SpriteBatch, x: Int, y: Int) {
|
override fun drawDebugView(batch: SpriteBatch, x: Int, y: Int) {
|
||||||
|
|||||||
Reference in New Issue
Block a user