Krotos Modules 3
Loading...
Searching...
No Matches
krotos::EarFilter Class Reference

#include <EarFilter.h>

Public Member Functions

 EarFilter ()
 
void configure (float sampleRate)
 
std::vector< float > processSignal (std::vector< float > &inputSignal)
 

Private Member Functions

std::vector< float > getLowPassFilterCoefficients (float normalizedFrequency, float qualityFactor)
 
std::vector< float > convertToHighPass (const std::vector< float > &lowPassCoefficients)
 
void applyIIRFilter (const std::vector< float > &inputSignal, dsp::IIR::Filter< float > &filter, std::vector< float > &filteredSignal)
 
void applyFIRFilter (const std::vector< float > &inputSignal, const std::vector< float > &coefficients, std::vector< float > &filteredSignal)
 
void calculateTransferFunction (const std::vector< float > b, const std::vector< float > a, int numPoints)
 
std::vector< float > elementWiseDivision (const std::vector< float > &vector1, const std::vector< float > &vector2)
 
std::vector< float > fir2 (int N, std::vector< float > &freqResponse, const std::vector< float > &gain)
 
std::vector< float > linspace (float start, float end, int numPoints)
 

Private Attributes

float m_sampleRate {-1.0f}
 
const float m_maxFreq {20000.0f}
 
float m_hopSizeSec = 0.0058f
 
float m_hopSizeSamples
 
float m_fc = 680.0f
 
float m_q = 0.65f
 
std::vector< float > m_magResponse
 
std::vector< float > m_normalisedFreqs
 
std::vector< float > m_freqResponse
 
std::vector< float > m_a
 
std::vector< float > m_b
 
dsp::IIR::Filter< float > m_filter
 
std::vector< float > m_gain
 
int N = 50
 
std::vector< float > m_firCoeffb
 
std::vector< float > m_freqs
 
std::vector< float > m_gains
 

Constructor & Destructor Documentation

◆ EarFilter()

krotos::EarFilter::EarFilter ( )

Constructor

Member Function Documentation

◆ applyFIRFilter()

void krotos::EarFilter::applyFIRFilter ( const std::vector< float > & inputSignal,
const std::vector< float > & coefficients,
std::vector< float > & filteredSignal )
private

Filters the inputSignal using an FIR filter operation, one sample at a time. TODO:: optimise to handle whole block by using SIMD optimisation from JUCE.

Parameters
inputSignalthe input signal in vector form
coefficientsthe FIR filter coefficients
filteredSignalan empty vector initially, contains the filtered afterwards. TODO:: rewrite to operate directly on input
Returns
a vector containing the numerator of the highpass IIR filter coefficients

◆ applyIIRFilter()

void krotos::EarFilter::applyIIRFilter ( const std::vector< float > & inputSignal,
dsp::IIR::Filter< float > & filter,
std::vector< float > & filteredSignal )
private

Filters the inputSignal using an IIR filter and filtering one sample at a time. TODO:: optimize to handle whole block by using SIMD optimisation from JUCE.

Parameters
inputSignalthe input signal in vector form
filterthe IIR filter object performing the filtering
filteredSignalan empty vector initially, contains the filtered afterwards. TODO:: rewrite to operate directly on input
Returns
a vector containing the numerator of the highpass IIR filter coefficients

◆ calculateTransferFunction()

void krotos::EarFilter::calculateTransferFunction ( const std::vector< float > b,
const std::vector< float > a,
int numPoints )
private

Calculates the transfer function of a filter with coefficients a,b at numPoints.(The equivalent of MATLABs freqz function)

Parameters
bvector containing the numerator coefficients of the filter
avector containing the denominator coefficients of the filter
numPointsthe number of frequencies to calculate on

◆ configure()

void krotos::EarFilter::configure ( float sampleRate)

Configures the filter

Parameters
ratethe audio sampling rate

◆ convertToHighPass()

std::vector< float > krotos::EarFilter::convertToHighPass ( const std::vector< float > & lowPassCoefficients)
private

Calculates the IIR highpass filter coefficients from the lowPass denominator coefficients

Parameters
lowPassCoefficientsthe vector containing the lowPass Filter coefficients
Returns
a vector containing the numerator of the highpass IIR filter coefficients

◆ elementWiseDivision()

std::vector< float > krotos::EarFilter::elementWiseDivision ( const std::vector< float > & vector1,
const std::vector< float > & vector2 )
private

Performs element wise division between two vectors

Parameters
vector1numerator
vector2denominator
Returns
a vector containing the result of the operation

◆ fir2()

std::vector< float > krotos::EarFilter::fir2 ( int N,
std::vector< float > & freqResponse,
const std::vector< float > & gain )
private

FIR arbitrary shape filter design using the frequency sampling method. Designs an Nth order linear phase FIR digital filter, with the frequency response specified by vectors freqResponse and gain and returns the filter coefficients in length N+1 vector. (The equivalent of MATLABs fir2.)

Parameters
Norder of the filter
freqResponsefrequency response we want the FIR filter to have
gaingain factor of each freq
Returns
a vector containing the filter coefficients

◆ getLowPassFilterCoefficients()

std::vector< float > krotos::EarFilter::getLowPassFilterCoefficients ( float normalizedFrequency,
float qualityFactor )
private

Calculates the coefficients of an IIR Lowpass filter, with specific cutoff frequency, and quality factor.

Parameters
normalizedFrequencycutoff in Hz normalized by division with sampleRate
qualityFactorthe filters quality factor
Returns
a vector containing the denominator filter coefficients

◆ linspace()

std::vector< float > krotos::EarFilter::linspace ( float start,
float end,
int numPoints )
inlineprivate

Equivalent of MATLABs linspace.

◆ processSignal()

std::vector< float > krotos::EarFilter::processSignal ( std::vector< float > & inputSignal)

Filter the whole signal

Parameters
xthe sample to filter
Returns
the filtered sample

Member Data Documentation

◆ m_a

std::vector<float> krotos::EarFilter::m_a
private

◆ m_b

std::vector<float> krotos::EarFilter::m_b
private

◆ m_fc

float krotos::EarFilter::m_fc = 680.0f
private

◆ m_filter

dsp::IIR::Filter<float> krotos::EarFilter::m_filter
private

◆ m_firCoeffb

std::vector<float> krotos::EarFilter::m_firCoeffb
private

◆ m_freqResponse

std::vector<float> krotos::EarFilter::m_freqResponse
private

◆ m_freqs

std::vector<float> krotos::EarFilter::m_freqs
private
Initial value:
= {0.0f,
100.0f,
150.0f, 200.0f, 300.0f, 400.0f, 500.0f, 700.0f, 1000.0f,
1500.0f, 2000.0f, 2500.0f, 3000.0f, 3500.0f, 4000.0f, 4500.0f,
5000.0f, 6000.0f, 7000.0f, 8000.0f, 9000.0f, 10000.0f, 20000.0f}

◆ m_gain

std::vector<float> krotos::EarFilter::m_gain
private

◆ m_gains

std::vector<float> krotos::EarFilter::m_gains
private
Initial value:
= {std::numeric_limits<float>::epsilon(),
0.0363078054770101f,
0.102329299228075f,
0.192752491319094f,
0.407380277804113f,
0.645654229034656f,
0.812830516164099f,
0.944060876285923f,
1.0f,
1.14815362149688f,
1.44543977074593f,
1.86208713666287f,
2.26464430759306f,
2.54097270554930f,
2.54097270554930f,
2.29086765276777f,
1.81970085860998f,
0.954992586021436f,
0.462381021399260f,
0.278612116862977f,
0.229086765276777f,
0.245470891568503f,
0.245470891568503f}

◆ m_hopSizeSamples

float krotos::EarFilter::m_hopSizeSamples
private

◆ m_hopSizeSec

float krotos::EarFilter::m_hopSizeSec = 0.0058f
private

◆ m_magResponse

std::vector<float> krotos::EarFilter::m_magResponse
private

◆ m_maxFreq

const float krotos::EarFilter::m_maxFreq {20000.0f}
private

◆ m_normalisedFreqs

std::vector<float> krotos::EarFilter::m_normalisedFreqs
private

◆ m_q

float krotos::EarFilter::m_q = 0.65f
private

◆ m_sampleRate

float krotos::EarFilter::m_sampleRate {-1.0f}
private

◆ N

int krotos::EarFilter::N = 50
private

The documentation for this class was generated from the following files: