add: finding zero + cleaning
This commit is contained in:
parent
f0af7118b8
commit
f82ff4ca4c
84
main.cpp
84
main.cpp
|
@ -2,13 +2,95 @@
|
||||||
// Created by Elie Baier on 23.02.24.
|
// Created by Elie Baier on 23.02.24.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
#include "iostream"
|
#include "iostream"
|
||||||
|
#include "string"
|
||||||
|
#include "fstream"
|
||||||
|
#include "sstream"
|
||||||
#include "matplot/matplot.h"
|
#include "matplot/matplot.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
namespace plt = matplot;
|
||||||
|
|
||||||
|
int MIN_ZERO_SEPARATION = 10;
|
||||||
|
|
||||||
|
vector<double> findZeroCrossings(const std::vector<double>& data) {
|
||||||
|
std::vector<double> zeroCrossings;
|
||||||
|
for (int i = 1; i < data.size(); ++i) {
|
||||||
|
if (data[i - 1] * data[i] < 0 || data[i - 1] * data[i] == 0) {
|
||||||
|
|
||||||
|
// Cleaning the duplicate zero which are +-MIN_ZERO_SEPARATION
|
||||||
|
if(zeroCrossings.size() >= 1) {
|
||||||
|
if(zeroCrossings[zeroCrossings.size() - 1] - MIN_ZERO_SEPARATION < i && zeroCrossings[zeroCrossings.size() - 1] + MIN_ZERO_SEPARATION > i) {
|
||||||
|
// cout << "Found duplicate zero: " << i << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zeroCrossings.push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return zeroCrossings;
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
cout << "Hello World" << endl;
|
ifstream dataFile;
|
||||||
|
dataFile.open("/Users/eliebaier/Workspace/Physique/TP8/DATA/ALL0000/F0000CH1.CSV");
|
||||||
|
if (!dataFile.is_open()) {
|
||||||
|
std::cerr << "Error opening file." << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
string line;
|
||||||
|
|
||||||
|
// Skipping TEKTRONICS DEFINITION lines
|
||||||
|
for(auto i = 0; i < 18; i++) {
|
||||||
|
getline(dataFile, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<double> xData, yData;
|
||||||
|
while(getline(dataFile, line)) {
|
||||||
|
// Cleaning the lines
|
||||||
|
line.erase(0, 3);
|
||||||
|
line.erase(line.size() - 1, line.size());
|
||||||
|
|
||||||
|
std::string cleanedLine;
|
||||||
|
for (char c : line) {
|
||||||
|
if (std::isdigit(c) || c == '.' || c == ',') {
|
||||||
|
cleanedLine += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double x, y;
|
||||||
|
istringstream iss(line);
|
||||||
|
char comma;
|
||||||
|
if (!(iss >> x >> comma >> y)) {
|
||||||
|
std::cerr << "Error parsing line: " << line << std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
xData.push_back(x);
|
||||||
|
yData.push_back(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
dataFile.close();
|
||||||
|
|
||||||
|
plt::plot(xData, yData);
|
||||||
|
plt::xlabel("X Label");
|
||||||
|
plt::ylabel("Y Label");
|
||||||
|
plt::title("Line Plot");
|
||||||
|
|
||||||
|
vector<double> zeroCrossings = findZeroCrossings(yData);
|
||||||
|
|
||||||
|
// Drawing lines on the found zeros
|
||||||
|
for(auto zero : zeroCrossings) {
|
||||||
|
cout << "Zero: " << zero << endl;
|
||||||
|
plt::line(xData[zero], -2, xData[zero], 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the plot
|
||||||
|
plt::show();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
Reference in New Issue