view FIRFilter.cpp @ 4:597f033fa7a2

* Some cleaning and rearranging to prepare for band processing implementation
author Carl Bussey <c.bussey@se10.qmul.ac.uk>
date Tue, 05 Aug 2014 15:56:59 +0100
parents 31d2a7e07786
children 21147df9cb2d
line wrap: on
line source
//
//  FIRFilter.cpp
//  Tempogram
//
//  Created by Carl Bussey on 25/06/2014.
//  Copyright (c) 2014 Carl Bussey. All rights reserved.
//

#include "FIRFilter.h"
#include <cmath>
#include <vamp-sdk/FFT.h>
#include <assert.h>
#include <iostream>
using namespace std;

using Vamp::FFT;

FIRFilter::FIRFilter(const unsigned int lengthInput, const unsigned int numberOfCoefficients) :
    _lengthInput(lengthInput),
    _numberOfCoefficients(numberOfCoefficients),
    fftInput(NULL),
    fftCoefficients(NULL),
    fftReal1(NULL),
    fftImag1(NULL),
    fftReal2(NULL),
    fftImag2(NULL),
    fftFilteredReal(NULL),
    fftFilteredImag(NULL),
    fftOutputReal(NULL),
    fftOutputImag(NULL)
{
    initialise();
}

FIRFilter::~FIRFilter()
{
    cleanup();
}

void
FIRFilter::initialise()
{
    _lengthFIRFFT = pow(2,(ceil(log2(_lengthInput+_numberOfCoefficients-1))));
    
    fftInput = new double[_lengthFIRFFT];
    fftCoefficients = new double[_lengthFIRFFT];
    fftReal1 = new double[_lengthFIRFFT];
    fftImag1 = new double[_lengthFIRFFT];
    fftReal2 = new double[_lengthFIRFFT];
    fftImag2 = new double[_lengthFIRFFT];
    fftFilteredReal = new double[_lengthFIRFFT];
    fftFilteredImag = new double[_lengthFIRFFT];
    fftOutputReal = new double[_lengthFIRFFT];
    fftOutputImag = new double[_lengthFIRFFT];
    
    for(int i = 0; i < _lengthFIRFFT; i++){
        fftInput[i] = fftCoefficients[i] = fftReal1[i] = fftImag1[i] = fftReal2[i] = fftImag2[i] = fftFilteredReal[i] = fftFilteredImag[i] = fftOutputReal[i] = fftOutputImag[i] = 0.0;
    }
}

void
FIRFilter::process(const float* input, const float* coefficients, float* output)
{
    float max = 0;
    for(int i = 0; i < _lengthInput; i++){
        fftInput[i] = input[i];
        max = max > fftInput[i] ? max : fftInput[i];
        //cout << fftInput[i] << endl;
    }
    //cout << max << endl;
    for(int i = 0; i < _numberOfCoefficients; i++){
        fftCoefficients[i] = coefficients[i];
        //cout << fftCoefficients[i] << endl;
    }
    
    FFT::forward(_lengthFIRFFT, fftInput, NULL, fftReal1, fftImag1);
    FFT::forward(_lengthFIRFFT, fftCoefficients, NULL, fftReal2, fftImag2);
    for (int i = 0; i < _lengthFIRFFT; i++){
        fftFilteredReal[i] = (fftReal1[i] * fftReal2[i]) - (fftImag1[i] * fftImag2[i]);
        fftFilteredImag[i] = (fftReal1[i] * fftImag2[i]) + (fftReal2[i] * fftImag1[i]);
    }
    FFT::inverse(_lengthFIRFFT, fftFilteredReal, fftFilteredImag, fftOutputReal, fftOutputImag);
    
    max = 0;
    for(int i = 0; i < _lengthInput; i++){
        output[i] = fftOutputReal[i];
        max = max > output[i] ? max : output[i];
    }
}

void
FIRFilter::cleanup()
{
    delete []fftInput;
    fftInput = NULL;
    delete []fftCoefficients;
    fftCoefficients = NULL;
    delete []fftReal1;
    fftReal1 = NULL;
    delete []fftImag1;
    fftImag1 = NULL;
    delete []fftReal2;
    fftReal2 = NULL;
    delete []fftImag2;
    fftImag2 = NULL;
    delete []fftFilteredReal;
    fftFilteredReal = NULL;
    delete []fftFilteredImag;
    fftFilteredImag = NULL;
    delete []fftOutputReal;
    fftOutputReal = NULL;
    delete []fftOutputImag;
    fftOutputImag = NULL;
}