Ejemplo n.º 1
0
 public SampleAggregator(int fftLength)
 {
     if (!IsPowerOfTwo(fftLength))
     {
         throw new ArgumentException("FFT Length must be a power of two");
     }
     this.m         = (int)Math.Log(fftLength, 2.0);
     this.fftLength = fftLength;
     this.fftBuffer = new Complex[fftLength];
     this.fftArgs   = new FftEventArgs(fftBuffer);
 }
Ejemplo n.º 2
0
        void doFft(int channel, FftEventArgs e)
        {
            // Do something with e.result!
            float[] output = new float[e.Result.Length];
            float   val    = 0;
            int     val_i  = 0;

            for (int i = 0; i < e.Result.Length; i++)
            {
                output[i] = (float)Math.Sqrt(e.Result[i].X * e.Result[i].X + e.Result[i].Y * e.Result[i].Y);
                if (output[i] > val)
                {
                    val   = output[i];
                    val_i = i;
                }
            }
            maxVals[maxVali++] = output.Max();
            if (maxVali >= maxVals.Length)
            {
                maxVali = 0;
            }
            float scale = maxVals.Average();

            if (scale < 50)
            {
                scale = 50;
            }
#if DEBUG
            //Console.WriteLine("{3}: FFT value max of {0} at index {1} ({2} Hz), scale {4}", val, val_i, val_i * wi.WaveFormat.SampleRate / fftLength, DateTime.Now.Millisecond, scale);
#endif
            int maxi = 12000 / (wi.WaveFormat.SampleRate / fftLength);
            int s    = maxi / (LEDSetup.LED_C / 2);
            //byte[] serialData = LEDSetup.getMagicHeader();

            /*
             * for (int i = 0; i < LEDSetup.LED_C/2; i++)
             * {
             *  float sum = 0;
             *  for(int j=i; j<i*s;j++){
             *      sum+=output[j];
             *  }
             *  //sum/=(s);
             *  sum /= 100;
             *  LEDSetup.processColor(i, serialData, (int)sum, (int)sum, (int)sum);
             *  LEDSetup.processColor(24-i, serialData, (int)sum, (int)sum, (int)sum);
             * }
             * */
            int   bass1_max = 80 / (wi.WaveFormat.SampleRate / fftLength);
            float sum       = 0;
            float bassSum   = 0;
            for (int i = 1; i <= bass1_max; i++)
            {
                sum += output[i];
            }
            bassSum = sum;
            sum    /= 100;
            sum    *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(0, serialData, (int)sum, (int)0, (int)sum / 4);
            }
            else
            {
                LEDSetup.processColor(24, serialData, (int)sum, (int)0, (int)sum / 4);
            }

            int bass2_max = 120 / (wi.WaveFormat.SampleRate / fftLength);
            sum = 0;
            for (int i = bass1_max - 2; i <= bass2_max; i++)
            {
                sum += output[i];
            }
            bassSum += sum;
            beatVals[beatVali++] = bassSum * bassSum;
            if (beatVali >= beatVals.Length)
            {
                beatVali = 0;
            }

#if DEBUG
            Console.WriteLine("{2}: Bass sum {0}, beat average {1}", bassSum, beatVals.Average(), DateTime.Now.Millisecond, scale);
            if (bassSum * bassSum > beatVals.Average() * 2 && bassSum > 200)
            {
                if (!beatHit)
                {
                    beats++;
                    Console.WriteLine("BEAT DETECTED!");
                }
                beatHit = true;
            }
            else
            {
                beatHit = false;
            }
#endif
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(1, serialData, (int)sum, (int)0, (int)sum / 4);
            }
            else
            {
                LEDSetup.processColor(23, serialData, (int)sum, (int)0, (int)sum / 4);
            }

            int bass3_max = 170 / (wi.WaveFormat.SampleRate / fftLength);
            sum = 0;
            for (int i = bass2_max - 2; i <= bass3_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(2, serialData, (int)sum, (int)0, (int)sum / 2);
            }
            else
            {
                LEDSetup.processColor(22, serialData, (int)sum, (int)0, (int)sum / 2);
            }

            int bass4_max = 220 / (wi.WaveFormat.SampleRate / fftLength);
            sum = 0;
            for (int i = bass3_max - 2; i <= bass4_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(3, serialData, (int)sum, (int)0, (int)sum / 2);
            }
            else
            {
                LEDSetup.processColor(21, serialData, (int)sum, (int)0, (int)sum / 2);
            }

            int mid1_max = 500 / (wi.WaveFormat.SampleRate / fftLength); //440
            sum = 0;
            for (int i = bass4_max - 5; i <= mid1_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(4, serialData, (int)sum, (int)sum / 2, (int)sum / 2);
            }
            else
            {
                LEDSetup.processColor(20, serialData, (int)sum, (int)sum / 2, (int)sum / 2);
            }

            int mid2_max = 900 / (wi.WaveFormat.SampleRate / fftLength);
            sum = 0;
            for (int i = mid1_max - 5; i <= mid2_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(5, serialData, (int)sum, (int)sum / 2, (int)sum / 2);
            }
            else
            {
                LEDSetup.processColor(19, serialData, (int)sum, (int)sum / 2, (int)sum / 2);
            }

            int mid3_max = 2000 / (wi.WaveFormat.SampleRate / fftLength); //1200
            sum = 0;
            for (int i = mid2_max - 5; i <= mid3_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            LEDSetup.processColor(6, serialData, (int)sum, (int)sum / 2, (int)0);
            LEDSetup.processColor(18, serialData, (int)sum, (int)sum / 2, (int)0);

            int mid4_max = 4000 / (wi.WaveFormat.SampleRate / fftLength);
            sum = 0;
            for (int i = mid3_max - 5; i <= mid4_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(7, serialData, (int)sum, (int)sum / 2, (int)0);
            }
            else
            {
                LEDSetup.processColor(17, serialData, (int)sum, (int)sum / 2, (int)0);
            }

            int mid5_max = 6000 / (wi.WaveFormat.SampleRate / fftLength); //5000
            sum = 0;
            for (int i = mid4_max - 5; i <= mid5_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(8, serialData, (int)sum, (int)sum / 2, (int)sum / 4);
            }
            else
            {
                LEDSetup.processColor(16, serialData, (int)sum, (int)sum / 2, (int)sum / 4);
            }

            int mid6_max = 8000 / (wi.WaveFormat.SampleRate / fftLength); //5000
            sum = 0;
            for (int i = mid5_max - 5; i <= mid6_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(9, serialData, (int)sum, (int)sum / 2, (int)sum / 4);
            }
            else
            {
                LEDSetup.processColor(15, serialData, (int)sum, (int)sum / 2, (int)sum / 4);
            }

            int treb1_max = 10000 / (wi.WaveFormat.SampleRate / fftLength); //8000
            sum = 0;
            for (int i = mid6_max - 10; i <= treb1_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(10, serialData, (int)sum, (int)sum, (int)sum / 2);
            }
            else
            {
                LEDSetup.processColor(14, serialData, (int)sum, (int)sum, (int)sum / 2);
            }

            int treb2_max = 12000 / (wi.WaveFormat.SampleRate / fftLength); //8000
            sum = 0;
            for (int i = treb1_max - 10; i <= treb2_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            if (channel == 1)
            {
                LEDSetup.processColor(11, serialData, (int)sum, (int)sum, (int)sum / 2);
            }
            else
            {
                LEDSetup.processColor(13, serialData, (int)sum, (int)sum, (int)sum / 2);
            }

            int treb3_max = 15000 / (wi.WaveFormat.SampleRate / fftLength); //8000
            sum = 0;
            for (int i = treb2_max - 10; i <= treb3_max; i++)
            {
                sum += output[i];
            }
            sum /= 100;
            sum *= 4000 / scale;
            if (sum > 256)
            {
                sum = 256;
            }
            LEDSetup.processColor(12, serialData, (int)(sum + serialData[6 + 12 * 3]) / 2, (int)(sum + serialData[6 + 12 * 3 + 1]) / 2, (int)((sum * 0.75) + serialData[6 + 12 * 3 + 2]) / 2);

            fftSent |= channel + 1;
            if (fftSent == 3)
            {
                LEDSetup.sendSerialData(serialData);
                fftSent = 0;
            }
        }
Ejemplo n.º 3
0
 void FftCalculatedR(object sender, FftEventArgs e)
 {
     doFft(1, e);
 }