package com.musicg.wave; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; import com.musicg.api.WhistleApi; public class WaveTypeDetector { private Wave wave; public WaveTypeDetector(Wave wave) { this.wave = wave; } public double getWhistleProbability() { double probability = 0; WaveHeader wavHeader = wave.getWaveHeader(); // fft size 1024, no overlap int fftSampleSize = 1024; int fftSignalByteLength = fftSampleSize * wavHeader.getBitsPerSample() / 8; byte[] audioBytes = wave.getBytes(); ByteArrayInputStream inputStream = new ByteArrayInputStream(audioBytes); WhistleApi whistleApi = new WhistleApi(wavHeader); // read the byte signals try { int numFrames = inputStream.available() / fftSignalByteLength; byte[] bytes = new byte[fftSignalByteLength]; int checkLength = 3; int passScore = 3; ArrayList<Boolean> bufferList = new ArrayList<Boolean>(); int numWhistles = 0; int numPasses = 0; // first 10(checkLength) frames for (int frameNumber = 0; frameNumber < checkLength; frameNumber++) { inputStream.read(bytes); boolean isWhistle = whistleApi.isWhistle(bytes); bufferList.add(isWhistle); if (isWhistle) { numWhistles++; } if (numWhistles >= passScore) { numPasses++; } // System.out.println(frameNumber+": "+numWhistles); } // other frames for (int frameNumber = checkLength; frameNumber < numFrames; frameNumber++) { inputStream.read(bytes); boolean isWhistle = whistleApi.isWhistle(bytes); if (bufferList.get(0)) { numWhistles--; } bufferList.remove(0); bufferList.add(isWhistle); if (isWhistle) { numWhistles++; } if (numWhistles >= passScore) { numPasses++; } // System.out.println(frameNumber+": "+numWhistles); } probability = (double) numPasses / numFrames; } catch (IOException e) { e.printStackTrace(); } return probability; } }