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); }
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; } }
void FftCalculatedR(object sender, FftEventArgs e) { doFft(1, e); }