int main() { const int N_SAMPLES = 32; uint8_t samples[] = { 0, 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 }; complex freq[] = { {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0} }; for (int i=0; i<N_SAMPLES; i++) { sdft(samples[i], freq, coeffs); uint8_t out = isdft(freq, coeffs); printf("%d \n", out); } }
void RBD::doSA() { /* 1. Determine sampling size */ if (N_ < 2*omega_ + 1) throw SAException(ERROR_RBD_SMALL_SAMPLE_SIZE); int N = N_ % 2 == 1 ? N_ : N_ + 1; /* Makes N an odd number (it is not important) */ if (useFFT_) N = len4FFT(N_); /* 2. Allocates data */ int k = m_InputList->size(); std::unique_ptr<DMatrix> x(new DMatrix(N, k)); /* Input data */ std::unique_ptr<IMatrix> p(new IMatrix(k, N)); /* Array of permutation vectors */ std::unique_ptr<ResultMatrix> y(new ResultMatrix(N, m_NumOutputs)); /* Output data */ double** xdata = x->getData(); int** pdata = p->getData(); double** ydata = y->getData(); /* 3. Sets up permuation vectors */ for (int iK=0; iK<k; ++iK) { for (int iN=0; iN<N; ++iN) { pdata[iK][iN] = iN; } m_RNG.shuffle(pdata[iK], N); } /* 4. Inits the pilot sample */ std::unique_ptr<double[]> x0ptr(new double[2*N]); /* pilot sample */ double* x0 = x0ptr.get(); double* s = &x0[N]; for (int i=0; i<N; ++i) { s[i] = MY_PI*(2*i+1-N)/N; x0[i] = 0.5 + asin(sin(omega_*s[i])); } /* 5. Samples input data */ for (int iK=0; iK<k; ++iK) { for (int iN=0; iN<N; ++iN) { xdata[pdata[iK][iN]][iK] = x0[iN]; } } /* 6. Converts input data to target distributions */ m_RNG.convert(*x, m_InputList); /* 7. Runs simulation */ simulate(*x, *y); /* 8. Estimates sensitivity indices */ std::unique_ptr<double[]> ytmp_ptr(new double[N]); double* ytmp = ytmp_ptr.get(); int* labels = y->getLabels(); for (int iK=0; iK<k; ++iK) { for (int iOut=0; iOut< m_NumOutputs; ++iOut) { for (int iN=0; iN<N; ++iN) { ytmp[iN] = ydata[pdata[iK][iN]][iOut]; } interpolate(ytmp, labels, N); if (useFFT_) { /* Estimate Fourier coeffients using FFT */ sdft(ytmp, N); double V=0; for (int iN=1; iN<N/2; ++iN) { V += ytmp[iN]; } double Vi = 0; for (int iM=1; iM<M_+1; ++iM) { Vi += ytmp[iM*omega_]; } m_Sens->getRow(iK)[iOut]= Vi/V; } else /* Estimates Fourier coefficients directly */ { double V=0, f0=0; /* estimates total variance */ for (int iN=0; iN<N; ++iN) { f0 += ytmp[iN]; V += ytmp[iN] * ytmp[iN]; } f0 /= N; V /= N; V -= f0*f0; /* estimate Fourier coefficients and Vi */ double Vi = 0; for (int iM=1; iM<M_+1; ++iM) { double A=0, B=0; for (int iN = 0; iN<N; ++iN) { A += ytmp[iN] * cos(iM*omega_*s[iN]); B += ytmp[iN] * sin(iM*omega_*s[iN]); } A /= N; B /= N; Vi += A*A + B*B; } m_Sens->getRow(iK)[iOut] = 2*Vi/V; } } } /* 9. Retains input/output data if needs */ if (m_SaveInput) m_InputData = std::move(x); if (m_SaveOutput) m_OutputData = std::move(y); }