From adcab0448c04689bc9d02020bac19a2b94131d9f Mon Sep 17 00:00:00 2001 From: towsey Date: Mon, 17 Aug 2020 14:33:38 +1000 Subject: [PATCH] Fix generation of additional spectrogram types. Issue #332 --- .../SpectrogramGenerator/SpectrogramGenerator.Core.cs | 2 ++ .../StandardSpectrograms/BaseSonogram.cs | 7 ++++--- .../SpectrogramGenerator/SpectrogramGeneratorTests.cs | 7 ++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/AnalysisPrograms/SpectrogramGenerator/SpectrogramGenerator.Core.cs b/src/AnalysisPrograms/SpectrogramGenerator/SpectrogramGenerator.Core.cs index f5756cfdb..510abd8f4 100644 --- a/src/AnalysisPrograms/SpectrogramGenerator/SpectrogramGenerator.Core.cs +++ b/src/AnalysisPrograms/SpectrogramGenerator/SpectrogramGenerator.Core.cs @@ -38,7 +38,9 @@ static SpectrogramGenerator() /// Waveform. /// DecibelSpectrogram. /// DecibelSpectrogramNoiseReduced. + /// MelScaleSpectrogram /// CepstralSpectrogram. + /// OctaveScaleSpectrogram /// DifferenceSpectrogram. /// AmplitudeSpectrogramLocalContrastNormalization. /// Experimental. diff --git a/src/AudioAnalysisTools/StandardSpectrograms/BaseSonogram.cs b/src/AudioAnalysisTools/StandardSpectrograms/BaseSonogram.cs index 1692537ae..fa07a4b02 100644 --- a/src/AudioAnalysisTools/StandardSpectrograms/BaseSonogram.cs +++ b/src/AudioAnalysisTools/StandardSpectrograms/BaseSonogram.cs @@ -174,9 +174,6 @@ private void InitialiseSpectrogram(WavReader wav) this.Configuration.SampleRate = wav.SampleRate; //also set the Nyquist this.MaxAmplitude = wav.CalculateMaximumAmplitude(); - //init normalised signal energy array but do nothing with it. This has to be done from outside - this.DecibelsNormalised = new double[this.FrameCount]; - var recording = new AudioRecording(wav); var fftData = DSP_Frames.ExtractEnvelopeAndFfts( recording, @@ -190,6 +187,10 @@ private void InitialiseSpectrogram(WavReader wav) this.Configuration.WindowPower = fftData.WindowPower; this.FrameCount = fftData.FrameCount; this.DecibelsPerFrame = fftData.FrameDecibels; + + //init normalised signal energy array but do nothing with it. This has to be done from outside + this.DecibelsNormalised = new double[this.FrameCount]; + this.Data = fftData.AmplitudeSpectrogram; // currently DoSnr = true by default diff --git a/tests/Acoustics.Test/AnalysisPrograms/SpectrogramGenerator/SpectrogramGeneratorTests.cs b/tests/Acoustics.Test/AnalysisPrograms/SpectrogramGenerator/SpectrogramGeneratorTests.cs index 2ee81be20..559fd5136 100644 --- a/tests/Acoustics.Test/AnalysisPrograms/SpectrogramGenerator/SpectrogramGeneratorTests.cs +++ b/tests/Acoustics.Test/AnalysisPrograms/SpectrogramGenerator/SpectrogramGeneratorTests.cs @@ -20,13 +20,16 @@ namespace Acoustics.Test.AnalysisPrograms.SpectrogramGenerator [TestClass] public class SpectrogramGeneratorTests : GeneratedImageTest { + // There are currently eight spectrogram types plus the waveform. private const int Width = 1096; private const int Waveform = 154; private const int Spectrogram = 310; private const int SpectrogramNoiseRemoved = 310; private const int SpectrogramExperimental = 310; private const int SpectrogramDifference = 310; + private const int SpectrogramMel = 118; private const int Cepstral = 67; + private const int SpectrogramOctave = 157; private const int SpectrogramAmplitude = 310; private static readonly Dictionary All = new Dictionary() @@ -36,7 +39,9 @@ public class SpectrogramGeneratorTests : GeneratedImageTest { SpectrogramImageType.DecibelSpectrogramNoiseReduced, SpectrogramNoiseRemoved }, { SpectrogramImageType.Experimental, SpectrogramExperimental }, { SpectrogramImageType.DifferenceSpectrogram, SpectrogramDifference }, + { SpectrogramImageType.MelScaleSpectrogram, SpectrogramMel }, { SpectrogramImageType.CepstralSpectrogram, Cepstral }, + { SpectrogramImageType.OctaveScaleSpectrogram, SpectrogramOctave }, { SpectrogramImageType.AmplitudeSpectrogramLocalContrastNormalization, SpectrogramAmplitude }, }; @@ -111,7 +116,7 @@ public void TestAudio2SonogramCombinations(SpectrogramImageType[] images) // get expected height var expectedHeight = images.Select(imageType => All[imageType]).Sum(); - Assert.That.ImageIsSize(OneSecondWidth, expectedHeight, result.CompositeImage); + Assert.That.ImageIsSize(OneSecondWidth, expectedHeight, this.ActualImage); // ensure images are in correct order int y = 0;