1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
/***********************************************/
/**
* @file noiseGenerator.cpp
*
* @brief Generate different types of noise.
*
* @author Matthias Ellmer
* @date 2013-09-18
*
*/
/***********************************************/
#define DOCSTRING_NoiseGenerator
#include "base/import.h"
#include "config/configRegister.h"
#include "classes/noiseGenerator/noiseGenerator.h"
#include "classes/noiseGenerator/noiseGeneratorWhite.h"
#include "classes/noiseGenerator/noiseGeneratorExpressionPSD.h"
#include "classes/noiseGenerator/noiseGeneratorDigitalFilter.h"
#include "classes/noiseGenerator/noiseGeneratorPowerLaw.h"
/***********************************************/
GROOPS_REGISTER_CLASS(NoiseGenerator, "noiseGeneratorType",
NoiseGeneratorWhite,
NoiseGeneratorExpressionPSD,
NoiseGeneratorDigitalFilter,
NoiseGeneratorPowerLaw)
GROOPS_READCONFIG_UNBOUNDED_CLASS(NoiseGenerator, "noiseGeneratorType")
/***********************************************/
NoiseGenerator::NoiseGenerator(Config &config, const std::string &name)
{
try
{
std::string type;
while(readConfigChoice(config, name, type, Config::OPTIONAL, "", "generate different types of noise"))
{
if(readConfigChoiceElement(config, "white", type, "white noise"))
noiseGenerator.push_back(new NoiseGeneratorWhite(config));
if(readConfigChoiceElement(config, "expressionPSD", type, "defined by one sided PSD"))
noiseGenerator.push_back(new NoiseGeneratorExpressionPSD(config));
if(readConfigChoiceElement(config, "filter", type, "noise conforms to psd of filter"))
noiseGenerator.push_back(new NoiseGeneratorDigitalFilter(config));
if(readConfigChoiceElement(config, "powerLaw", type, "noise follows power law relationship (f^alpha)"))
noiseGenerator.push_back(new NoiseGeneratorPowerLaw(config));
endChoice(config);
if(isCreateSchema(config))
return;
}
}
catch(std::exception &e)
{
GROOPS_RETHROW(e)
}
}
/***********************************************/
NoiseGenerator::~NoiseGenerator()
{
for(UInt i=0; i<noiseGenerator.size(); i++)
delete noiseGenerator.at(i);
}
/***********************************************/
Matrix NoiseGenerator::noise(UInt samples, UInt series) const
{
try
{
Matrix sum(samples, series);
for(UInt i=0; i<noiseGenerator.size(); i++)
sum += noiseGenerator.at(i)->noise(samples, series);
return sum;
}
catch(std::exception &e)
{
GROOPS_RETHROW(e)
}
}
/***********************************************/
Matrix NoiseGenerator::covarianceFunction(UInt length, Double sampling) const
{
try
{
Vector sum(length);
for(UInt i=0; i<noiseGenerator.size(); i++)
sum += noiseGenerator.at(i)->covarianceFunction(length, sampling);
Matrix covariance(length,2);
for(UInt i=0; i<length; i++)
covariance(i,0) = i*sampling;
copy(sum, covariance.column(1));
return covariance;
}
catch(std::exception &e)
{
GROOPS_RETHROW(e)
}
}
/***********************************************/
|