//int[] chunk_freq = { 10, 100, 2048}; //int[] chunk_freq_jump = { 1, 10, 20}; private double[] FFT(double[] lastData) { DateTime chkpoint1 = DateTime.Now; if (dataList == null) { return(null); } int actualN = distance2Node + 1; if (actualN < N_FFT) { return(new double[0]); } bool transformed = false; if (lastData == null || lastData.Length == 0) { lastData = new double[N_FFT]; } else { transformed = true; } ComplexNumber[] data = new ComplexNumber[N_FFT]; var runningNode = endingNode; for (int i = 0; i < N_FFT; i++) { data[i] = runningNode.Value; if (runningNode.PrevNode == null) { } runningNode = runningNode.PrevNode; } var result = FFTProcessor.FFT(data); double N2 = result.Length / 2; double[] finalresult = new double[lastData.Length]; int k = 1, transformedDataIndex = 0; double value = 0; double refFeq = 250; int i_ref = (int)(refFeq * N2 / 22050); for (int i = 0; i < N2; i += k) { value = 0; //k = i / i_ref; //k = k == 0 ? 1 : k; var mappedFreq = i * samplingFrequency / 2 / N2; for (int l = 0; l < chunk_freq.Length; l++) { if (mappedFreq < chunk_freq[l] || l == chunk_freq.Length - 1) { k = chunk_freq_jump[l];//chunk_freq[l] / chunk_freq[0]; break; } } for (int j = i; j < i + k && j < N2; j++) { value += result[j].Manigtude; } value = value * MasterScaleFFT; lastData[transformedDataIndex] -= lastDelay * DropOffScale; if (Mode == 0) { finalresult[transformedDataIndex] = value; } else { finalresult[transformedDataIndex] = value > lastData[transformedDataIndex] ? value : lastData[transformedDataIndex]; } transformedDataIndex++; } if (!transformed) { Array.Resize <double>(ref finalresult, transformedDataIndex); } DateTime chkpoint1_end = DateTime.Now; lastDelay = chkpoint1_end.Subtract(chkpoint1).TotalMilliseconds; osdPanel.AddSet("FFT delay(ms)", lastDelay.ToString()); return(finalresult); }