package edu.sc.seis.sod.process.waveform; import org.w3c.dom.Element; import com.oregondsp.signalProcessing.filter.iir.PassbandType; import edu.iris.Fissures.IfSeismogramDC.RequestFilter; import edu.iris.Fissures.model.QuantityImpl; import edu.iris.Fissures.model.UnitImpl; import edu.iris.Fissures.network.ChannelImpl; import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl; import edu.sc.seis.fissuresUtil.cache.CacheEvent; import edu.sc.seis.sod.CookieJar; import edu.sc.seis.sod.SodUtil; import edu.sc.seis.sod.status.StringTreeBranch; public class Upsample implements WaveformProcess { public Upsample(int factor) { upsample = new edu.sc.seis.fissuresUtil.bag.Upsample(factor); } public Upsample(Element config) { this.config = config; if (SodUtil.getElement(config, ANTIALIAS_NAME) != null) { antiAlias = true; } if (SodUtil.getElement(config, TOSPS_NAME) != null) { toSampleRate = Float.parseFloat(SodUtil.loadText(config, TOSPS_NAME, "not used")); } else if (SodUtil.getElement(config, FACTOR_NAME) != null) { upsample = new edu.sc.seis.fissuresUtil.bag.Upsample(Integer.parseInt(SodUtil.getNestedText(SodUtil.getElement(config, FACTOR_NAME)))); } } public boolean isThreadSafe() { return true; } public WaveformResult accept(CacheEvent event, ChannelImpl channel, RequestFilter[] original, RequestFilter[] available, LocalSeismogramImpl[] seismograms, CookieJar cookieJar) throws Exception { LocalSeismogramImpl[] out = new LocalSeismogramImpl[seismograms.length]; LocalSeismogramImpl[] filteredSeis = seismograms; if (seismograms.length != 0) { edu.sc.seis.fissuresUtil.bag.Upsample u = upsample; if (u == null) { u = new edu.sc.seis.fissuresUtil.bag.Upsample((int)Math.floor(seismograms[0].getSampling() .getFrequency() .getValue(UnitImpl.HERTZ) / toSampleRate)); } for (int i = 0; i < out.length; i++) { out[i] = u.apply(filteredSeis[i]); } if (antiAlias) { antiAliasFilter = new OregonDSPFilter(SodUtil.getElement(config, ANTIALIAS_NAME), PassbandType.LOWPASS, ZERO, seismograms[0].getSampling() .getFrequency() .divideBy(2*u.getFactor())); // nyquist is 1/2 sample rate WaveformResult filtered = antiAliasFilter.apply(seismograms); if (! filtered.isSuccess()) { return new WaveformResult(seismograms, new StringTreeBranch(this, false, filtered.getReason())); } filteredSeis = filtered.getSeismograms(); } } return new WaveformResult(true, out, this); } Element config; boolean antiAlias = true; float toSampleRate; OregonDSPFilter antiAliasFilter; edu.sc.seis.fissuresUtil.bag.Upsample upsample; public static final String TOSPS_NAME = "minSamplesPerSec"; public static final String FACTOR_NAME = "byFactor"; public static final String ANTIALIAS_NAME = "antiAliasFilter"; private static final QuantityImpl ZERO = new QuantityImpl(0, UnitImpl.HERTZ); }