'Android Kotlin Real-Time FFT and plot

I am trying to apply Real-time FFT on a sensor data which is connected over the bluetooth BLE.

There is a sdk which allows you to receive the data from the sensor in the Android using handler. I am using ViewModel to send the sensor data in various parts of the app to plot the data using GraphView and perform FFT.

I am using JTransform to perform the FFT but before I was using JDSP to perform STFT.

Below is the code use to perform FFT on a unfiltered raw sensor data using JTransform

    var t = 0
    var fs  = 512
    var sampleSize = 2*fs
    val windowSize = sampleSize/2
    
    private fun getFFT(sample:DoubleArray): Array<DataPoint>{
        val fft = DoubleFFT_1D(sampleSize.toLong())
        fft.realForward(sample)
        return analysed(sample)
    } 
    
    private fun analysed(sample:DoubleArray): Array<DataPoint> {
        val series:Array<DataPoint> =  Array(sample.size) { i -> DataPoint(0.0,0.0) }
        sample.forEachIndexed { i, y -> 
            val x = i.toDouble()
            series[i] = DataPoint(x, y)
        }
        return series
    }

    
    sensorViewModel.getRaw().observe(this){
        if(t<sampleSize-1){
            sample[t] = it.toDouble()
            t++
        }else{
            sample = sample.takeLast(windowSize).toDoubleArray().plus(DoubleArray(2*windowSize) { i -> 0.0 })
            t = windowSize

            // Plot FFT
            asyncTask.execute(onPreExecute = {
            }, doInBackground = {
                getFFT(sample)
            }, onPostExecute = {
                fftseries.resetData(it)
            })
        }
    }

Although my code runs without crash but I can see so many problems with the app.

  1. Using a sliding window to create "sample" to perform FFT on the created sample feels really inefficient. Can anyone please suggest how can I do write it better with the better control of window size.

  2. How to make this FFT plot fast?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source