18 fData =
new double[size];
47 if(Value == 0) { Power=0;Remainder=0;
return false; }
48 size_t Comp=2*
sizeof(size_t);
50 if(Value>(
size_t)((1<<Comp)-1))
51 {Power+=Comp; Remainder+=(Value&((1<<Comp)-1)); Value = Value>>Comp; }
54 if(Remainder)
return false;
69 if (!winName.compare(
"rectangular")) wType=
WT_Rect;
70 else if(!winName.compare(
"welch")) wType=
WT_Welch;
71 else if(!winName.compare(
"hann")) wType=
WT_Hann;
72 else if(!winName.compare(
"hamming")) wType=
WT_Hamming;
73 else if(!winName.compare(
"cosinus")) wType=
WT_Cosinus;
75 else if(!winName.compare(
"kaiser3")) wType=
WT_Kaiser3;
85 size_t winSize = size-zeros;
91 for(
size_t i = 0; i < winSize; i++) {
98 for(
size_t i = 0; i < winSize; i++) {
99 window[i] = 1.-
pow( (i-winSize/2.) / (winSize/2.),2.);
105 for(
size_t i = 0; i < winSize; i++) {
106 window[i] = 0.5*(1 - gsl_sf_cos(2*M_PI*(i+1)/winSize));
112 for(
size_t i = 0; i < winSize; i++) {
113 window[i] = 0.53836 - 0.46164*gsl_sf_cos(2*M_PI*(i+1)/(winSize));
119 size_t risetime = 30;
120 if(param > 0) risetime = param;
121 for(
size_t i = 0; i < winSize; i++) {
123 window[i] = 0.5 - 0.5*
cos(M_PI/(risetime)*
double(i+1));
124 else if(i < winSize-risetime)
127 window[i] = 0.5 + 0.5*
cos(M_PI/(risetime)*
double(i+1-(winSize-risetime)));
137 for(
size_t i = 0; i < winSize; i++) {
138 window[i] = a0 - a1*
cos(2*M_PI*i/winSize) + a2*
cos(4*M_PI*i/winSize) - a3*
cos(6*M_PI*i/winSize);
146 for(
size_t i = 0; i < winSize; i++) {
147 arg = alpha*sqrt(1.-
pow(2.*i/winSize-1.,2.));
148 window[i] = gsl_sf_bessel_I0(arg)/gsl_sf_bessel_I0(alpha);
160 double corrFactor = 0.;
162 for(
size_t i = 0; i < window.
Size(); i++) {
163 corrFactor += window[i];
165 corrFactor /= window.
Size();
166 }
else if(coherent == 2){
167 for(
size_t i = 0; i < window.
Size(); i++) {
168 corrFactor += window[i]*window[i];
170 corrFactor /= window.
Size();
171 corrFactor = sqrt(corrFactor);
175 for(
size_t i = 0; i < window.
Size(); i++) {
176 window[i] /= corrFactor;
181 if(zeros > 0 && window.
Size() > 0) {
184 size_t start = zeros/2;
185 size_t stop = start + window.
Size();
186 for(
size_t j = 0; j < start; j++) {
189 for(
size_t j = start, i = 0; j < stop ; j++,i++) {
190 retwin[j] = window[i];
192 for(
size_t j = stop; j < size; j++) {
203 Diana::QVector antiSym(input);
204 size_t size=antiSym.Size()/2-1;
205 antiSym.Shift(-size);
210 Diana::QVector sym(input);
211 size_t size=sym.Size()/2-1;
219 size_t totsize = input.
Size() + n_zeros;
221 size_t offset=(isSym ==
kMiddle ? input.
Size()/2+1 : 0);
226 for(
size_t i = 0; i < n_zeros; i++) {
227 zeroPadded[i] = zeroVal;
232 for(
size_t i=n_zeros,j=0;j<input.
Size();i++,j++){
233 zeroPadded[i]=input[(offset+j) % input.
Size()];
238 zeroPadded.
Shift(-(n_zeros/2));
242 zeroPadded.
Shift(-n_zeros);
248 zeroPadded.
Shift(offset);
254 Diana::QComplex zeroVal){
256 size_t totsize = input.
Size() + n_zeros;
258 size_t offset=(isSym ==
kMiddle ? input.
Size()/2+1 : 0);
263 for(
size_t i = 0; i < n_zeros; i++) {
264 zeroPadded[i] = zeroVal;
269 for(
size_t i=n_zeros,j=0;j<input.
Size();i++,j++){
270 zeroPadded[i]=input[(offset+j) % input.
Size()];
275 zeroPadded.
Shift(-(n_zeros/2));
279 zeroPadded.
Shift(-n_zeros);
285 zeroPadded.
Shift(offset);
292 size_t totsize = input.
Size() - ncut;
Diana::QComplex pow(const Diana::QComplex &z, double a)
Raise a complex number to a real power.
#define Q_BEGIN_NAMESPACE
Diana::QVector cos(const Diana::QVector &v)
static WindowType StrToWindowType(const std::string &winName)
Convert string to window type.
virtual ~QFFT()
destructor
static QVector ZeroPad(const QVector &input, size_t n_zeros, int Side=kMiddle, double zeroVal=0.)
Add zeros to the input.
static QVector CutSides(const QVector &input, size_t ncut, bool isSym)
cut left and right sides by ncut/2
static QVector FFTAntiSym(const QVector &input)
antisimmetrize time domain vector
static QVector GetWindow(WindowType wt, size_t size, size_t zeros=0, int coherent=0, int param=0)
create window and add zeros/2 to the left and zeros/2 to the right
QFFT()
empty constructor with its size
static QVector FFTSym(const QVector &input)
simmetrize time domain vector
Interface for complex vectors in Diana analysis.
const QVectorC & Shift(const int nstep)
Cyclic shift of vector.
UInt_t Size() const
size of QVector
QVectorView for const QVector.
const QVector & GetVector() const
Get subview QVector.
Interface for vectors in Diana analysis.
UInt_t Size() const
size of QVector
const QVector & Shift(const int nstep)
Cyclic shift of vector.
void Resize(const UInt_t newsize)
resize a QVector