slightly faster fft using inline class

This commit is contained in:
minjaesong
2023-11-27 01:04:05 +09:00
parent 33f5461453
commit 659a159697
2 changed files with 17 additions and 9 deletions

View File

@@ -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

View File

@@ -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()