From f11ea557be591279db51898a4bd1677ac2f371ad Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 29 Jun 2025 19:29:02 +0900 Subject: [PATCH] reverting FFT changes --- src/net/torvald/terrarum/audio/FFT.kt | 10 +++++----- src/net/torvald/terrarum/audio/dsp/Convolv.kt | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/net/torvald/terrarum/audio/FFT.kt b/src/net/torvald/terrarum/audio/FFT.kt index 993e65436..5164b2259 100644 --- a/src/net/torvald/terrarum/audio/FFT.kt +++ b/src/net/torvald/terrarum/audio/FFT.kt @@ -92,26 +92,26 @@ object FFT: Disposable { fun fft(signal0: FloatArray): ComplexArray { val signal = FloatArray(signal0.size * 2) { if (it % 2 == 0) signal0[it / 2] else 0f } - ffts[signal0.size]!!.realForward(signal) + ffts[signal0.size]!!.complexForward(signal) return ComplexArray(signal) } fun fft(signal0: ComplexArray) { - ffts[signal0.size]!!.realForward(signal0.reim) + ffts[signal0.size]!!.complexForward(signal0.reim) } fun fftInto(signal0: ComplexArray, out: ComplexArray) { System.arraycopy(signal0.reim, 0, out.reim, 0, signal0.reim.size) - ffts[signal0.size]!!.realForward(out.reim) + ffts[signal0.size]!!.complexForward(out.reim) } fun ifftAndGetReal(signal0: ComplexArray): FloatArray { - ffts[signal0.size]!!.realInverse(signal0.reim, true) + ffts[signal0.size]!!.complexInverse(signal0.reim, true) return signal0.getReal() } fun ifftAndGetReal(signal0: ComplexArray, output: FloatArray) { - ffts[signal0.size]!!.realInverse(signal0.reim, true) + ffts[signal0.size]!!.complexInverse(signal0.reim, true) for (i in 0 until signal0.size) { output[i] = signal0.reim[i * 2] } diff --git a/src/net/torvald/terrarum/audio/dsp/Convolv.kt b/src/net/torvald/terrarum/audio/dsp/Convolv.kt index a4f8f041b..396097bcd 100644 --- a/src/net/torvald/terrarum/audio/dsp/Convolv.kt +++ b/src/net/torvald/terrarum/audio/dsp/Convolv.kt @@ -62,7 +62,7 @@ class Convolv(irModule: String, irPath: String, val crossfeed: Float, gain: Floa - pushSumCircular(gain, inbuf[0], inbuf[1], sumbuf) + pushSum(gain, inbuf[0], inbuf[1], sumbuf) convolve(sumbuf[0], convFFT[0], fftOutL) convolve(sumbuf[1], convFFT[1], fftOutR) @@ -79,6 +79,20 @@ class Convolv(irModule: String, irPath: String, val crossfeed: Float, gain: Floa processingSpeed = realtime / ptime } + private fun pushSum(gain: Float, sampleL: FloatArray, sampleR: FloatArray, sumbuf: Array) { + // 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 + } + } + private var bufferIndex = 0 private fun pushSumCircular(gain: Float, sampleL: FloatArray, sampleR: FloatArray, sumbuf: Array) { val baseIdx = bufferIndex * 2