Domanda

Ho bisogno di trovare la frequenza di un campione, archiviati (in vb), come un array di byte.Campione è una sinusoide, frequenza nota, in modo che io possa controllare), ma i numeri sono un po ' strano, e la mia matematica-pippo è debole.Completa gamma di valori da 0 a 255.Il 99% dei numeri compresi in un range 235 245, ma ci sono alcuni valori anomali a 0 e 1, e fino a 255 nel restante 1%.Come faccio a normalizzare questo per eliminare le sostanze estranee (il calcolo della 235-245 intervallo di come può cambiare con diversi campioni), e come faccio a calcolare poi zero incroci per ottenere la frequenza?Mi scuso se questa descrizione è spazzatura!

È stato utile?

Soluzione

La FFT è probabilmente la miglior risposta, ma se si vuole veramente farlo con il tuo metodo, prova questo:

Per normalizzare, prima di effettuare un istogramma a contare quante occurrances di ogni valore da 0 a 255.Quindi buttare fuori un X per cento dei valori da ciascuna estremità con qualcosa come:

for (i=lower=0;i< N*(X/100); lower++)
  i+=count[lower];
//repeat in other direction for upper

Ora normalizzare con

A[i] = 255*(A[i]-lower)/(upper-lower)-128

Di buttare via i risultati al di fuori dell'-128..127 gamma.

Ora si può contare zero incroci.Per fare in modo che non sono ingannati dal rumore, si potrebbe desiderare di tenere traccia del pendio sopra l'ultimo parecchi punti, e contare solo incroci quando la pendenza media è di andare nel modo giusto.

Altri suggerimenti

Il metodo standard per attaccare questo problema è quello di considerare un blocco di dati, speriamo che almeno due volte la frequenza effettiva (l'assunzione di ulteriori dati non è male, quindi è bene a sovrastimare un po'), poi prendere la FFT e immagino che la frequenza corrisponde al numero più grande la risultante dello spettro FFT.

A proposito, molto simili problemi è stato chiesto qui prima - si potrebbe cercare quelle risposte.

Utilizzare la trasformata di Fourier, è molto più rumore insensibile rispetto al conteggio zero incroci

Edit:@WaveyDavey

Ho trovato una libreria F# per fare un FFT: Da qui

Come si scopre, il miglior libero l'implementazione che ho trovato per F# gli utenti finora è ancora fantastico Libreria FFTW.Il loro sito ha un precompilato DLL di Windows.Ho scritto minimo associazioni che permettono thread-safe accesso a FFTW da F#, con entrambi i guru e semplici interfacce.Le prestazioni sono eccellenti, 32-bit Windows XP Pro è solo fino al 35% più lento di Linux a 64-bit.

Ora sono sicuro che si può chiamare F# lib da VB.net, C#, ecc, che dovrebbero essere nel loro documenti

Se ho capito bene dalla tua descrizione, quello che hai è un segnale che è una combinazione di un seno più costante, più alcuni glitch casuali.Dire, come

x[n] = A*sin(f*n + phi) + B + N[n]

dove N[n] è il "glitch" rumore si vuole sbarazzarsi di.

Se i difetti sono un campione a lungo, è possibile rimuoverli utilizzando un filtro mediano che deve essere più grande che il glitch lunghezza.Su entrambi i lati del glitch.Difetti di lunghezza 1, significa che si avrà abbastanza, con una mediana di 3 campioni di lunghezza.

y[n] = median3(x[n])

La mediana è calcolato così:Prendere i campioni di x si desidera filtrare (x[n-1],x[n] x[n+1]), ordinarli, e l'output è il mezzo.

Ora che il segnale di rumore è lontano, sbarazzarsi del segnale costante.Capisco il buffer è limitata e lunghezza nota, quindi è possibile calcolare la media di tutto il buffer.Sottrarre esso.

Ora avete il vostro unico del seno segnale.È ora possibile calcolare la frequenza fondamentale contando zero incroci.Contare il numero di campioni al di sopra di 0 in cui l'ex campione è stato al di sotto di 0.Il periodo è la quantità totale di campioni del buffer diviso da questo, e la frequenza è l'opposto (1/x) del periodo.

Anche se vorrei andare con la maggioranza e dire che sembra che quello che vuoi è un fft soluzione (algoritmo fft è piuttosto veloce), se fft non è la risposta per qualsiasi ragione, si potrebbe voler provare ad installare una curva sinusoidale ai dati utilizzando un programma di montaggio e leggere la misura di frequenza.

Utilizzando Fityk, è possibile caricare i dati, e in forma di a*sin(b*x-c) dove 2*pi/b vi darà la frequenza dopo il montaggio.

Fityk può essere utilizzato da una gui, da una riga di comando per la creazione di script e ha una API C++ potrebbe essere incluso nei programmi direttamente.

Ho googled per "base fft". Visual Basic FFT La tua domanda urla FFT, ma attenzione, utilizzando FFT senza capire anche un po ' di DSP in grado di portare a risultati che non si capiscono o non sanno da dove vengono.

ottenere la Frequenza Analyzer http://www.relisoft.com/Freeware/index.htm e eseguire e guardare il codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top