lbajardsilogic@223: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@223: lbajardsilogic@223: /* Sound Access lbajardsilogic@223: EASAIER client application. lbajardsilogic@223: Silogic 2007. Laure Bajard. lbajardsilogic@223: lbajardsilogic@223: Integration of the filter provided by: lbajardsilogic@223: Dublin Institute of Technology - Audio Research Group 2007 lbajardsilogic@223: www.audioresearchgroup.com lbajardsilogic@223: Author: Dan Barry lbajardsilogic@223: lbajardsilogic@223: This program is free software; you can redistribute it and/or lbajardsilogic@223: modify it under the terms of the GNU General Public License as lbajardsilogic@223: published by the Free Software Foundation; either version 2 of the lbajardsilogic@223: License, or (at your option) any later version. See the file lbajardsilogic@223: COPYING included with this distribution for more information. lbajardsilogic@223: */ lbajardsilogic@223: lbajardsilogic@223: #include lbajardsilogic@223: #include lbajardsilogic@223: lbajardsilogic@223: #include "EqualizerFilter.h" lbajardsilogic@223: lbajardsilogic@223: #include "FFTReal.h" lbajardsilogic@223: #include "DSP.h" lbajardsilogic@223: lbajardsilogic@223: #include "system/System.h" lbajardsilogic@223: #include "main/MainWindow.h" lbajardsilogic@223: lbajardsilogic@229: lbajardsilogic@232: EqualizerFilter::EqualizerFilter(size_t framesize, QMutex *mutex) : PropertyContainer() , lbajardsilogic@235: m_simpleMode(true) , lbajardsilogic@232: m_nbBand(5), lbajardsilogic@232: m_framesize(framesize), lbajardsilogic@232: m_mutex(mutex), lbajardsilogic@232: m_resolution(400) lbajardsilogic@223: { lbajardsilogic@232: for (int i=0; ilock(); lbajardsilogic@235: if (m_simpleMode) lbajardsilogic@235: { lbajardsilogic@235: create_filterbands(); lbajardsilogic@235: } lbajardsilogic@235: else lbajardsilogic@235: { lbajardsilogic@241: for(int i = 0 ; i < m_resolution ; i++){ lbajardsilogic@241: m_eqcurve.push_back(0); lbajardsilogic@235: } lbajardsilogic@235: } benoitrigolleau@240: m_mutex->unlock(); lbajardsilogic@235: lbajardsilogic@229: setFilterEnabled(false); lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: EqualizerFilter::~EqualizerFilter() lbajardsilogic@229: { lbajardsilogic@229: m_eqcurve.clear(); lbajardsilogic@241: lbajardsilogic@232: for(int i = 0 ; i < m_nbBand ; i++){ lbajardsilogic@232: delete band[i]; lbajardsilogic@232: } lbajardsilogic@232: delete band; lbajardsilogic@241: band = 0; lbajardsilogic@241: lbajardsilogic@241: delete m_plotbandcurve; lbajardsilogic@241: m_plotbandcurve = 0; lbajardsilogic@229: } lbajardsilogic@223: lbajardsilogic@223: EqualizerFilter::PropertyList EqualizerFilter::getProperties() const lbajardsilogic@223: { lbajardsilogic@223: PropertyList list; lbajardsilogic@236: list.push_back("DrawCurve"); lbajardsilogic@236: list.push_back("Equalizer"); lbajardsilogic@236: list.push_back("Enable"); lbajardsilogic@232: for (int i=0; i"); lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: void EqualizerFilter::setProperty(const PropertyName &name, int value) lbajardsilogic@223: { lbajardsilogic@223: if (name == "Equalizer"){ lbajardsilogic@223: lbajardsilogic@225: } else if (name == "Enable"){ lbajardsilogic@225: if (value > 0) lbajardsilogic@225: { lbajardsilogic@225: m_enabled = true; lbajardsilogic@225: } else lbajardsilogic@225: { lbajardsilogic@225: m_enabled = false; lbajardsilogic@225: } lbajardsilogic@225: emit propertyChanged("Enable"); lbajardsilogic@235: } else if (name == "DrawCurve"){ lbajardsilogic@235: m_simpleMode = (value > 0) ? false : true; benoitrigolleau@240: if (!m_simpleMode) lbajardsilogic@232: { benoitrigolleau@240: emit enableDrawCurve(!m_simpleMode); benoitrigolleau@240: } benoitrigolleau@240: else benoitrigolleau@240: { benoitrigolleau@240: m_mutex->lock(); benoitrigolleau@240: emit enableDrawCurve(!m_simpleMode); lbajardsilogic@232: create_filterbands(); benoitrigolleau@240: m_mutex->unlock(); benoitrigolleau@240: lbajardsilogic@232: } lbajardsilogic@232: } else if (name.left(8) == "GainBand"){ lbajardsilogic@232: int i = name.right(1).toInt(); lbajardsilogic@232: m_gainband[i] = value; benoitrigolleau@240: m_mutex->lock(); lbajardsilogic@232: create_filterbands(); benoitrigolleau@240: m_mutex->unlock(); lbajardsilogic@223: } lbajardsilogic@232: lbajardsilogic@223: #ifdef DEBUG_FILTERS lbajardsilogic@223: std::cerr << "EqualizerFilter::hopfactor = " << hopfactor << std::endl; lbajardsilogic@223: std::cerr << "EqualizerFilter::m_interpfactor = " << m_interpfactor << std::endl; lbajardsilogic@223: std::cerr << "EqualizerFilter::m_hop = " << m_hop << std::endl; lbajardsilogic@223: std::cerr << "EqualizerFilter::skip = " << getRequiredSkipSamples() << std::endl; lbajardsilogic@223: #endif lbajardsilogic@223: lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@233: void EqualizerFilter::setProperty(const PropertyName &name , QVector value) lbajardsilogic@229: { benoitrigolleau@240: lbajardsilogic@229: if (name == "Equalizer"){ benoitrigolleau@240: m_mutex->lock(); lbajardsilogic@229: m_eqcurve.clear(); lbajardsilogic@229: for (int i = 0; i < value.size(); i++) lbajardsilogic@229: { lbajardsilogic@229: m_eqcurve.push_back(value.at(i)); lbajardsilogic@229: } benoitrigolleau@240: m_mutex->unlock(); lbajardsilogic@229: } lbajardsilogic@229: } lbajardsilogic@229: lbajardsilogic@223: void EqualizerFilter::setFilterEnabled(bool b){ lbajardsilogic@223: m_enabled=b; lbajardsilogic@223: emit filterEnabled(m_enabled); lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: void EqualizerFilter::setFilterEnabled(int b){ lbajardsilogic@223: m_enabled=b; lbajardsilogic@223: emit filterEnabled(m_enabled); lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@229: void EqualizerFilter::emitPlotFFTArray(float *signal, int framesize) lbajardsilogic@229: { lbajardsilogic@232: log10plot(signal, m_curve, framesize, m_resolution); lbajardsilogic@229: lbajardsilogic@229: emit signalChanged(m_curve); lbajardsilogic@229: } lbajardsilogic@232: lbajardsilogic@232: lbajardsilogic@232: void EqualizerFilter::create_filterbands() lbajardsilogic@232: { benoitrigolleau@240: //m_mutex->lock(); lbajardsilogic@232: lbajardsilogic@232: float binwidth = 44100/4096; lbajardsilogic@232: lbajardsilogic@232: float xover1 = 80; //100 lbajardsilogic@232: float xover2 = 700; //700 lbajardsilogic@232: float xover3 = 3000; //3000 lbajardsilogic@232: float xover4 = 9000; //9000 lbajardsilogic@232: lbajardsilogic@232: float width1 = 50; //50 lbajardsilogic@232: float width2 = 300; //100 lbajardsilogic@232: float width3 = 3000; //300 lbajardsilogic@232: float width4 = 1900; //900 lbajardsilogic@232: lbajardsilogic@232: int w; lbajardsilogic@232: lbajardsilogic@232: xover1=(xover1/binwidth); lbajardsilogic@232: xover2=(xover2/binwidth); lbajardsilogic@232: xover3=(xover3/binwidth); lbajardsilogic@232: xover4=(xover4/binwidth); lbajardsilogic@232: lbajardsilogic@232: width1=(width1/binwidth); lbajardsilogic@232: width2=(width2/binwidth); lbajardsilogic@232: width3=(width3/binwidth); lbajardsilogic@232: width4=(width4/binwidth); lbajardsilogic@232: lbajardsilogic@232: int p1 = 0; lbajardsilogic@232: int p2 = floor(xover1-(width1/2)); lbajardsilogic@232: int p3 = floor(xover1+(width1/2)); lbajardsilogic@232: int p4 = floor(xover2-(width2/2)); lbajardsilogic@232: int p5 = floor(xover2+(width2/2)); lbajardsilogic@232: int p6 = floor(xover3-(width3/2)); lbajardsilogic@232: int p7 = floor(xover3+(width3/2)); lbajardsilogic@232: int p8 = floor(xover4-(width4/2)); lbajardsilogic@232: int p9 = floor(xover4+(width4/2)); lbajardsilogic@232: int p10 = 2048; lbajardsilogic@232: lbajardsilogic@232: float maxcut=190; //18db of attenuation lbajardsilogic@232: float inc_cut=(1-(1/maxcut))/100; lbajardsilogic@232: lbajardsilogic@232: float maxboost=2; //6 db of gain lbajardsilogic@232: float inc_boost=(maxboost-1)/100; lbajardsilogic@232: float g1=1,g2=1,g3=1,g4=1,g5=1,instgain=1; lbajardsilogic@232: lbajardsilogic@232: if (m_gainband[0] < 0){g1=(1/maxcut)+((100+ (float)m_gainband[0])*inc_cut);} //not finished!!!! lbajardsilogic@232: if (m_gainband[0] == 0){g1=1;} lbajardsilogic@232: if (m_gainband[0] > 0){g1=1+(((float)m_gainband[0])*inc_boost);} lbajardsilogic@232: lbajardsilogic@232: if (m_gainband[1] < 0){g2=(1/maxcut)+((100+ (float)m_gainband[1])*inc_cut);} //not finished!!!! lbajardsilogic@232: if (m_gainband[1] == 0){g2=1;} lbajardsilogic@232: if (m_gainband[1] > 0){g2=1+(((float)m_gainband[1])*inc_boost);} lbajardsilogic@232: lbajardsilogic@232: if (m_gainband[2] < 0){g3=(1/maxcut)+((100+ (float)m_gainband[2])*inc_cut);} //not finished!!!! lbajardsilogic@232: if (m_gainband[2] == 0){g3=1;} lbajardsilogic@232: if (m_gainband[2] > 0){g3=1+(((float)m_gainband[2])*inc_boost);} lbajardsilogic@232: lbajardsilogic@232: if (m_gainband[3] < 0){g4=(1/maxcut)+((100+ (float)m_gainband[3])*inc_cut);} //not finished!!!! lbajardsilogic@232: if (m_gainband[3] == 0){g4=1;} lbajardsilogic@232: if (m_gainband[3] > 0){g4=1+(((float)m_gainband[3])*inc_boost);} lbajardsilogic@232: lbajardsilogic@232: if (m_gainband[4] < 0){g5=(1/maxcut)+((100+ (float)m_gainband[4])*inc_cut);} //not finished!!!! lbajardsilogic@232: if (m_gainband[4] == 0){g5=1;} lbajardsilogic@232: if (m_gainband[4] > 0){g5=1+(((float)m_gainband[4])*inc_boost);} lbajardsilogic@232: lbajardsilogic@232: m_eqcurve.clear(); lbajardsilogic@232: lbajardsilogic@232: lbajardsilogic@232: for (int i=0;i= p2 && i <= p3) lbajardsilogic@232: { lbajardsilogic@232: w = p3-p2+1; lbajardsilogic@232: band[0][i]= (0.5*(1-cos(2*PI*((i-p2+w)+1)/((2*w))))); lbajardsilogic@232: band[1][i]= (0.5*(1-cos(2*PI*((i-p2)+1)/((2*w))))); lbajardsilogic@232: band[2][i]=0; lbajardsilogic@232: band[3][i]=0; lbajardsilogic@232: band[4][i]=0; lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: lbajardsilogic@232: if (i > p3 && i < p4) lbajardsilogic@232: { lbajardsilogic@232: band[0][i]=0; lbajardsilogic@232: band[1][i]=1; lbajardsilogic@232: band[2][i]=0; lbajardsilogic@232: band[3][i]=0; lbajardsilogic@232: band[4][i]=0; lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: if (i >= p4 && i <= p5) lbajardsilogic@232: { lbajardsilogic@232: w = p4-p5+1; lbajardsilogic@232: band[0][i]=0; lbajardsilogic@232: band[1][i]= (0.5*(1-cos(2*PI*((i-p4+w)+1)/((2*w))))); lbajardsilogic@232: band[2][i]= (0.5*(1-cos(2*PI*((i-p4)+1)/((2*w))))); lbajardsilogic@232: band[3][i]=0; lbajardsilogic@232: band[4][i]=0; lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: if (i > p5 && i < p6) lbajardsilogic@232: { lbajardsilogic@232: band[0][i]=0; lbajardsilogic@232: band[1][i]=0; lbajardsilogic@232: band[2][i]=1; lbajardsilogic@232: band[3][i]=0; lbajardsilogic@232: band[4][i]=0; lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: if (i >= p6 && i <= p7) lbajardsilogic@232: { lbajardsilogic@232: w = p6-p7+1; lbajardsilogic@232: band[0][i]=0; lbajardsilogic@232: band[1][i]=0; lbajardsilogic@232: band[2][i]= (0.5*(1-cos(2*PI*((i-p6+w)+1)/((2*w))))); lbajardsilogic@232: band[3][i]= (0.5*(1-cos(2*PI*((i-p6)+1)/((2*w))))); lbajardsilogic@232: band[4][i]=0; lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: if (i > p7 && i < p8) lbajardsilogic@232: { lbajardsilogic@232: band[0][i]=0; lbajardsilogic@232: band[1][i]=0; lbajardsilogic@232: band[2][i]=0; lbajardsilogic@232: band[3][i]=1; lbajardsilogic@232: band[4][i]=0; lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: if (i >= p8 && i <= p9) lbajardsilogic@232: { lbajardsilogic@232: w = p8-p9+1; lbajardsilogic@232: band[0][i]=0; lbajardsilogic@232: band[1][i]=0; lbajardsilogic@232: band[2][i]=0; lbajardsilogic@232: band[3][i]= (0.5*(1-cos(2*PI*((i-p8+w)+1)/((2*w))))); lbajardsilogic@232: band[4][i]= (0.5*(1-cos(2*PI*((i-p8)+1)/((2*w))))); lbajardsilogic@232: lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: if (i > p9 && i < p10) lbajardsilogic@232: { lbajardsilogic@232: band[0][i]=0; lbajardsilogic@232: band[1][i]=0; lbajardsilogic@232: band[2][i]=0; lbajardsilogic@232: band[3][i]=0; lbajardsilogic@232: band[4][i]=1; lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: instgain=(g1*band[0][i])+(g2*band[1][i])+(g3*band[2][i])+(g4*band[3][i])+(g5*band[4][i]); lbajardsilogic@233: m_eqcurve.push_back(instgain); lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: log10plot2(m_eqcurve,m_plotbandcurve, m_framesize, m_resolution); lbajardsilogic@232: lbajardsilogic@232: emit filterChanged(m_plotbandcurve); benoitrigolleau@240: benoitrigolleau@240: //m_mutex->unlock(); lbajardsilogic@232: lbajardsilogic@232: }