00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "3BandFilter.hxx"
00023 #include "ProcessingFactory.hxx"
00024
00025 namespace CLAM
00026 {
00027 namespace Hidden
00028 {
00029 static FactoryRegistrator<ProcessingFactory, ThreeBandFilter> regThreeBandFilter("ThreeBandFilter");
00030 }
00031
00032
00033 bool ThreeBandFilter::Do(const Spectrum& in, Spectrum& out)
00034 {
00035 if ( !mConfig.GetPreserveOuts() )
00036 {
00037 out = in;
00038 }
00039
00040 DataArray& oMag = out.GetMagBuffer();
00041
00042 int spectrumSize = in.GetSize();
00043
00044 TData spectralResolution = spectrumSize/in.GetSpectralRange();
00045
00046 int lowCutoff = Round(mLowCutoffFreqCtl.GetLastValue()* spectralResolution);
00047 int highCutoff = Round(mHighCutoffFreqCtl.GetLastValue()* spectralResolution);
00048
00049
00050 TData lowGain = log2lin(mLowGainCtl.GetLastValue());
00051 TData midGain = log2lin(mMidGainCtl.GetLastValue());
00052 TData highGain = log2lin(mHighGainCtl.GetLastValue());
00053
00054 TData currentGain = lowGain;
00055 for(int i = 0; i<spectrumSize; i++)
00056 {
00057 if(i>highCutoff)
00058 currentGain = highGain;
00059 else if(i==highCutoff)
00060 currentGain = (highGain+midGain)*0.5;
00061 else if(i>lowCutoff)
00062 currentGain = midGain;
00063 else if(i==lowCutoff)
00064 currentGain = (lowGain+midGain)*0.5;
00065 oMag[i] *= currentGain;
00066 }
00067 return true;
00068 }
00069
00070
00071 }
00072