diff --git a/AudioProcessing/src/main/java/org/wyrez/audio/AudioProcessor.java b/AudioProcessing/src/main/java/org/wyrez/audio/AudioProcessor.java index 9438532..5b76ed2 100644 --- a/AudioProcessing/src/main/java/org/wyrez/audio/AudioProcessor.java +++ b/AudioProcessing/src/main/java/org/wyrez/audio/AudioProcessor.java @@ -26,24 +26,26 @@ import java.util.List; import org.wyrez.audio.analysis.FFT; import org.wyrez.audio.decoder.Decoder; import org.wyrez.audio.util.Band; +import org.wyrez.audio.util.SampleBuffer; import org.wyrez.audio.util.SampleHelper; /** - * Processor to create analysis-data of audio samples - * + *Processor to create analysis-data of audio samples + * * @author Darth Affe */ public class AudioProcessor { private Band band; private int bufferSize; - private final float[] samples; + private SampleBuffer sampleBuffer; + private float[] spectrum; private float[] spectralFlux; private float[] threshold; private float[] prunedSpectralFlux; private float[] peaks; private float peakAverage; - private final float samplingRate; + private float samplingRate; private float bpm; /** @@ -52,8 +54,7 @@ public class AudioProcessor { * @param decoder The decoder to process */ public AudioProcessor(Decoder decoder) { - this.samples = SampleHelper.readAllSamples(decoder); - this.samplingRate = decoder.getSamplingRate(); + this(SampleHelper.createSampleBuffer(decoder)); } /** @@ -64,8 +65,16 @@ public class AudioProcessor { * @param band The band to process */ public AudioProcessor(Decoder decoder, Band band) { - this.samples = SampleHelper.readAllSamples(decoder); - this.samplingRate = decoder.getSamplingRate(); + this(SampleHelper.createSampleBuffer(decoder), band); + } + + public AudioProcessor(SampleBuffer sampleBuffer) { + this(sampleBuffer, null); + } + + public AudioProcessor(SampleBuffer sampleBuffer, Band band) { + this.sampleBuffer = sampleBuffer; + this.samplingRate = sampleBuffer.samplingRate; this.band = band; } @@ -73,6 +82,7 @@ public class AudioProcessor { * Removes cached objects to save some memory. */ public void clean() { + spectrum = null; spectralFlux = null; threshold = null; prunedSpectralFlux = null; @@ -170,24 +180,27 @@ public class AudioProcessor { FFT fft = new FFT(bufferSize, samplingRate); fft.window(FFT.HAMMING); float[] buffer; - float[] spectrum = new float[fft.getBandSize(band)]; - float[] lastSpectrum = new float[spectrum.length]; + float[] spectrumBuffer = new float[fft.getBandSize(band)]; + float[] lastSpectrumBuffer = new float[spectrumBuffer.length]; + List spectrum = new ArrayList(); List spectralFlux = new ArrayList(); - for (int i = 0; i < samples.length; i += bufferSize) { - buffer = SampleHelper.splitSampleArray(samples, i, bufferSize); + for (int i = 0; i < sampleBuffer.samples.length; i += bufferSize) { + buffer = SampleHelper.splitSampleArray(sampleBuffer.samples, i, bufferSize); fft.forward(buffer); - System.arraycopy(spectrum, 0, lastSpectrum, 0, spectrum.length); - System.arraycopy(fft.getSpectrum(band), 0, spectrum, 0, spectrum.length); + System.arraycopy(spectrumBuffer, 0, lastSpectrumBuffer, 0, spectrumBuffer.length); + System.arraycopy(fft.getSpectrum(band), 0, spectrumBuffer, 0, spectrumBuffer.length); float flux = 0; - for (int j = 0; j < spectrum.length; j++) { - float value = (spectrum[j] - lastSpectrum[j]); + for (int j = 0; j < spectrumBuffer.length; j++) { + spectrum.add(spectrumBuffer[j]); + float value = (spectrumBuffer[j] - lastSpectrumBuffer[j]); flux += value < 0 ? 0 : value; } spectralFlux.add(flux); } this.spectralFlux = SampleHelper.convertToFloatArray(spectralFlux); + this.spectrum = SampleHelper.convertToFloatArray(spectrum); } private void calculateThreshold(int thresholdWindowSize, float multiplier) { @@ -320,10 +333,19 @@ public class AudioProcessor { /** * Returns the samples which are analysed. * - * @returns A float array containing the samples + * @returns A SampleBuffer containing the samples */ - public float[] getSamples() { - return samples; + public SampleBuffer getSampleBuffer() { + return sampleBuffer; + } + + /** + * Returns the last calculated fft-spectrum. + * + * @returns A float array containing the spectrum data + */ + public float[] getSpectrum() { + return spectrum; } /** diff --git a/AudioProcessing/src/main/java/org/wyrez/audio/util/SampleBuffer.java b/AudioProcessing/src/main/java/org/wyrez/audio/util/SampleBuffer.java new file mode 100644 index 0000000..f1007e0 --- /dev/null +++ b/AudioProcessing/src/main/java/org/wyrez/audio/util/SampleBuffer.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2013 Darth Affe and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.wyrez.audio.util; + +/** + * + * @author Darth Affe + */ +public class SampleBuffer { + + public final float[] samples; + public final float samplingRate; + + public SampleBuffer(float[] samples, float samplingRate) { + this.samples = samples; + this.samplingRate = samplingRate; + } +} diff --git a/AudioProcessing/src/main/java/org/wyrez/audio/util/SampleHelper.java b/AudioProcessing/src/main/java/org/wyrez/audio/util/SampleHelper.java index 852514e..eb06f8e 100644 --- a/AudioProcessing/src/main/java/org/wyrez/audio/util/SampleHelper.java +++ b/AudioProcessing/src/main/java/org/wyrez/audio/util/SampleHelper.java @@ -97,4 +97,14 @@ public class SampleHelper { } return convertToFloatArray(samples); } + + /** + * Creates a SampleBuffer from the data provided by the given decoder. + * + * @param deocder The decoder to read from + * @returns The new SampleBuffer + */ + public static SampleBuffer createSampleBuffer(Decoder decoder) { + return new SampleBuffer(readAllSamples(decoder), decoder.getSamplingRate()); + } }