10 Diana::QVector
vec(size);
17 Diana::QVector
vec(size);
18 for(UInt_t i=0;i<size;i++)
vec[i]=i;
24 UInt_t NP=(
max-
min-1)/stride+1;
25 Diana::QVector
vec(NP);
26 for(UInt_t i=0;i<NP;i++)
vec[i]=
min+i*stride;
42 Diana::QVector t(Size);
43 for(UInt_t i=0;i<Size;i++)
44 t[i] = gRandom->Gaus(mean,
std);
55 Diana::QVector t(Size);
56 for(UInt_t i=0;i<Size;i++)
57 t[i] = gRandom->Uniform(
min,
max);
64 const double sqrt2over2 = sqrt(0.5);
67 Diana::QVectorC noiseC(anps.Size());
70 noiseC[noiseC.Size()-1] = sqrt2over2*gRandom->Exp(sqrt(anps[noiseC.Size()-1]));
71 for(
size_t i=1;i<noiseC.Size()-1;i++)
72 noiseC[i].SetPolar(sqrt2over2*gRandom->Exp(sqrt(anps[i])),
73 TMath::TwoPi()*gRandom->Uniform(0,1));
82 Diana::QVector output =
Zeros(vecA.Size()+vecB.Size()-1);
83 for(
size_t i=0;i<output.Size();i++) {
84 for(
size_t j=0;j<vecA.Size();j++) {
85 if(((
int)i-(
int)j)<0 || (i-j)>=vecB.Size())
continue;
86 output[i] += vecA[j]*vecB[i-j];
90 int retSize =
std::max(vecA.Size(),vecB.Size());
91 int offset = (output.Size()-retSize)/2;
92 output=output.GetSubVector(retSize,offset);
95 int retSize =
std::max(vecA.Size(),vecB.Size())-
std::min(vecA.Size(),vecB.Size())+1;
96 int offset = (output.Size()-retSize)/2;
97 output=output.GetSubVector(retSize,offset);
104 Diana::QVector output =
Zeros(vecA.Size()+vecB.Size()-1);
105 const Diana::QVector &longVec = (vecA.Size() >= vecB.Size() ? vecA : vecB);
106 const Diana::QVector &shortVec = (vecA.Size() < vecB.Size() ? vecA : vecB);
107 for(
size_t i=0;i<output.Size();i++) {
108 for(
size_t j=0;j<shortVec.Size();j++) {
109 output[i] += shortVec[j]*longVec[(i-j+longVec.Size())%longVec.Size()];
118 const Int_t SizeToOverlapAdd = 5000;
120 Diana::QVectorC vecA_f,vecB_f;
121 Diana::QRealComplexFFT FFT;
122 Diana::QVector output;
123 if(
std::abs((
int)(vecA.Size()-vecB.Size()))<SizeToOverlapAdd) {
125 int padSize = vecA.Size()+vecB.Size()-1;
126 Diana::QVector vecA_p = Diana::QFFT::ZeroPad(vecA,padSize-vecA.Size(),Diana::QFFT::kRight);
127 Diana::QVector vecB_p = Diana::QFFT::ZeroPad(vecB,padSize-vecB.Size(),Diana::QFFT::kRight);
128 FFT.TransformToFreq(vecA_p,vecA_f);
129 FFT.TransformToFreq(vecB_p,vecB_f);
130 Diana::QVectorC output_f = vecA_f.Mult(vecB_f);
131 FFT.TransformFromFreq(output_f,output);
132 output=output.GetSubVector(vecA.Size()+vecB.Size()-1);
136 output.Resize(vecA.Size()+vecB.Size()-1);
137 output.Initialize(0);
139 const Diana::QVector &longVec = (vecA.Size() > vecB.Size() ? vecA : vecB);
140 const Diana::QVector &shortVec = (vecA.Size() < vecB.Size() ? vecA : vecB);
142 UInt_t longSize = longVec.Size();
143 UInt_t shortSize = shortVec.Size();
145 Diana::QFFT::IsPowerOf2(shortSize,skip,dum);
148 Diana::QVector output_seg;
149 Diana::QVector shortVec_p = Diana::QFFT::ZeroPad(shortVec,skip-1,Diana::QFFT::kRight);
150 Diana::QVectorC shortVec_f,long_seg_f,output_seg_f;
151 FFT.TransformToFreq(shortVec_p,shortVec_f);
153 for(UInt_t segStart=0;segStart<longSize;segStart+=skip) {
154 if(segStart+skip<longSize) {
155 Diana::QVector long_seg_p = Diana::QFFT::ZeroPad(longVec.GetSubVector(skip,segStart),shortSize-1,Diana::QFFT::kRight);
156 FFT.TransformToFreq(long_seg_p,long_seg_f);
157 output_seg_f = long_seg_f.Mult(shortVec_f);
158 FFT.TransformFromFreq(output_seg_f,output_seg);
159 output.GetSubVector(shortSize+skip-1,segStart) += output_seg;
162 output_seg=
ConvolveFFT(shortVec,longVec.GetSubVector(longSize-segStart,segStart));
163 output.GetSubVector(output.Size()-segStart,segStart) += output_seg;
168 int retSize =
std::max(vecA.Size(),vecB.Size());
169 int offset = (output.Size()-retSize)/2;
170 output=output.GetSubVector(retSize,offset);
173 int retSize =
std::max(vecA.Size(),vecB.Size())-
std::min(vecA.Size(),vecB.Size())+1;
174 int offset = (output.Size()-retSize)/2;
175 output=output.GetSubVector(retSize,offset);
Diana::QComplex pow(const Diana::QComplex &z, double a)
Raise a complex number to a real power.
QRealComplexFFT * gRealComplexFFT
Diana::QVector abs(const Diana::QVector &v)
double min(const Diana::QVector &v)
virtual int TransformFromFreq(const QVectorC &FT, QVector &spectrum, bool compress=false)
transform from the frequencies to the times
void Initialize(const double val=0)
initialize elements (default to 0)