mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
slightly faster fft using inline class
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user