25 const std::vector<std::vector<double>>& signals) {
26 int approaching_count = 0;
27 int departing_count = 0;
28 for (std::size_t i = 0; i < signals.size(); ++i) {
29 while (signal_stats_.size() <= i) {
30 signal_stats_.push_back({});
39 if (approaching_count > departing_count) {
42 if (approaching_count < departing_count) {
49 const std::size_t channel_index,
const std::vector<double>& signals) {
50 static constexpr int kStartFrequency = 3;
51 static constexpr int kFrameNumStored = 10;
52 std::vector<std::complex<double>> fft_results =
fft1d(signals);
53 SignalStat signal_stat = GetSignalStat(fft_results, kStartFrequency);
54 signal_stats_[channel_index].push_back(signal_stat);
55 while (
static_cast<int>(signal_stats_[channel_index].size()) >
57 signal_stats_[channel_index].pop_front();
60 MovingResult power_result = AnalyzePower(signal_stats_[channel_index]);
65 AnalyzeTopFrequence(signal_stats_[channel_index]);
66 return top_frequency_result;
70 const std::deque<SignalStat>& signal_stats) {
71 int n =
static_cast<int>(signal_stats.size());
75 double first = signal_stats[n - 3].power();
76 double second = signal_stats[n - 2].power();
77 double third = signal_stats[n - 1].power();
78 if (first < second && second < third) {
81 if (first > second && second > third) {
88 const std::deque<SignalStat>& signal_stats) {
89 int n =
static_cast<int>(signal_stats.size());
93 int first = signal_stats[n - 3].top_frequency();
94 int second = signal_stats[n - 2].top_frequency();
95 int third = signal_stats[n - 1].top_frequency();
96 if (first < second && second < third) {
99 if (first > second && second > third) {
106 const std::vector<double>& signal) {
107 int n =
static_cast<int>(signal.size());
110 for (
int i = 0; i < n; ++i) {
111 in[i][0] = signal[i];
115 fftw_plan p = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
118 std::vector<std::complex<double>> output;
120 for (
int i = 0; i < n; ++i) {
121 output.emplace_back(out[i][0], out[i][1]);
126MovingDetection::SignalStat MovingDetection::GetSignalStat(
127 const std::vector<std::complex<double>>& fft_results,
128 const int start_frequency) {
129 double total_power = 0.0;
130 int top_frequency = -1;
131 double max_power = -1.0;
132 for (
int i = start_frequency; i < static_cast<int>(fft_results.size()); ++i) {
133 double power = std::abs(fft_results[i]);
134 total_power += power;
135 if (power > max_power) {
140 return {total_power, top_frequency};
std::vector< std::complex< double > > fft1d(const std::vector< double > &signals)
MovingResult DetectSingleChannel(const std::size_t channel_index, const std::vector< double > &signal)
MovingResult Detect(const std::vector< std::vector< double > > &signals)
@description detect if the sound is approaching or departing