enlace
......
y no se trata de ...
Software de programación para PC.
...
Esta pregunta es algo ... ish fuera de tema. Pero pensé que, dado que conozco una solución C ++, es mejor que la comparta.
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[]){
if(argc!=2){
cout << "Drop a file on me or"<<
"call me from the command line with one argument.\n\n";
//cin.get();//pause, useful for when you drop a file onto the exe.
return 1;
}else{
cout << "You rang?\n\n";
}
string suffix(argv[1]);//convert to string
if(suffix.length()<5){
//bad names are: "t", "xt", "txt", ".txt"
//good names are: "a.txt" or "abc.txt"
cout << "Doesn't look good Sonny," <<
" give me a file on the format of \"*.txt\".\n\n";
//cin.get();//pause, useful for when you drop a file onto the exe.
return 1;
}else{
cout << "The length checks out.\n\n";
}
suffix.erase(0,suffix.length()-3);
if(suffix!="txt"){
cout << "Accepted type is \"txt\", yours is \"" << suffix << "\"\n\n";
//cin.get();//pause, useful for when you drop a file onto the exe.
return 1;
}else{
cout << "Got a file of the correct type. Let's proceed.\n\n";
cout << "===========================================\n\n";
}
ifstream file(argv[1]);//let's finally open the file
string row; //contains row of document, with a ',' as a delimiter
unsigned int samples,
sample_rate,
ground,data,
previous_data,
zero_crossing=0,
end=0,
start=-1;
//First get the number of samples and sample rate.
getline(file,row,'-');//throw away first part
file >> samples; //acquired samples.
cout << "Number of samples = " << samples << endl;
getline(file,row,',');//skip
getline(file,row,',');//skip
file >> sample_rate; //acquired the sample rate
cout << "Sample rate = " << sample_rate << endl;
getline(file,row,',');//skip
getline(file,row,',');//skip
file >> ground;
cout << "Ground level = " << ground << endl << endl;
//Okay, now we just need to read the rest of the document
for(unsigned int i=0;i<samples;++i){
getline(file,row,',');//skip the "Data0" text
previous_data=data;
file >> data;
if(data<ground && previous_data>=ground){
//we've just passed ground and we're going upwards.
if(start==-1){
//is this the first time we've came across this zero crossing?
start=i;
}else{
zero_crossing++;
//this is a potential stop
end=i;
}
}
}
double mean_period = (end-start)/((double)zero_crossing);
double frequency = sample_rate / mean_period;
cout << "First occurance of a negative edge = " << start << endl;
cout << "Last occurance of a negative edge = " << end << endl;
cout << "Length between those two = " << end-start << endl;
cout << "Number of crossings detected = " << zero_crossing << endl;
cout << "Mean length per period = " << mean_period << endl;
cout << "Frequency = " << frequency << endl;
cout << endl << endl;
//cin.get();//pause, useful for when you drop a file onto the exe.
return 0;
}
Compilado con el siguiente comando: " g ++ -std = c ++ 11 main.cc ", asumiendo que guarda el código anterior en un archivo llamado " main.cc ".
He intentado comentar cosas que "parecen extrañas" o necesitan algunos comentarios para que sea más fácil de seguir.
El algoritmo es esencialmente: Detecta cero cruces con una derivada negativa. Registre la primera vez y la última vez que ocurrió y cuente cuántas veces ocurrió.
Resta la primera vez de la última vez para obtener la longitud de N períodos. N períodos que son iguales al número de cruces por cero ocurridos. Ahora tiene la duración de un período que se ha promediado en todos los períodos detectados.
Calcule la frecuencia dividiendo la frecuencia de muestreo con la duración de un período y presente estos datos.
Así es como se ve en acción, en una máquina Linux.
Noestoysegurodesisoymalo,peronopudecolocarunarchivoenelarchivo"a.out", por lo que no pude probar lo que normalmente podría hacer en Windows. Pero dejé algunos comandos de "pausa" en el código que puede eliminar en caso de que quiera ver la información.