// TODO: remove this ))) private void featuresListView_SelectedIndexChanged(object sender, EventArgs e) { if (featuresListView.SelectedItems.Count == 0) { return; } var pos = featuresListView.SelectedIndices[0]; var fft = new Fft(512); var spectrum = fft.PowerSpectrum(_signal[pos * _hopSize, pos * _hopSize + _frameSize]).Samples; var peaks = new int[10]; var freqs = new float[10]; Harmonic.Peaks(spectrum, peaks, freqs, _signal.SamplingRate); peaksListBox.Items.Clear(); for (var p = 0; p < peaks.Length; p++) { peaksListBox.Items.Add($"peak #{p+1,-2} : {freqs[p],-7} Hz"); } _spectrumImage = new Bitmap(512, spectrumPictureBox.Height); var g = Graphics.FromImage(_spectrumImage); g.Clear(Color.White); var pen = new Pen(ForeColor); var redpen = new Pen(Color.Red, 2); var i = 1; var Stride = 4; var PaddingX = 5; var PaddingY = 5; var x = PaddingX + Stride; var min = spectrum.Min(); var max = spectrum.Max(); var height = _spectrumImage.Height; var gain = max - min < 1e-6 ? 1 : (height - 2 * PaddingY) / (max - min); var offset = (int)(height - PaddingY + min * gain); for (; i < spectrum.Length; i++) { g.DrawLine(pen, x - Stride, -spectrum[i - 1] * gain + offset, x, -spectrum[i] * gain + offset); x += Stride; } for (i = 0; i < peaks.Length; i++) { g.DrawLine(redpen, PaddingX + peaks[i] * Stride, PaddingY + offset, PaddingX + peaks[i] * Stride, -PaddingY - spectrum[peaks[i]] * gain + offset); } pen.Dispose(); redpen.Dispose(); g.Dispose(); spectrumPictureBox.Image = _spectrumImage; }