private void SetDataFFT(WaveInEventArgs args) { int bytesPerSample = _wi.WaveFormat.BitsPerSample / 8; int samplesRecorded = args.BytesRecorded / bytesPerSample; Int16[] dataPcm = new Int16[samplesRecorded]; for (int i = 0; i < samplesRecorded; i++) { dataPcm[i] = BitConverter.ToInt16(args.Buffer, i * bytesPerSample); } // the PCM size to be analyzed with FFT must be a power of 2 int fftPoints = 2; while (fftPoints * 2 <= dataPcm.Length) { fftPoints *= 2; } // apply a Hamming window function as we load the FFT array then calculate the FFT NAudio.Dsp.Complex[] fftFull = new NAudio.Dsp.Complex[fftPoints]; for (int i = 0; i < fftPoints; i++) { fftFull[i].X = (float)(dataPcm[i] * NAudio.Dsp.FastFourierTransform.HammingWindow(i, fftPoints)); } NAudio.Dsp.FastFourierTransform.FFT(true, (int)Math.Log(fftPoints, 2.0), fftFull); double[] dataFft = new double[fftPoints / 2]; byte[] data = new byte[fftPoints / 2]; for (int i = 0; i < fftPoints / 2; i++) { double fftLeft = Math.Abs(fftFull[i].X + fftFull[i].Y); double fftRight = Math.Abs(fftFull[fftPoints - i - 1].X + fftFull[fftPoints - i - 1].Y); dataFft[i] = fftLeft + fftRight; data[i] = (byte)(fftLeft + fftRight); } /*if(SpectrumVisualizer.GetType().Name == "CircleSpectrumVisualizer") * SpectrumVisualizer.Set(GetNiceCircleFFT(data)); * else * SpectrumVisualizer.Set(data);*/ SpectrumVisualizer.Set(GetNiceFftData(data, SpectrumVisualizer.GetType().Name == "CircleSpectrumVisualizer")); }
private void SetDataAmplitude(WaveInEventArgs args) { int bytesPerSample = _wi.WaveFormat.BitsPerSample / 8; int samplesRecorded = args.BytesRecorded / bytesPerSample; Int16[] lastBuffer = new Int16[samplesRecorded]; for (int i = 0; i < samplesRecorded; i++) { lastBuffer[i] = BitConverter.ToInt16(args.Buffer, i * bytesPerSample); } int lastBufferAmplitude = lastBuffer.Max() - lastBuffer.Min(); double amplitude = (double)lastBufferAmplitude / Math.Pow(2, _wi.WaveFormat.BitsPerSample); if (amplitude > peakAmplitudeSeen) { peakAmplitudeSeen = amplitude; } amplitude = amplitude / peakAmplitudeSeen * 100; //_spectrumdata.Clear(); if (_spectrumdata.Count >= NumberOfLines) { _spectrumdata.RemoveAt(0); } double regleDe3 = amplitude * 255 / 100; int y = Convert.ToInt32(regleDe3); if (y > 255) { y = 255; } if (y < 0) { y = 0; } _spectrumdata.Add((byte)y); SpectrumVisualizer.Set(_spectrumdata.ToArray()); }