Beispiel #1
0
void SSMethod(double *S, double *G, double *D, double *X1, int N){
    int i;
    double temp;
    for(i=0; i<N; i++){
        temp = 1 - (D[i]/absComplex(X1[2*i+1],X1[2*i+2]));
        G[i] = (temp+fabs(temp))/2;
        S[2*i+1] = G[i]*X1[2*i+1];
        S[2*i+2] = G[i]*X1[2*i+2];
    }
}
vector<double> MatchParam::getParams(vector<cplx> signal, int numP,
                                     int fi0PP, int stepDopler) {
  
  vector<double> result(5);
  int nUmp = periodRecordImp[numP];
  
//  vector<vector<vector<vector<vector<double>>>>> fMMMP;
  
  std::size_t signalLenght = signal.size();
  
  vector<cplx> signalFFT(signalLenght, 0);
  signalFFT = dft(signal);
  vector<double> signalModule = absComplex(signalFFT);
  
  int targetStep = (target.max - target.min)/target.numbPoints;
  int clutterStep = (clutter.max - clutter.min)/clutter.numbPoints;
  int widthClutterStep = widthClutter.max/widthClutter.numbPoints;
  int amplStep = ampl.max/ampl.numbPoints;
  
  double threshold = 2000;
  
  std::size_t freqTarget = target.min;
  
  #pragma omp parallel for
  for (freqTarget = target.min; freqTarget < target.max; freqTarget += targetStep) {
    std::cout << freqTarget << std::endl;
    for (std::size_t freqClutter = clutter.min; freqClutter < clutter.max; freqClutter += clutterStep) {
      for (std::size_t widClutter = widthClutter.min; widClutter < widthClutter.max;
           widClutter += widthClutterStep) {
        for (std::size_t aTarget = ampl.min; aTarget < ampl.max; aTarget += amplStep) {
          for (std::size_t aClutter = ampl.min; aClutter < ampl.max; aClutter += amplStep) {
            vector<cplx> bearingSignal(signalLenght);
            std::size_t n = widClutter/widthClutterStep + 1;
            
            double fd = 1200000/periodRecordImp[numP];
            
            for (std::size_t i = 0; i < signalLenght; ++i) {
              cplx clutt = cplx(0, 0);
              double value = (1/fd) * i;
              for (std::size_t j = 0; j < n; ++j) {
                double freqClutterI = freqClutter - widClutter/2 + widthClutterStep * j;
                clutt += cplx(aClutter, 0) * std::exp(cplx(0, 1) * freqClutterI);
              }
              bearingSignal[i] = cplx(aTarget, 0) * std::exp(cplx(0, 1) * cplx(freqTarget, 0) * cplx(value, 0)) + clutt * cplx(value, 0);
            }
            
            vector<cplx> bearingSpectr = dft(bearingSignal);
            vector<double> bearingModule = absComplex(bearingSpectr);
            vector<double> diff = difference(signalModule, bearingModule);
            
            double error = 0;
            for (auto const& value: diff) {
              error += value;
            }
            
            if (abs(error) < threshold) {
              threshold = abs(error);
              result[0] = freqTarget;
              result[1] = freqClutter;
              result[2] = widClutter;
              result[3] = aTarget;
              result[4] = aClutter;
            }
          }
        }
      }
    }
  }
  return result;
}
Beispiel #3
0
void NoiseSpecterEstimate(double *D, double *X1, int P, int N){
    int i;
    for(i=0; i<N; i++){
        D[i] += (absComplex(X1[2*i+1],X1[2*i+2])/P);
    }
}