Skip to content

Commit

Permalink
More epsilon/log of zero fixes.
Browse files Browse the repository at this point in the history
Issue #332
  • Loading branch information
towsey committed Aug 17, 2020
1 parent 6dbe9ba commit 2a8c3e2
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 11 deletions.
6 changes: 3 additions & 3 deletions src/AudioAnalysisTools/DSP/OctaveFreqScale.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,14 @@ public static FrequencyScale GetStandardOctaveScale(FrequencyScale scale)
/// <param name="inputSpgram">An amplitude spectrogram with linear freqeuncy scale.</param>
/// <param name="freqScale">The octave frequency scale to be used.</param>
/// <returns>decibel spectrogram having octave scale.</returns>
public static double[,] ConvertAmplitudeSpectrogramToDecibelOctaveScale(double[,] inputSpgram, FrequencyScale freqScale)
public static double[,] ConvertAmplitudeSpectrogramToDecibelOctaveScale(double[,] inputSpgram, FrequencyScale freqScale, double epsilon)
{
//square the values to produce power spectrogram
var dataMatrix = MatrixTools.SquareValues(inputSpgram);

//convert spectrogram to octave scale
var newMatrix = ConvertLinearSpectrogramToOctaveFreqScale(dataMatrix, freqScale);
newMatrix = MatrixTools.Power2DeciBels(newMatrix, out var min, out var max);
newMatrix = MatrixTools.Power2DeciBels(newMatrix, epsilon, out var min, out var max);
return newMatrix;
}

Expand Down Expand Up @@ -121,7 +121,7 @@ public static FrequencyScale GetStandardOctaveScale(FrequencyScale scale)
double[,] powerSpectra = PowerSpectra(amplitudeM, windowPower, sampleRate, epsilon, freqScale);

// Convert the power values to log using: dB = 10*log(power)
var decibelSpectra = MatrixTools.Power2DeciBels(powerSpectra, out var min, out var max);
var decibelSpectra = MatrixTools.Power2DeciBels(powerSpectra, epsilon, out var min, out var max);
return decibelSpectra;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public EnergySpectrogram(AmplitudeSpectrogram amplitudeSpectrogram)
/// </summary>
public double[,] Data { get; set; }

/*
public void GetPsd(string path)
{
var psd = MatrixTools.GetColumnAverages(this.Data);
Expand All @@ -55,7 +56,7 @@ public void GetPsd(string path)
public void DrawLogPsd(string path)
{
var psd = MatrixTools.GetColumnAverages(this.Data);
var logPsd = DataTools.LogValues(psd);
var logPsd = DataTools.Log10Values(psd);
FileTools.WriteArray2File(logPsd, path + ".csv");
GraphsAndCharts.DrawGraph(logPsd, "log PSD", new FileInfo(path));
Expand All @@ -66,8 +67,9 @@ public void DrawLogPsd(string path)
public double[] GetLogPsd()
{
var psd = MatrixTools.GetColumnAverages(this.Data);
var logPsd = DataTools.LogValues(psd);
var logPsd = DataTools.Log10Values(psd);
return logPsd;
}
*/
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public SpectrogramOctaveScale(SonogramConfig config, FrequencyScale scale, WavRe
/// <param name="amplitudeM">Matrix of amplitude values.</param>
public override void Make(double[,] amplitudeM)
{
double[,] m = OctaveFreqScale.ConvertAmplitudeSpectrogramToDecibelOctaveScale(amplitudeM, this.FreqScale);
double[,] m = OctaveFreqScale.ConvertAmplitudeSpectrogramToDecibelOctaveScale(amplitudeM, this.FreqScale, this.Configuration.epsilon);

// Do noise reduction
var tuple = SNR.NoiseReduce(m, this.Configuration.NoiseReductionType, this.Configuration.NoiseReductionParameter);
Expand Down
16 changes: 11 additions & 5 deletions tests/Acoustics.Test/AudioAnalysisTools/DSP/FrequencyScaleTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -426,8 +426,9 @@ public void OctaveFrequencyScale1()
var outputImagePath = Path.Combine(outputDir.FullName, "Octave1ScaleSonogram.png");

var recording = new AudioRecording(recordingPath);
var epsilon = recording.Epsilon;

var fst = FreqScaleType.OctaveDataReduction;
var fst = FreqScaleType.OctaveCustom;
int nyquist = recording.SampleRate / 2;
int frameSize = 16384;
int linearBound = 125;
Expand All @@ -448,7 +449,7 @@ public void OctaveFrequencyScale1()
var amplitudeSpectrogram = new AmplitudeSonogram(sonoConfig, recording.WavReader);

// TODO THIS IS THE CRITICAL LINE. COULD DO WITH SEPARATE UNIT TEST
amplitudeSpectrogram.Data = OctaveFreqScale.ConvertAmplitudeSpectrogramToDecibelOctaveScale(amplitudeSpectrogram.Data, freqScale);
amplitudeSpectrogram.Data = OctaveFreqScale.ConvertAmplitudeSpectrogramToDecibelOctaveScale(amplitudeSpectrogram.Data, freqScale, epsilon);

// DO NOISE REDUCTION
var dataMatrix = SNR.NoiseReduce_Standard(amplitudeSpectrogram.Data);
Expand Down Expand Up @@ -554,7 +555,8 @@ public void OctaveFrequencyScale2()
var outputImagePath = Path.Combine(this.outputDirectory.FullName, "Octave2ScaleSonogram.png");

var recording = new AudioRecording(recordingPath);
//var fst = FreqScaleType.Linear125OctaveTones28Nyquist32000;
var epsilon = recording.Epsilon;

var fst = FreqScaleType.OctaveCustom;
int nyquist = recording.SampleRate / 2;
int frameSize = 16384;
Expand All @@ -573,7 +575,7 @@ public void OctaveFrequencyScale2()
};

var sonogram = new AmplitudeSonogram(sonoConfig, recording.WavReader);
sonogram.Data = OctaveFreqScale.ConvertAmplitudeSpectrogramToDecibelOctaveScale(sonogram.Data, freqScale);
sonogram.Data = OctaveFreqScale.ConvertAmplitudeSpectrogramToDecibelOctaveScale(sonogram.Data, freqScale, epsilon);

// DO NOISE REDUCTION
var dataMatrix = SNR.NoiseReduce_Standard(sonogram.Data);
Expand Down Expand Up @@ -746,6 +748,10 @@ public void TestFreqScaleOnArtificialSignal2()
var freqScale = new FrequencyScale(fst, nyquist, frameSize, linearBound, octaveToneCount, gridInterval);
var outputImagePath = Path.Combine(this.outputDirectory.FullName, "Signal2_OctaveFreqScale.png");
var recording = DspFilters.GenerateTestRecording(sampleRate, duration, harmonics, WaveType.Cosine);
var epsilon = recording.Epsilon;

// In this test epsilon must be zero, otherwise the Moving Average filter (see below) flattens the peaks, so that none are found.
epsilon = 0.0;

// init the default sonogram config
var sonoConfig = new SonogramConfig
Expand All @@ -757,7 +763,7 @@ public void TestFreqScaleOnArtificialSignal2()
NoiseReductionParameter = 0.0,
};
var sonogram = new AmplitudeSonogram(sonoConfig, recording.WavReader);
sonogram.Data = OctaveFreqScale.ConvertAmplitudeSpectrogramToDecibelOctaveScale(sonogram.Data, freqScale);
sonogram.Data = OctaveFreqScale.ConvertAmplitudeSpectrogramToDecibelOctaveScale(sonogram.Data, freqScale, epsilon);

// pick a row, any row
var oneSpectrum = MatrixTools.GetRow(sonogram.Data, 40);
Expand Down

0 comments on commit 2a8c3e2

Please sign in to comment.