How to implement low pass filter using java

前端 未结 7 1885
野趣味
野趣味 2020-11-29 23:53

I am trying to implement a low pass filter in Java. My requirement is very simple,I have to eliminate signals beyond a particular frequency (Single dimension). Looks like Bu

7条回答
  •  青春惊慌失措
    2020-11-30 00:28

    Here is a lowpass filter that uses a fourier transform in the apache math library.

        public double[] fourierLowPassFilter(double[] data, double lowPass, double frequency){
        //data: input data, must be spaced equally in time.
        //lowPass: The cutoff frequency at which 
        //frequency: The frequency of the input data.
    
        //The apache Fft (Fast Fourier Transform) accepts arrays that are powers of 2.
        int minPowerOf2 = 1;
        while(minPowerOf2 < data.length)
            minPowerOf2 = 2 * minPowerOf2;
    
        //pad with zeros
        double[] padded = new double[minPowerOf2];
        for(int i = 0; i < data.length; i++)
            padded[i] = data[i];
    
    
        FastFourierTransformer transformer = new FastFourierTransformer(DftNormalization.STANDARD);
        Complex[] fourierTransform = transformer.transform(padded, TransformType.FORWARD);
    
        //build the frequency domain array
        double[] frequencyDomain = new double[fourierTransform.length];
        for(int i = 0; i < frequencyDomain.length; i++)
            frequencyDomain[i] = frequency * i / (double)fourierTransform.length;
    
        //build the classifier array, 2s are kept and 0s do not pass the filter
        double[] keepPoints = new double[frequencyDomain.length];
        keepPoints[0] = 1; 
        for(int i = 1; i < frequencyDomain.length; i++){
            if(frequencyDomain[i] < lowPass)
                keepPoints[i] = 2;
            else
                keepPoints[i] = 0;
        }
    
        //filter the fft
        for(int i = 0; i < fourierTransform.length; i++)
            fourierTransform[i] = fourierTransform[i].multiply((double)keepPoints[i]);
    
        //invert back to time domain
        Complex[] reverseFourier = transformer.transform(fourierTransform, TransformType.INVERSE);
    
        //get the real part of the reverse 
        double[] result = new double[data.length];
        for(int i = 0; i< result.length; i++){
            result[i] = reverseFourier[i].getReal();
        }
    
        return result;
    }
    

提交回复
热议问题