C# цветной график для построения спектрограммы
Есть код программы, вычисляющий точки с помощью ДПФ.
using NAudio.Wave;
using MathNet.Numerics;
using MathNet.Numerics.IntegralTransforms;
using System;
using System.IO;
using System.Numerics;
class Program
{
static void Main()
{
string inputWavFile = "123.wav";
string outputTxtFile = "output.txt";
// Загрузка входного аудио файла
var audioFile = new AudioFileReader(inputWavFile);
// Создание буфера для аудио данных
int bufferSize = (int)audioFile.Length;
float[] audioBuffer = new float[bufferSize];
// Считывание данных из файла в буфер
audioFile.Read(audioBuffer, 0, bufferSize);
// Применение преобразования Фурье
Complex[] complexBuffer = new Complex[bufferSize];
for (int i = 0; i < bufferSize; i++)
{
complexBuffer[i] = new Complex(audioBuffer[i], 0);
}
Fourier.Forward(complexBuffer);
// Создание выходного текстового файла с динамическим спектром
using (StreamWriter writer = new StreamWriter(outputTxtFile))
{
// Запись информации о времени, частоте и амплитуде
double sampleRate = audioFile.WaveFormat.SampleRate;
double timeIncrement = 1.0 / sampleRate;
for (int i = 0; i < bufferSize; i++)
{
double time = i * timeIncrement;
double frequency = i * sampleRate / bufferSize;
double amplitude = complexBuffer[i].Magnitude;
writer.WriteLine($"{time} - {frequency} - {amplitude}");
}
}
Console.WriteLine("Динамический спектр создан и сохранен в " + outputTxtFile);
}
}
Как построить эти точки на графике как на примере ниже?

Ответы (1 шт):
Посчитали Фурье-преобразование в моменты времени t c нужным шагом по времени.
Для каждого времени рассчитали амплитуду FT (зависимость амплитуды от частоты)
Создали вертикальный столбик шириной в один пиксел. Цвет пиксела соответствует относительной амплитуде. У вас явно децибелы, так что от амплитуды нужно будет взять логарифм и нормировать полученные значения на диапазон индексов цветовой шкалы (вероятно, 0..255)
Нарисовать полученный столбик на диаграмме в X-позиции, соответствующей нужному времени.
P.S. Частотную шкалу (ось Y) тоже часто изображают в логарифмическом виде.