HART  0.1.0
High level Audio Regression and Testing
Loading...
Searching...
No Matches
hart_plot.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "../dependencies/choc/platform/choc_DisableAllWarnings.h"
4#include "../dependencies/signalsmith/plot.h"
5#include "../dependencies/choc/platform/choc_ReenableAllWarnings.h"
6
8
9namespace hart {
10
11/// @brief Plots audio buffers as an svg file
12/// @private
13template <typename SampleType>
14void plotData (const AudioBuffer<SampleType>& input, const AudioBuffer<SampleType>& output, double sampleRateHz, const std::string& plotFilePath)
15{
16 const double bufferSizeSeconds = static_cast <double> (output.getNumFrames()) / sampleRateHz;
17 const double timeIncrementSeconds = 1.0 / sampleRateHz;
18
19 signalsmith::plot::Figure figure;
20 auto& inputSignalPlot = figure (0, 0).plot (1200, 200);
21 auto& outputSignalPlot = figure (0, 1).plot (1200, 200);
22
23 inputSignalPlot.y.major (0).label ("Value");
24 outputSignalPlot.y.major (0).label ("Value");
25 inputSignalPlot.x.major (0);
26 outputSignalPlot.x.major (0).label("Time (s)");
27 inputSignalPlot.title ("Input audio");
28 outputSignalPlot.title ("Output audio");
29
30 const SampleType inputSamplePeak = input.getMagnitude (0, input.getNumFrames());
31 inputSignalPlot.y.minor (inputSamplePeak).minor (-inputSamplePeak);
32 const SampleType outputSamplePeak = output.getMagnitude (0, output.getNumFrames());
33 outputSignalPlot.y.minor (outputSamplePeak).minor (-outputSamplePeak);
34
35 for (double t = 0.1; t < bufferSizeSeconds + 1e-6; t += 0.1)
36 {
37 inputSignalPlot.x.minor (t);
38 outputSignalPlot.x.minor (t);
39 }
40
41 for (double t = 1.0; t < bufferSizeSeconds + 1e-6; t += 1.0)
42 {
43 inputSignalPlot.x.major (t);
44 outputSignalPlot.x.major (t);
45 }
46
47 double timeSeconds = 0.0;
48
49 for (size_t channel = 0; channel < input.getNumChannels(); ++channel)
50 {
51 auto &inputSignalLine = inputSignalPlot.line();
52
53 for (size_t frame = 0; frame < input.getNumFrames(); ++frame)
54 {
55 inputSignalLine.add (timeSeconds, input[channel][frame]);
56 timeSeconds += timeIncrementSeconds;
57 }
58 }
59
60 timeSeconds = 0.0;
61
62 for (size_t channel = 0; channel < output.getNumChannels(); ++channel)
63 {
64 auto &outputSignalLine = outputSignalPlot.line();
65
66 for (size_t frame = 0; frame < output.getNumFrames(); ++frame)
67 {
68 outputSignalLine.add (timeSeconds, output[channel][frame]);
69 timeSeconds += timeIncrementSeconds;
70 }
71 }
72
73 figure.write (plotFilePath);
74}
75
76} // namespace hart