/* For Copyright and License see LICENSE.txt and COPYING.txt in the root directory */ package com.nerdscentral.audio.pitch; import java.util.List; import com.nerdscentral.audio.core.SFSignal; import com.nerdscentral.audio.pitch.algorithm.SFFilterGenerator; public class SFNPoleFilterOperator { protected static void filterLoop(SFSignal x, SFSignal y, List<SFFilterGenerator.NPoleFilterDefListNode> fds) { int poles = fds.get(0).getDefinition().getPoles(); double[] xv = new double[poles + 1]; double[] yv = new double[poles + 1]; SFFilterGenerator.NPoleFilterDefListNode fdl = fds.get(0); SFFilterGenerator.NPoleFilterDef fd = fdl.getDefinition(); int pos = 0; double gain = fd.getGainfc(); for (int n = 0; n < x.getLength(); ++n) { if (fdl.getPosition() == n) { ++pos; if (pos < fds.size()) { fdl = fds.get(pos); fd = fdl.getDefinition(); gain = fd.getGainfc(); } } for (int i = 0; i < poles; ++i) { xv[i] = xv[i + 1]; yv[i] = yv[i + 1]; } xv[fd.getPoles()] = x.getSample(n) / gain; double q = 0; for (int index = 0; index < xv.length; ++index) { q += xv[index] * fd.getXCeof(index); if (index < fd.getPoles()) { q += yv[index] * fd.getYCeof(index); } } yv[fd.getPoles()] = q; y.setSample(n, q); } } protected static void filterLoop(SFSignal x, SFSignal y, SFFilterGenerator.NPoleFilterDef fd, double gain) { double[] xv = new double[fd.getPoles() + 1]; double[] yv = new double[fd.getPoles() + 1]; for (int n = 0; n < x.getLength(); ++n) { for (int i = 0; i < fd.getPoles(); ++i) { xv[i] = xv[i + 1]; yv[i] = yv[i + 1]; } xv[fd.getPoles()] = x.getSample(n) / gain; double q = 0; for (int index = 0; index < xv.length; ++index) { q += xv[index] * fd.getXCeof(index); if (index < fd.getPoles()) { q += yv[index] * fd.getYCeof(index); } } yv[fd.getPoles()] = q; y.setSample(n, q); } } public SFNPoleFilterOperator() { super(); } }