2009-07-17 4 views
6

Senza alcuna interazione dell'utente, come potrebbe un programma identificare quale tipo di forma d'onda è presente in una registrazione da un ADC?Identificazione delle forme d'onda periodiche comuni (quadrate, sinusoidali, a dente di sega, ...)

Per rispondere a questa domanda: onde triangolari, quadrate, sinusoidali, semi-sinusoidali o seghettate a frequenza costante. Il livello e la frequenza sono arbitrari e avranno rumore, piccole quantità di distorsione e altre imperfezioni.

Various waveforms

io propongo un paio di idee (naive), troppo, e si possono votare su o giù.

+1

puoi, con sicurezza, assumere che l'ingresso sia un segnale monofonico? (vale a dire una singola nota suonata da una singola instrtrument?) – kent

+0

Sì. Non ho una particolare applicazione in mente, ma immagino ondate periodiche continue di una singola frequenza. – endolith

risposta

7

Si consiglia di iniziare prendendo un autocorrelazione per trovare la fondamentale.

Con ciò, prendere un punto (approssimativamente) della forma d'onda.

Ora prendi un DFT di quel segnale e compensa immediatamente lo sfasamento del primo bin (il primo bin è fondamentale, il tuo compito sarà più semplice se tutte le fasi sono relative). Adesso normalizza tutti i raccoglitori in modo che il fondamentale abbia guadagno unitario.

Ora confronta e contrappone il resto dei bin (che rappresentano le armoniche) rispetto a un set di forme d'onda pre-memorizzate che sei interessato a testare. Accettare il più vicino e rifiutare in generale se non riesce a soddisfare qualche soglia per la precisione determinata dalle misurazioni del rumore di fondo.

+0

Dovresti anche tenere traccia di quel cambiamento di fase, per identificare le diverse polarità delle onde, giusto? – endolith

+0

Infatti. Sarà molto più facile anche se hai compensato la fase fondamentale. –

+0

Sarebbe meglio prendere la FFT di diversi periodi dell'onda, per quanto riguarda il rifiuto del rumore. – endolith

3

Eseguire una autocorrelazione per trovare la frequenza fondamentale, misurare il livello RMS, trovare il primo zero-crossing e quindi provare a sottrarre forme d'onda comuni a quella frequenza, fase e livello. Chiunque cancelli le migliori (e più di alcune soglie) vince.

+0

Penso che questo sia l'approccio più pratico, supponendo che anche tu possa variare la fase delle forme d'onda di confronto. – MusiGenesis

+0

Si potrebbe capire la fase trovando prima uno zero crossing in modo da non perdere tempo spostando le onde in ogni fase possibile. – endolith

4

Esegui una FFT, trova i picchi armonici dispari e pari e confronta la velocità con cui diminuiscono in base ad una libreria di forme d'onda comuni .. rapporti di picco.

+0

Questo metodo sembra più robusto rispetto al dominio del tempo, dal momento che è ancora possibile identificare le onde che sono avvenute attraverso sfasamento e filtraggio. – endolith

0

Armatevi con più informazioni ...

Io parto dal presupposto che sai già che una sinusoide teoricamente perfetta non ha nessun parziali armoniche (cioè solo una fondamentali) ... ma dal momento che si stanno attraversando un ADC puoi lanciare l'idea di un'onda sinusoidale teoricamente perfetta fuori dalla finestra ... devi combattere contro l'aliasing e determinare quali sono i "veri" parziali e quali sono gli artefatti ... buona fortuna.

le seguenti informazioni provengono da this link about csound.

(*) Un dente di sega contiene (teoricamente) un numero infinito di parziali armoniche, ciascuna nel rapporto del reciproco del numero parziale. Quindi, il fondamentale (1) ha un'ampiezza di 1, il secondo parziale 1/2, il terzo 1/3 e l'enimo 1/n.

(**) Un'onda quadra contiene (teoricamente) un numero infinito di parziali armonici, ma solo armoniche dispari (1,3,5,7, ...) Le ampiezze sono nel rapporto del reciproco del numero parziale, proprio come le onde a dente di sega. Quindi, il fondamentale (1) ha un'ampiezza di 1, il terzo parziale 1/3, il quinto 1/5 e l'enimo 1/n.

2

Questa risposta non presume alcun rumore e questo è un semplice esercizio accademico.

Nel dominio del tempo, prelevare il campione per differenza campione della forma d'onda. Istogramma i risultati. Se la distribuzione ha un picco (modo) nettamente definito a zero, è un'onda quadra.Se la distribuzione ha un picco ben definito ad un valore positivo, è un dente di sega. Se la distribuzione ha due picchi nettamente definiti, uno negativo e uno positivo, è un triangolo. Se la distribuzione è ampia e raggiunge il massimo da entrambi i lati, è un'onda sinusoidale.

0

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).

+1

Supponendo che si tratti di dati audio reali, il conteggio dei passaggi a zero non funzionerà molto bene. Come ha sottolineato Dave Gamble, l'autocorrelazione è il modo migliore per determinare la frequenza fondamentale di un segnale audio. – MusiGenesis

+1

A meno che il segnale non sia molto rumoroso, il conteggio degli attraversamenti zero dovrebbe funzionare. Sarebbe meglio misurare la distanza tra zero incroci, eliminare eventuali valori anomali e, comunque, la media. – endolith

0

Prima trovare la frequenza di base e la fase. Puoi farlo con FFT. Normalizza il campione. Quindi sottrarre ciascun campione con il campione della forma d'onda che si desidera testare (stessa frequenza e stessa fase). Piazza il risultato aggiungi tutto e dividilo per il numero di campioni. Il numero più piccolo è la forma d'onda che cerchi.

Problemi correlati