public static List<float[]> deconvol(float[] signal, int fs, int fenetre, int n0) { int nbfram = signal.length; int frameparfenetre = Math.round(fs * (float) fenetre / 1000); int recoupframe = Math.round(frameparfenetre / 2); float[] hamming = new float[frameparfenetre]; for (int i = 0; i < frameparfenetre; i++) { hamming[i] = (float) (0.54 - 0.46 * Math.cos(2 * Math.PI * i / (frameparfenetre - 1))); } int fftsize = (int) Math.pow(2, Math.ceil(log2(frameparfenetre))); List<float[]> result = new ArrayList<>(); int end = nbfram - frameparfenetre; for (int i = 0; i < end; i += frameparfenetre - recoupframe) { int to = Math.min(i + frameparfenetre - 1, end); float[] sfen = new float[to - i + 1]; System.arraycopy(signal, i, sfen, 0, sfen.length); sfen = accentue(sfen); for (int j = 0; j < sfen.length; j++) { sfen[j] = sfen[j] * hamming[j]; } FloatFFT_1D fft = new FloatFFT_1D(sfen.length); fft.realForward(sfen); for (int j = 0; j < sfen.length; j++) { sfen[j] = (float) Math.log(Math.abs(sfen[j])); } fft.realInverse(sfen, true); Arrays.fill(sfen, n0 + 1, sfen.length - 1, 0); fft.realForward(sfen); for (int j = 0; j < sfen.length; j++) { sfen[j] = (float) Math.abs(Math.exp(sfen[j])); } result.add(Arrays.copyOfRange(sfen, 2, Math.round(fftsize / 2) - 1)); } return result; }
private void calculate() { float[] samples = getSamples(); Window.apply(mWindow, samples); if (mSampleType == SampleType.REAL) { mFFT.realForward(samples); } else { mFFT.complexForward(samples); } dispatch(samples); }
private void processRecordedData() { mIsProcessing = true; float[] recordedDataFFT; recordedDataFFT = FrequencyDetector.convertToFloats(mRecordedData); fft.realForward(recordedDataFFT); float[] halfAbsFFT; halfAbsFFT = FrequencyDetector.absAndHalve(recordedDataFFT); int[] peaks; peaks = FrequencyDetector.identifyPeaksAndRemove(halfAbsFFT); String peakString = ""; for (int e : peaks) peakString += e + " "; Log.d(TAG, peakString); int frequency = FrequencyDetector.detectFrequency(peaks); if (frequency != -1) this.updateStrings(frequency); mIsProcessing = false; }