SpectralCombTriang.cxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "SpectralCombTriang.hxx"
00023 #include "ProcessingFactory.hxx"
00024
00025 namespace CLAM
00026 {
00027
00028 namespace Hidden
00029 {
00030 static const char * metadata[] = {
00031 "key", "SpectralCombTriang",
00032
00033
00034 0
00035 };
00036 static FactoryRegistrator<ProcessingFactory, SpectralCombTriang> reg = metadata;
00037 }
00038
00039
00040 bool SpectralCombTriang::Do(const Spectrum& in, Spectrum& out)
00041 {
00042 if (!mConfig.GetPreserveOuts())
00043 {
00044 out = in;
00045 }
00046 DataArray& inMag = in.GetMagBuffer();
00047 DataArray& outMag = out.GetMagBuffer();
00048
00049 int spectrumSize = in.GetSize();
00050
00051 TData spectralResolution = spectrumSize/in.GetSpectralRange();
00052 int fundamental = Round(mFundamentalCtl.GetLastValue()* spectralResolution);
00053
00054 int i;
00055 int n;
00056 n = 0;
00057 int bandlimit = fundamental;
00058
00059 TData overallGain = log2lin(mAmount.GetLastValue());
00060 for(i = 0; i<spectrumSize; i++)
00061 {
00062 if(i > bandlimit)
00063 {
00064 n++;
00065 bandlimit = fundamental * n;
00066 }
00067 outMag[i] = inMag[i]*GetGain(fundamental, i, n)*overallGain;
00068 }
00069 return true;
00070 }
00071
00072 TData SpectralCombTriang::GetGain(int fundamental, int binPos, int bandNum)
00073 {
00074
00075
00076 TData period = fundamental;
00077
00078
00079 int midPoint = int (period * 0.5);
00080
00081 bool ascending = false;
00082 if ((binPos - fundamental*bandNum)> midPoint || bandNum == 0) ascending = true;
00083
00084
00085
00086
00087 TData a = 2/fundamental;
00088 if (!ascending) a = -a;
00089
00090 TData b = 1;
00091 if(ascending) b = 0;
00092
00093 int x;
00094 if (bandNum==0) x = binPos;
00095 else if(ascending) x = binPos - int(fundamental*bandNum + midPoint);
00096 else x = binPos - int(fundamental * bandNum);
00097
00098
00099 return a*x + b;
00100 }
00101
00102
00103 }
00104