MATLAB: trovare tre massimi in una risposta in frequenza

Strumenti informatici per la matematica applicata, le simulazioni, il disegno: Mathcad, Matlab, Scilab, Microcap, PSpice, AutoCad ...

Moderatori: Foto Utenteg.schgor, Foto Utentedimaios

Avatar utente
Foto Utentedonaldgray92
10 2
Messaggi: 24
Iscritto il: 28 feb 2013, 18:45
1
voti

[1] MATLAB: trovare tre massimi in una risposta in frequenza

Messaggioda Foto Utentedonaldgray92 » 29 dic 2015, 11:17

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

Avatar utente
Foto Utentedimaios
30,2k 7 10 12
G.Master EY
G.Master EY
Messaggi: 3381
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes
1
voti

[2] Re: MATLAB: trovare tre massimi in una risposta in frequenza

Messaggioda Foto Utentedimaios » 29 dic 2015, 11:34

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".
Ingegneria : alternativa intelligente alla droga.

Avatar utente
Foto Utentedonaldgray92
10 2
Messaggi: 24
Iscritto il: 28 feb 2013, 18:45
0
voti

[3] Re: MATLAB: trovare tre massimi in una risposta in frequenza

Messaggioda Foto Utentedonaldgray92 » 29 dic 2015, 12:18

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?

Avatar utente
Foto Utentedimaios
30,2k 7 10 12
G.Master EY
G.Master EY
Messaggi: 3381
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes
0
voti

[4] Re: MATLAB: trovare tre massimi in una risposta in frequenza

Messaggioda Foto Utentedimaios » 29 dic 2015, 22:31

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.
Ingegneria : alternativa intelligente alla droga.


Torna a “Programmi applicativi: simulatori, CAD ed altro”