Преобразование сигнала в трапециевидную форму (трапециевидный фильтр) - PullRequest
0 голосов
/ 08 апреля 2019

Предположим, что у нас есть простой сигнал с одним ударом по центру и ничем в остальных точках. Что-то вроде гауссовского распределения. например, см. This . Хорошо, тогда мы разделили эту форму на некоторую точку данных.

Я хочу преобразовать эту форму в трапециевидную форму в c++. Что-то вроде это . Насколько я знаю, это просто своего рода математическое усреднение. Ну как я могу это сделать? Кроме того, я использую ROOT CERN, чтобы показать результаты ...

Это основная часть моего кода, но он работает неправильно ...

char Data[Data_Point][5]    

for (int k = 0; k < Data_Point ; k++){ // Data_Point is equal to 512, and so my array has just 512 member.

  h1 = 0.0;
  h2 = 0.0;
  H = 0.0;
  H1 = 0.0;
  H2 = 0.0;

  for (int l = 0; l <= L; l++){  // L is a const int and equal to 80.

    if (k + 1 < Data_Point){
      h1 += ((stoi(Data[k + l])) - Baseline / 20.0);  // Baseline is average of 20 data point of first of 512 data point, by this i'm trying to make more accuarcy by subtracting the baseline.
    } else {
      H1 = h1;
      cout << H1;
    }

    if (L + G + k + l < Data_Point){    // G is a Const int and equal to 15.
      h2 += ((stoi(Data[L + G + k + l])) - Baseline / 20.0);
    } else {
      H2 = h2;
      cout << H2;
    }

  }
  H = ((h2 - h1) / L);

}

RisingTime->Fill(H);

Когда я запускаю этот код, я сталкиваюсь с ошибкой, которая говорит: Unhandled exception at 0x7731C54F in Pro1.exe: Microsoft C++ exception: std::invalid_argument at memory location 0x0019E854.

Кто-нибудь может помочь? Любой ответ будет оценен.

1 Ответ

0 голосов
/ 13 апреля 2019

Я нашел это:

// Trapezoidal filter

for (int k = 0; k < Data_Point; k++){

    h1 = 0.0;
    h2 = 0.0;
    H = 0.0;
    H1 = 0.0;
    H2 = 0.0;

    for (int m = 0; m <= (L - 1); m++){

    if (k + m < Data_Point){
      h1 += ((stoi(Data[k + m])));
    }   //  if (k + m < Data_Point)
    else{
      H1 = h1;
      cout << H1;
    }   //  else

    if (L + G + k + m < Data_Point){
      h2 += ((stoi(Data[L + G + k + m])));
    }   //  if (L + G + k + m < Data_Point)
    else{
      H2 = h2;
      cout << H2;
    }   //  else

  } //  for (int m = 0; m <= (L - 1); m++)

  H = ((h2 - h1) / L);
}
...