package de.tu.darmstadt.seemoo.ansian.model.demodulation; import de.tu.darmstadt.seemoo.ansian.model.SamplePacket; public class AM extends Demodulation { private float lastMax = 0; public AM() { MIN_USER_FILTER_WIDTH = 3000; MAX_USER_FILTER_WIDTH = 15000; } /** * Will AM demodulate the samples in input. Demodulated samples are stored * in the real array of output. Note: All samples in output will always be * overwritten! * * @param input * incoming (modulated) samples * @param output * outgoing (demodulated) samples */ @Override public void demodulate(SamplePacket input, SamplePacket output) { float[] reIn = input.getRe(); float[] imIn = input.getIm(); float[] reOut = output.getRe(); float avg = 0; lastMax *= 0.95; // simplest AGC // Complex to magnitude for (int i = 0; i < input.size(); i++) { reOut[i] = (reIn[i] * reIn[i] + imIn[i] * imIn[i]); avg += reOut[i]; if (reOut[i] > lastMax) lastMax = reOut[i]; } avg = avg / input.size(); // normalize values: float gain = 0.75f / lastMax; for (int i = 0; i < output.size(); i++) reOut[i] = (reOut[i] - avg) * gain; output.setSize(input.size()); output.setSampleRate(quadratureRate); } @Override public DemoType getType() { return DemoType.AM; } }