[Matlab, Algoritmo LMS]

lorenrus
Salve a tutti
sto implementando l'algoritmo LMS con Matlab.
La struttura dell'algoritmo è riportato nel file in allegato.



Codice fatto da me:

%% Numero di campioni del segnale

N = 512

%% Dati del segnale

Fs = 1000;
Ts = 1/Fs;

%% Dati del campionamento

Fc = 10000;
Tc = 1/Fc;

%% Asse dei tempi

t = 0:Tc:(N-1)*Tc; % Sarebbe il mio k

%% Segnale

x = sin(2*pi*Fs*t);

% plot(t,y)

%% Rumore

r = 0.3.*(2.*rand(1,N)-1);

% plot(r)

%% Segnale + Rumore

z = x + r;

%plot(z)

%% Inizializzo il vettore dei pesi

w = ones(1,N);

%% Ordine del filtro

L = 10;

%% Step size

mu = 0.5;

%% Algoritmo

for i = 1 : (L-1)

for k = 1 : length(t)

y(k) = w(k) * z(k-i);

e(k) = x(k) - y(k);

w(k+i) = w(k) + mu * z(k-i) * e(k);

end

end


Il problema che mi compare ve lo riporto di seguito.




Grazie a tutti

Risposte
packy95
Ciao, ti consiglio di riportare il codice tra i tag "code".

Comunque leggendo velocemente il codice, direi che quando $i>k$ hai un indice negativo in $z$ che ti crea problemi.

lorenrus
Ciao
grazie per aver risposto
SI a quel problema ci ho pensato anche io, solo che essendo questo quello che la mia funzione esprime allora ho pensato ci fosse dell'altro.
Essendo che sono nuovo qui cosa sono i tag code ?

Grazie

lorenrus
Comunque se potete aiutarmi a capire come risolvere quel problema ve ne sarei grato.
Grazie

packy95
Credo che i cicli vadano invertiti. La formula dice: ad ogni tempo (presumo) $k$ somma da $i=0$ a $L-1$.

"lorenrus":

Essendo che sono nuovo qui cosa sono i tag code ?


Quando scrivi una risposta con il tasto "Rispondi" o quando crei un nuovo topic, trovi dei tasti in alto alla casella di testo. Tra questi c'è il tasto "Code" che inserirà automaticamente i tag, per cui ti basterà scrivere il codice al loro interno.

lorenrus
Ho provato ad invertire come tu mi hai detto ma non è cambiato nulla. L'errore è sempre lo stesso e sinceramente non capisco il perchè.

%% Numero di campioni del segnale

N = 512

%% Dati del segnale

Fs = 1000;
Ts = 1/Fs;

%% Dati del campionamento

Fc = 10000;
Tc = 1/Fc;

%% Asse dei tempi

t = 0:Tc:(N-1)*Tc; % Sarebbe il mio k

%% Segnale

x = sin(2*pi*Fs*t);

% plot(t,y)

%% Rumore

r = 0.3.*(2.*rand(1,N)-1);

% plot(r)

%% Segnale + Rumore

z = x + r;

%plot(z)

%% Inizializzo il vettore dei pesi 

w = zeros(1,N);

%% Ordine del filtro

L = 10;

%% Step size

mu = 0.5;

%% Algoritmo

for k = 1:length(t)
    
    for i = 1:(L-1)
        
         y(k) = w(k) * z(k-i);
    end
    
    e(k) = x(k) - y(k);
    
    for i = 1 : (L-1)
        
         w(k+i) = w(k) + mu * z(k-i) * e(k);
    end  
end


Con errore sempre:

Subscript indices must either be real positive integers or logicals.

Error in LMS (line 55)
y(k) = w(k) * z(k-i);

Ora inizialmente pensavo fosse dovuto al fatto che sia i che k partivano dallo stesso valore e quindi z(k-i) = z(0), ma mettendoli diversi, ad esempio k parte da 1 e i da zero, mi da sempre lo stesso errore.

Help voglio capire

Grazie

lorenrus
Chiedo una mano.

Grazie

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.