/* For Copyright and License see LICENSE.txt and COPYING.txt in the root directory */
package com.nerdscentral.audio.volume;
import com.nerdscentral.audio.core.SFData;
import com.nerdscentral.audio.core.SFSignal;
import com.nerdscentral.sython.Caster;
import com.nerdscentral.sython.SFMaths;
import com.nerdscentral.sython.SFPL_Operator;
import com.nerdscentral.sython.SFPL_RuntimeException;
public class SF_Clean implements SFPL_Operator
{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public Object Interpret(final Object input) throws SFPL_RuntimeException
{
SFSignal sig = Caster.makeSFSignal(input);
SFSignal dataIn = SFData.realise(sig);
SFSignal dataOut = dataIn.replicateEmpty();
decimateFilter(dataIn, dataOut);
return dataOut;
}
public static double decimateFilter(SFSignal dataIn, SFSignal dataOut)
{
// Decimate
Decimator d0 = new Decimator();
Decimator d1 = new Decimator();
int length = dataIn.getLength();
int offset = -9;
double max = 0;
for (int index = 0; index < length + 9; index += 2)
{
double x1, x2, ip1Data = 0;
int ip1 = index + 1;
if (ip1 < length)
{
ip1Data = dataIn.getSample(ip1);
x1 = d0.Calc(dataIn.getSample(index), ip1Data);
}
else
{
if (index < length)
{
x1 = d0.Calc(dataIn.getSample(index), 0);
}
else
{
x1 = d0.Calc(0, 0);
}
}
int ip2 = ip1 + 1;
if (ip2 < length)
{
x2 = d1.Calc(ip1Data, dataIn.getSample(ip2));
}
else
{
if (ip1 < length)
{
x2 = d1.Calc(ip1Data, 0);
}
else
{
x2 = d1.Calc(0, 0);
}
}
if (offset >= 1)
{
dataOut.setSample(offset, x1);
x1 = dataOut.getSample(offset);
x1 = SFMaths.abs(x1);
if (x1 > max)
{
max = x1;
}
int index2 = offset + 1;
if (index2 < length)
{
dataOut.setSample(index2, x2);
x2 = dataOut.getSample(index2);
x2 = SFMaths.abs(x2);
if (x2 > max)
{
max = x2;
}
}
}
offset += 2;
}
return max;
}
@Override
public String Word()
{
return Messages.getString("SF_Clean.0"); //$NON-NLS-1$
}
}