int partition(const vector<string>& args) { if (args.size() != 2) throw runtime_error(usage_); const string& filename = args[0]; int partitionCount = atoi(args[1].c_str()); if (partitionCount < 2) throw runtime_error("Nothing to do."); TransientData td(filename); if (td.data().size() % partitionCount != 0) throw runtime_error("Must choose an even partition."); int partitionSize = td.data().size()/partitionCount; double partitionDuration = td.observationDuration()/partitionCount; for (int i=0; i<partitionCount; i++) { TransientData partition; partition.startTime(td.startTime() + partitionDuration*i); partition.observationDuration(partitionDuration); partition.A(td.A()); partition.B(td.B()); partition.data().resize(partitionSize); copy(td.data().begin()+(partitionSize*i), td.data().begin()+(partitionSize*(i+1)), partition.data().begin()); partition.write(partitionFilename(filename, i, digitCount(partitionCount-1))); } return 0; }
void sinusoidTest() { TransientData td; td.observationDuration(T_); td.A(A_); td.B(B_); td.data().resize(sampleCount_); SinusoidSignal signal; td.add(signal); td.write("sinusoid.dat"); FrequencyData fd; td.computeFFT(1, fd); fd.write("sinusoid.cfd"); }
void testInteraction(double separation) { double f1 = 100000/.768; double f2 = f1 + separation; CombinedSignal signal; const double A = 1; const double tau = .768; signal.push_back(DecayingSinusoid(A, tau, f1, 0)); signal.push_back(DecayingSinusoid(A, tau, f2, 0)); TransientData td; td.observationDuration(T_); td.A(A_); td.B(B_); td.data().resize(sampleCount_); td.add(signal); FrequencyData fd; td.computeFFT(1, fd); vector<PeakInfo> peaks; peaks.push_back(PeakInfo(f1)); peaks.push_back(PeakInfo(f2)); int windowRadius = 10; int iterationCount = 20; auto_ptr<FrequencyEstimatorPhysicalModel> estimator = FrequencyEstimatorPhysicalModel::create(windowRadius, iterationCount); vector<PeakInfo> estimatedPeaks; estimator->estimateFrequencies(fd, peaks, estimatedPeaks, ""); if (estimatedPeaks.size() != 2) throw runtime_error("not happening"); cout << setprecision(2) << fixed << setw(10) << separation << setw(15) << setprecision(8) << estimatedPeaks[0].frequency - f1 << " " << setw(15) << setprecision(8) << estimatedPeaks[1].frequency - f2 << " " << endl; }