コード例 #1
0
        //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);
        }