package org.jcodec.audio;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* Low pass filter based on windowed sinc function
*
* Simplest possible low pass filter
*
* BW = 4 / kernelSize
*
* BW - width of transition band measured in fraction of sampling rate
*
* So for kernelSize = 20, and sampling rate 48000, BW = 9600 Hz ( pretty huge )
*
* @author The JCodec project
*
*/
public class SincLowPassFilter extends ConvolutionFilter {
private int kernelSize;
private double cutoffFreq;
public static SincLowPassFilter createSincLowPassFilter(double cutoffFreq) {
return new SincLowPassFilter(40, cutoffFreq);
}
public static SincLowPassFilter createSincLowPassFilter2(int cutoffFreq, int samplingRate) {
return new SincLowPassFilter(40, (double) cutoffFreq / samplingRate);
}
public SincLowPassFilter(int kernelSize, double cutoffFreq) {
this.kernelSize = kernelSize;
this.cutoffFreq = cutoffFreq;
}
@Override
protected double[] buildKernel() {
double[] kernel = new double[kernelSize];
double sum = 0;
for (int i = 0; i < kernelSize; i++) {
int a = i - kernelSize / 2;
if (a != 0)
// kernel[i] = (Math.sin(2 * Math.PI * cutoffFreq * a) / a)
// * (0.42 - 0.5 * Math.cos(2 * Math.PI / kernelSize) + 0.08 *
// Math.cos(4 * Math.PI / kernelSize));
kernel[i] = Math.sin(2 * Math.PI * cutoffFreq * (i - kernelSize / 2)) / (i - kernelSize / 2)
* (0.54 - 0.46 * Math.cos(2 * Math.PI * i / kernelSize));
else
kernel[i] = 2 * Math.PI * cutoffFreq;
sum += kernel[i];
}
for (int i = 0; i < kernelSize; i++)
kernel[i] /= sum;
return kernel;
}
}