Stimare il tempo di inizio di un tono scoppiato nel rumore?


14

Quali tecniche si potrebbero usare per stimare il tempo di insorgenza di un tono sinusoidale scoppiato in un segnale rumoroso?

Supponiamo che il burst del tono abbia una frequenza fissa nota (ma fase sconosciuta) e un tempo di salita molto acuto, e che l'obiettivo sia stimare il tempo di insorgenza entro la metà del tempo di salita e / o un periodo della frequenza del tono , se possibile. Come potrebbero cambiare le tecniche di stima se il rapporto S / N è molto basso (molto meno di 1)?

Aggiunto: supponiamo che il burst dei toni sia di lunghezza sconosciuta, ma più lungo di un piccolo multiplo del tempo di salita e del periodo di frequenza.

Aggiunto: un DFT / FFT mostra l'esistenza molto probabile di un tono. Il problema è capire con esattezza dove nella finestra FFT il tono (o forse un'esplosione di più toni della stessa frequenza) potrebbe essere iniziato all'interno della finestra FFT o determinare se il tono corrente è iniziato fuori da quella finestra DFT, a condizione che io abbia tutto ciò dati aggiuntivi nel dominio del tempo.

L'accuratezza del rilevamento degli impulsi radar è più vicina alla risoluzione di cui ho bisogno, tranne per il fatto che ho solo un limite, poiché il tono ha una lunghezza sconosciuta e, a parte un tempo di salita noto, non modulato. I filtri passa banda stretti distorcono il tempo di salita e quindi eliminano la risoluzione della stima dell'arrivo del bordo.


1
Possiamo supporre qualcosa sul rumore? È fermo? Segue una sorta di distribuzione?
Phonon,

2
I falsi allarmi del tuo rivelatore sono indesiderabili? Hai una specifica sulla probabilità di rilevare correttamente ogni impulso? Questo è molto simile all'elaborazione del segnale radar front-end (una versione semplificata); localizzare impulsi (possibilmente modulati) incorporati nel rumore e stimarne i parametri.
Jason R,

1
Hai bisogno di farlo in tempo reale o è un'analisi offline?
nibot,

2
@ hotpaw2: Cosa non ti è piaciuto dell'algoritmo Goertzel secondo questa risposta SO ?
Peter K.

1
L'algoritmo Goertzel viene utilizzato per il rilevamento dei toni, che sembra essere ciò che stai cercando. L'uscita del filtro è una stima della "potenza" del segnale alla frequenza per la quale è sintonizzato. Scegli una soglia. Se l'uscita del filtro è superiore a questa, è stato rilevato un tono. Imposta la soglia in modo appropriato e puoi rilevare in anticipo l'insorgenza del tono (ed essere anche più incline ai falsi allarmi).
Peter K.

Risposte:


6

Come abbiamo discusso nei commenti, l' algoritmo di Goertzel è il solito modo per rilevare un tono nel rumore. Dopo la discussione, non sono sicuro che sia esattamente quello che stai cercando (vuoi il tempo di insorgenza ), ma sembrava esserci confusione su come l'algoritmo di Goertzel potrebbe essere applicato al tuo problema, quindi ho pensato di scriverlo Qui.

Algoritmo di Goertzel

L'algoritmo Goertzel è buono da usare se conosci la frequenza del tono che stai cercando (chiamalo fg ) e se hai un'idea ragionevole del livello di rumore in modo da poter selezionare una soglia di rilevamento appropriata.

L'algoritmo di Goertzel può essere considerato come il calcolo dell'output di ONE FFT bin:

y(n)=eȷ2πfgnΣK=0nX(n)e-ȷ2πfgK

dove è la frequenza che stai cercando.fg

La pagina di Wikipedia ha un modo migliore per calcolare questo.

Ecco un tentativo (debole) di Scilab di implementarlo:

function [y,resultr,resulti] = goertzel(f_goertzel,x)
realW = 2.0*cos(2.0*%pi*f_goertzel);
imagW = sin(2.0*%pi*f_goertzel);

d1 = 0;
d2 = 0;

for n = 0:length(x)-1,
    y(n+1) = x(n+1) + realW*d1 - d2;
    d2 = d1;
    d1 = y(n+1);
    resultr(n+1) = 0.5*realW*d1 - d2;
    resulti(n+1) = imagW*d1;
end
endfunction

Considera il segnale con e ϕ = 4,4318752 :f=0.0239074φ=4.4318752

X=peccato(2πfn+φ)+ε(n)

dove è media zero, varianza unitaria rumore bianco gaussiano.ε(n)

In questo esempio, il tono inizia un terzo del segnale nel segnale all'indice 1001.

Se eseguiamo l'algoritmo di Goertzel su di esso con , otteniamo le prime due tracce della figura.fg=f-0,001

fg=f , otteniamo le due tracce inferiori della figura.

Le quattro tracce sono:

  • Xyfg=0.0229074
  • reSultr2+reSultio2
  • Xyfg=0.0239074
  • reSultr2+reSultio2

Come puoi vedere, il caso in cui il tono a cui siamo interessati è un picco di circa 250. Se impostiamo la soglia di rilevamento a circa la metà di questo valore (125), allora si verifica il rilevamento (il valore con radice quadrata è maggiore di 125 ) circa all'indice 1450 --- 450 campioni dopo l'inizio del tono.

Questa soglia (125) non provocherà un rilevamento nell'altro caso (per questa corsa, comunque), ma il valore massimo di quell'uscita è 115.24, non possiamo ridurre troppo la soglia senza ottenere un falso rilevamento.

Ridurre la soglia a 116 provocherà il rilevamento nel caso vero (per questa corsa) all'indice 1401 ... ma corriamo il rischio di ulteriori falsi allarmi.

inserisci qui la descrizione dell'immagine


Un filtro Goertzel in esecuzione è più adatto se si sta solo cercando una stima dell'esistenza all'interno di una finestra di lunghezza fissa. Un Goertzel in esecuzione senza un termine di perdita / decadimento modifica la sua larghezza di banda per la sua lunghezza e la larghezza di banda più stretta più avanti nel tempo fornisce una stima del tempo di arrivo in peggioramento, più sensibile al rumore e agli errori di soglia.
hotpaw2,

@ hotpaw2: corretto. Puoi introdurre un "fattore di dimenticanza" per far funzionare Goertzel, ma per il resto ricorda tutto.
Peter K.

Ricorda tutto? È una FIR che può essere implementata in forma ricorsiva. Cosa mi sono perso qui?
Oliver Charlesworth,

y(n)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.