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 шт):

Автор решения: MBo

Посчитали Фурье-преобразование в моменты времени t c нужным шагом по времени.

Для каждого времени рассчитали амплитуду FT (зависимость амплитуды от частоты)

Создали вертикальный столбик шириной в один пиксел. Цвет пиксела соответствует относительной амплитуде. У вас явно децибелы, так что от амплитуды нужно будет взять логарифм и нормировать полученные значения на диапазон индексов цветовой шкалы (вероятно, 0..255)

Нарисовать полученный столбик на диаграмме в X-позиции, соответствующей нужному времени.

P.S. Частотную шкалу (ось Y) тоже часто изображают в логарифмическом виде.

→ Ссылка