Browse Source

Rewrite the aggreation algorithm

Xi Ruoyao 5 years ago
parent
commit
36c613d72e
2 changed files with 29 additions and 27 deletions
  1. 2 2
      README.md
  2. 27 25
      main.cc

+ 2 - 2
README.md

@@ -5,8 +5,8 @@
 	[aggregation]
 	; 每 ts 秒产生一个数据点,必须是 0.0001 的整倍数,否则会被取整。
 	ts = 5.00
-	; 以宽度为 tav 秒的矩形窗对数据点进行滑窗求和,必须是 ts 的整倍数,
-	; 否则会被取整。
+	; 每个数据点输出 tav 秒内的计数,必须是 0.0001 的整倍数,
+	; 否则会被取整。建议不要小于 ts 。
 	tav = 20.00
 
 	[debug]

+ 27 - 25
main.cc

@@ -66,7 +66,7 @@ adc_data_to_particles(const std::vector<adc_sample> &sample)
 	for (size_t i = 0; i < sample.size() - crit; i++) {
 		bool ok = true;
 		for (size_t j = 0; j < crit; j++)
-			if (sample[i+j].v > 0)
+			if (sample[i+j].v > 0 || sample[i+j].v < -10)
 				ok = false;
 		if (ok) {
 			ret.push_back({i, sample[i].fl_time, sample[i].fired});
@@ -102,36 +102,38 @@ static flight_data current = {0, 0, 0};
 static std::map<uint32_t, flight_data> FDR;
 
 static void dump_particles_aggr(const std::vector<particle> particles,
-								int id, uint32_t ts, size_t win_size)
+								int id, uint32_t ts, uint32_t tw)
 {
 	std::ofstream out(std::string("rm100_aggreated_") + "01"[id] + ".csv");
 	out << "fl_time,cnt,gps_height,ils_height\n";
-	uint32_t t0 = 0;
 	size_t cnt = 0;
+
+	uint32_t last_time = particles.rbegin()->fl_time;
+	auto cmp = [](particle a, particle b) {
+		return a.fl_time < b.fl_time;
+	};
+
+	auto first = particles.begin();
+	while (first != particles.end() && !first->fired)
+		++first;
+
 	std::vector<size_t> sum;
-	for (particle p: particles)
-		if (p.fired) {
-			while (t0 + ts < p.fl_time) {
-				sum.push_back(cnt);
-				cnt = 0;
-				t0 += ts;
-			}
-			cnt++;
-		}
+	for (uint32_t t0 = 0; t0 < last_time; t0 += ts) {
+		auto a = std::lower_bound(first, particles.end(),
+				                  particle{0, t0, 0}, cmp);
+		auto b = std::lower_bound(first, particles.end(),
+				                  particle{0, t0+tw, 0}, cmp);
+		sum.push_back(b - a);
+	}
 
-	cnt = 0;
 	flight_data fd{0, 0, 0};
 	for (size_t i = 0; i < sum.size(); i++) {
-		cnt += sum[i];
-		if (win_size < i)
-			cnt -= sum[i-win_size-1];
-		if (win_size <= i) {
-			if (FDR.find(ts*(i-win_size)) != FDR.end())
-				fd = FDR[ts*(i-win_size)];
-			out << (i-win_size) * ts * 0.0001 <<
-				',' << cnt * 1. <<
-				',' << fd.gps_height << ',' << fd.ils_height << '\n';
-		}
+		auto cnt = sum[i];
+		if (FDR.find(ts*i) != FDR.end())
+			fd = FDR[ts*i];
+		out << i * ts * 0.0001 <<
+			',' << cnt * 1. <<
+			',' << fd.gps_height << ',' << fd.ils_height << '\n';
 	}
 }
 
@@ -280,8 +282,8 @@ static int process_telemetry_data(void *ptr, size_t sz)
 			dump_rm100_raw_data(0);
 		auto particles = adc_data_to_particles(rm100_data[k]);
 		dump_particles(particles, k);
-		dump_particles_aggr(particles, k, (int)(conf_aggr_ts * 10000 + 0.5),
-							(int)(conf_aggr_tav/conf_aggr_ts + 0.5));
+		dump_particles_aggr(particles, k, (int)(conf_aggr_ts * 10000),
+							(int)(conf_aggr_tav * 10000));
 	}
 	return 0;
 }