package de.tu.darmstadt.seemoo.ansian.model; import java.util.Arrays; import de.tu.darmstadt.seemoo.ansian.tools.ArrayHelper; public class FFTSample { private int samplerate; private long centerFrequency; private int length; private int center; private float[] magnitude; private long timestamp; private GuiFFTDataAdapter fftDataAdapter; private final String LOGTAG = "FFTSample"; private boolean morseBit; public FFTSample(SamplePacket samples, float[] mag) { this.timestamp = samples.getTimestamp(); centerFrequency = samples.getFrequency(); this.samplerate = samples.getSampleRate(); this.setMagnitudes(mag); length = magnitude.length; center = length / 2; } public float[] getMagnitudes(int bandwidth) { if (bandwidth == samplerate) return Arrays.copyOfRange(magnitude, 0, length); else { // Log.d(LOGTAG,"bandwidth: "+bandwidth+"samplerate: "+samplerate); float factor = (float) bandwidth / samplerate; // Log.d(LOGTAG,"offset: "+factor); int offset = (int) (center * factor); // Log.d(LOGTAG,"offset: "+offset); return Arrays.copyOfRange(magnitude, center - offset, center + offset + 1); } } public float[] getMagnitudes() { return magnitude; } public int getSize() { return magnitude.length; } public void setMagnitudes(float[] values) { this.magnitude = values; } public long getCenterFrequency() { return centerFrequency; } public FFTDrawData getDrawData(int pixel) { if (fftDataAdapter == null) { fftDataAdapter = new GuiFFTDataAdapter(this, pixel); } return fftDataAdapter.getFftDrawData(pixel); } public long getTimestamp() { return timestamp; } public int getBandwidth() { return samplerate; } public float getAverage(int bandwidth) { float[] cutMags = getMagnitudes(bandwidth); // Log.d(LOGTAG,"cutMags: "+Arrays.toString(cutMags)); return new ArrayHelper(cutMags).getAverage(); } public float getAverage(long frequency, int bandwidth) { float[] cutMags = getMagnitudes(frequency, bandwidth); // Log.d(LOGTAG,"cutMags: "+Arrays.toString(cutMags)); return new ArrayHelper(cutMags).getAverage(); } private float[] getMagnitudes(long frequency, int bandwidth) { if (bandwidth == samplerate && frequency == centerFrequency) return Arrays.copyOfRange(magnitude, 0, length); else { float frequencyOffset = centerFrequency - frequency; float newCenter = (float) (center - length * frequencyOffset / samplerate); float factor = (float) bandwidth / samplerate; float offset = (float) (newCenter * factor); int newLow = Math.max((int) (newCenter - offset), 0); int newHigh = Math.min((int) (newCenter + offset + 1), length - 1); return Arrays.copyOfRange(magnitude, newLow, newHigh); } } public float getAverage() { return new ArrayHelper(magnitude).getAverage(); } public void setMorseBit(boolean estimateValue) { this.morseBit = estimateValue; } public boolean getMorseBit() { return morseBit; } }