diff --git a/main.cpp b/main.cpp index 4e400bf..b659fa7 100644 --- a/main.cpp +++ b/main.cpp @@ -13,6 +13,8 @@ using namespace std; namespace plt = matplot; int MIN_ZERO_SEPARATION = 10; +int POWERED_MIN = 5; +int POWERED_MAX = 5; vector findZeroCrossings(const vector& data) { vector zeroCrossings; @@ -92,67 +94,121 @@ std::vector slice(const std::vector& data, int start, int end) { return {data.begin() + start, data.begin() + end + 1}; } -int main() { - - ifstream dataFile; - dataFile.open("/Users/eliebaier/Workspace/Physique/TP8/DATA/ALL0000/F0000CH1.CSV"); - if (!dataFile.is_open()) { +ifstream openFile(string path) { + ifstream file; + file.open(path); + if(!file.is_open()) { std::cerr << "Error opening file." << std::endl; - return 1; } + return file; +} - string line; +int main() { + vector channels; + channels.push_back(openFile("/Users/eliebaier/Workspace/Physique/TP8/DATA/ALL0012/F0012CH1.CSV")); + channels.push_back(openFile("/Users/eliebaier/Workspace/Physique/TP8/DATA/ALL0012/F0012CH2.CSV")); - // Skipping TEKTRONICS DEFINITION lines - for(auto i = 0; i < 18; i++) { - getline(dataFile, line); - } + vector> channelsXData, channelsYData, channelsZeros; + vector channelsP2P; - std::vector xData, yData; - while(getline(dataFile, line)) { - // Cleaning the lines - line.erase(0, 3); - line.erase(line.size() - 1, line.size()); + for(int channel = 0; channel < channels.size(); channel++) { + string line; - std::string cleanedLine; - for (char c : line) { - if (std::isdigit(c) || c == '.' || c == ',') { - cleanedLine += c; + cout << "[INFO] Starting data fetching for channel " << channel << endl; + + // Skipping the TEKTRONICS DEFINITION lines + cout << "[INFO] Skipping lines used by TEKTRONICS to store device data" << endl; + for(auto i = 0; i < 18; i++) { + getline(channels[channel], line); + } + + cout << "[INFO] Reading channel data" << endl; + vector xs, ys; + while(getline(channels[channel], 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; + } + xs.push_back(x); + ys.push_back(y); + } + + channelsXData.push_back(xs); + channelsYData.push_back(ys); + + cout << "[INFO] Closing channel " << channel << " file" << endl; + channels[channel].close(); + + cout << "[INFO] Finding zeros" << endl; + channelsZeros.push_back(findZeroCrossings(channelsYData[channel])); + + vector frequency; + for(int j = 0; j + 1 < channelsZeros[channel].size(); j=j+2) { + // cout << "[INFO] Processing zeros " << j << " and " << j+1 << endl; + frequency.push_back((channelsXData[channel][channelsZeros[channel][j + 1]] - channelsXData[channel][channelsZeros[channel][j]])); + } + + double avgFrequency = 0; + for(auto freq : frequency) { + avgFrequency += freq; + } + avgFrequency /= (frequency.size()); + avgFrequency *= 2; + cout << "[INFO] Average peak time is " << avgFrequency << "s" << endl; + cout << "[INFO] Average frequency is " << 1/avgFrequency << "Hz" << endl; + + vector mins, maxs; + for(int i = 1; i < channelsZeros[channel].size(); i++) { + // Checking if it's a min or a max by taking the middle and looking at the sign + if(channelsYData[channel][int (channelsZeros[channel][i - 1] + channelsZeros[channel][i])/2] >= 0) { + // This is a max + // cout << "Found max between " << xData[zeroCrossings[i - 1]] << " and " << xData[zeroCrossings[i]] << " "; + // cout << "max is: " << poweredMax(slice(yData, zeroCrossings[i - 1], zeroCrossings[i]), 5).first << endl; + maxs.push_back(poweredMax(slice(channelsYData[channel], channelsZeros[channel][i - 1], channelsZeros[channel][i]), POWERED_MAX).first); + } else { + mins.push_back(poweredMin(slice(channelsYData[channel], channelsZeros[channel][i - 1], channelsZeros[channel][i]), POWERED_MIN).first); } } - double x, y; - istringstream iss(line); - char comma; - if (!(iss >> x >> comma >> y)) { - std::cerr << "Error parsing line: " << line << std::endl; - continue; + double avgMax = 0, avgMin = 0; + for(auto max : maxs) { + avgMax += max; } - xData.push_back(x); - yData.push_back(y); + for(auto min : mins) { + avgMin += min; + } + avgMax /= maxs.size(); + avgMin /= mins.size(); + cout << "[INFO] Average Peak-to-Peak for channel " << channel << " is " << abs(avgMin) + abs(avgMax) << endl; + channelsP2P.push_back(abs(avgMin) + abs(avgMax)); } - dataFile.close(); - - plt::plot(xData, yData); + plt::plot(channelsXData[0], channelsYData[0], channelsXData[1], channelsYData[1]); plt::xlabel("X Label"); plt::ylabel("Y Label"); plt::title("Line Plot"); - vector zeroCrossings = findZeroCrossings(yData); + /* vector 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); - } - - // Finding the powered max between 2 zeros - auto max = poweredMax(slice(yData, zeroCrossings[0], zeroCrossings[1]), 5); - auto min = poweredMin(slice(yData, zeroCrossings[1], zeroCrossings[2]), 5); - - cout << max.first << endl; - cout << min.first << endl; + } */ // Show the plot plt::show();