Pagina 1 di 1

MATLAB: trovare tre massimi in una risposta in frequenza

Inviato: 29 dic 2015, 11:17
da donaldgray92
Salve a tutti, mi trovo alle prese con una tesina che prevede il filtraggio di un segnale audio con sovrapposte tre sinusoidi di disturbo (frequenze ed ampiezze diverse), con ampiezze comunque molto maggiori rispetto a quella del segnale utile (una voce). L'esperienza prevede di porre tre filtri notch in cascata centrati sulle frequenze di disturbo.
Ho pensato di trovare i massimi oltre una certa ampiezza eseguendo un find sulla risposta in frequenza, quindi porli in un vettore per poi darli in pasto ai tre filtri, però ovviamente ho il problema della simmetria (dovrei poter cercare solo su metà della DFT) e della forma non perfettamente sinusoidale del segnale disturbato che mi fa trovare due picchi distanti di 1-2 campioni (decimi di hertz)....
Non essendo molto pratico di Matlab chiedo, esiste il modo di trovare subito le tre frequenze interessate? Non posso applicare ricorsivamente DFT-->find(max)--->filtro, per via della complessità elevata #-o
Grazie ;-)

Re: MATLAB: trovare tre massimi in una risposta in frequenza

Inviato: 29 dic 2015, 11:34
da dimaios
Se vuoi utilizzare il metodo che hai descritto procedi come segue :

1. Genera un vettore con solo metà dei campioni y=x(1:N/2) oppure y=x(N/2:N) se N è pari altrimenti approssima al campione successivo N/2
2. Nel find utilizza find(y > trigger ). A questo punto ti verranno restituite le coordinate tutti i punti di y che superano il trigger.
3. Separa gli insiemi di punti relativi ai 3 picchi ( magari i primi 5 punti si riferiscono al primo picco i secondi 6 al secondo e i 10 successivi al terzo ).
4. Fai la media dei tre insiemi per centrare la frequenza delle sinusoidi
5. Sintetizza il filtro notch per eliminare le 3 frequenze impostando una banda sufficiente a compensare quei 0.1 o 0.2 Hz dovuti a quella che tu chiami "distorsione".

Re: MATLAB: trovare tre massimi in una risposta in frequenza

Inviato: 29 dic 2015, 12:18
da donaldgray92
grazie mille, intanto sono riuscito a costruirmi un segnale metà della DFT, chiamiamola x, che mi va da 0 a 216000 campioni.... ho pensato che il procedimento più semplice potrebbe essere trovare ricorsivamente i tre massimi con un semplice find(x==max(x)), mettendo però di volta in volta a zero una porzione della x contenente il picco trovato in precedenza (max), supponendo l'ampiezza (delta) nota...
in tal caso come posso costruire una funzione rect che mi prenda le porzioni di x da 1 a max-delta e da max+delta a 216000?

Re: MATLAB: trovare tre massimi in una risposta in frequenza

Inviato: 29 dic 2015, 22:31
da dimaios
Ok se vuoi utilizzare i metodi di Sparta anzichè quelli di Atene puoi fare così.

Trova il primo massimo che sarà nel punto M del vettore x.

A questo punto puoi azzerare il vettore da M-delta a M+delta con il comando :

Codice: Seleziona tutto

x(M-delta:M+delta) = zeros(1,2M+1);


potrebbe anche essere zeros(2M+1,1) a seconda che x sia un vettore riga anzichè colonna.

A questo punto ricerchi l'altro massimo con a funzione find e così via fino al termine.

Con un for di 3 elementi hai concluso.

Ovviamente dovresti verificare che (M-delta ) > 0 e che ( M+delta ) <= length(x) altrimenti sfori il vettore quando tenti di mettere a zero gli elementi.