31 "category",
"Spectral Transformations",
32 "description",
"Vocoder",
35 static FactoryRegistrator<ProcessingFactory, Vocoder>
reg =
metadata;
40 if ( !
mConfig.GetPreserveOuts() )
48 TData fFirstBand = 100;
56 int spectrumSize = in.
GetSize();
57 TData spectralRange = in.GetSpectralRange();
58 TData spectralResolution = spectrumSize/spectralRange;
61 mMagBuffer.
Resize(spectrumSize);
62 mMagBuffer.
SetSize(spectrumSize);
64 TData bandFactor = pow(
TData(spectrumSize),1./nBands);
65 TData fBandFactor = pow(
TData(spectralRange),1./nBands);
67 TData fCurrentBandLimit = fFirstBand;
68 int currentBandLimit =
Round(fFirstBand*spectralResolution);
69 int lastBandLimit = 0;
70 TData fLastBandLimit = 0.;
74 int currentOscBin =
int(spectrumSize/nBands) + freqShift;
75 TData fCurrentOsc = spectralRange/nBands;
77 int currentGainIndex = 0;
78 TData fCurrentGainBandLimit = fCurrentBandLimit*2;
79 int currentGainBandLimit =
Round(fCurrentGainBandLimit*spectralResolution);
81 TData gainBandFactor = pow(
TData(spectrumSize/currentBandLimit),1./nGainBands);
82 TData fGainBandFactor = pow(
TData(spectralRange/fCurrentGainBandLimit),1./nGainBands);
87 for(
int i = 0; i<spectrumSize; i++)
89 if(i>currentBandLimit)
91 bandEnergy = sqrt(bandEnergy);
92 mMagBuffer[currentOscBin] = bandEnergy*gains[currentGainIndex];
93 lastBandLimit = currentBandLimit;
94 fCurrentBandLimit*=fBandFactor;
95 currentBandLimit =
Round(fCurrentBandLimit*spectralResolution);
96 if(currentBandLimit>spectrumSize) currentBandLimit = spectrumSize;
97 currentOscBin =
int ((currentBandLimit-lastBandLimit)*0.5 + lastBandLimit) + freqShift;
100 if(currentBand>nBands)
break;
102 if (i>currentGainBandLimit)
104 if(currentGainIndex<3)
106 fCurrentGainBandLimit*=fGainBandFactor;
107 currentGainBandLimit =
Round(fCurrentGainBandLimit*spectralResolution);
109 bandEnergy += inMag[i];
112 out.SetMagBuffer(mMagBuffer);