mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-09 18:14:06 +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 org.jtransforms.fft.FloatFFT_1D
|
||||||
import java.util.concurrent.locks.ReentrantLock
|
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
|
@JvmInline value class ComplexArray(val reim: FloatArray) {
|
||||||
private val IM0 = 1
|
|
||||||
|
|
||||||
private val RE1 = -1
|
|
||||||
private val IM1 = 0
|
|
||||||
|
|
||||||
val indices: IntProgression
|
val indices: IntProgression
|
||||||
get() = 0 until size
|
get() = 0 until size
|
||||||
@@ -40,6 +40,10 @@ class ComplexArray(val reim: FloatArray) {
|
|||||||
|
|
||||||
return ComplexArray(out)
|
return ComplexArray(out)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getReal(): FloatArray {
|
||||||
|
return FloatArray(size) { reim[it * 2] }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -138,7 +142,7 @@ object FFT: Disposable {
|
|||||||
val signal = signal0.reim
|
val signal = signal0.reim
|
||||||
val fft = FloatFFT_1D(signal0.size.toLong())
|
val fft = FloatFFT_1D(signal0.size.toLong())
|
||||||
fft.complexInverse(signal, true)
|
fft.complexInverse(signal, true)
|
||||||
return FloatArray(signal0.size) { signal[it * 2] }
|
return signal0.getReal()
|
||||||
}
|
}
|
||||||
|
|
||||||
// org.apache.commons.math3.transform.FastFouriesTransformer.java:214
|
// 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
|
||||||
import com.jme3.math.FastMath.sin
|
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.AudioMixer.SPEED_OF_SOUND
|
||||||
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.BUFFER_SIZE
|
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.BUFFER_SIZE
|
||||||
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATEF
|
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) {
|
for (ch in outbuf.indices) {
|
||||||
push(inbuf[ch].applyGain(gain), this.inbuf[ch])
|
push(inbuf[ch].applyGain(gain), this.inbuf[ch])
|
||||||
|
|
||||||
val inputFFT = FFT.fft(this.inbuf[ch])
|
var inputFFT: ComplexArray? = null
|
||||||
val Y = inputFFT * convFFT[ch]
|
var Y: ComplexArray? = null
|
||||||
val y = FFT.ifftAndGetReal(Y)
|
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()
|
val u = y.takeLast(BLOCKSIZE).toFloatArray()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user