Penso che tutte queste risposte finora sono piuttosto male (compreso il mio precedente ...) dopo aver pensato che il problema attraverso un po 'più vorrei suggerire quanto segue:
1) prendere un 1 secondo esempio del segnale di input (non è necessario essere così grande, ma semplifica alcune cose)
2) per l'intero secondo, contare gli zero-crossing. a questo punto hai i cps (cicli al secondo) e conosci la frequenza dell'oscillatore. (nel caso fosse qualcosa che volevi sapere)
3) ora prendi un segmento più piccolo del campione con cui lavorare: prendi esattamente 7 valichi zero. (quindi il buffer di lavoro dovrebbe ora, se visualizzato, apparire come una delle rappresentazioni grafiche che hai postato con la domanda originale). Utilizzare questo piccolo buffer di lavoro per eseguire i seguenti test. (normalizzare il buffer di lavoro a questo punto potrebbe semplificarci la vita)
4) test per onda quadra: zero incroci per un'onda quadra sono sempre differenze molto grandi, cercare un grande delta del segnale seguito da poco o nessun movimento fino a il prossimo passaggio a zero.
5) test per onda sega: simile all'onda quadra, ma un delta del segnale grande sarà seguito da un delta del segnale costante lineare.
6) test per onda triangolare: costante delta lineare (piccolo). trova i picchi, dividi per la distanza tra loro e calcola come dovrebbe apparire l'onda triangolare (idealmente) ora prova il segnale effettivo di devianza. imposta una soglia di tolleranza della devianza e puoi determinare se stai guardando un triangolo o un seno (o qualcosa di parabolico).
puoi, con sicurezza, assumere che l'ingresso sia un segnale monofonico? (vale a dire una singola nota suonata da una singola instrtrument?) – kent
Sì. Non ho una particolare applicazione in mente, ma immagino ondate periodiche continue di una singola frequenza. – endolith