[Matlab, Algoritmo LMS]
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
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
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.
Comunque leggendo velocemente il codice, direi che quando $i>k$ hai un indice negativo in $z$ che ti crea problemi.
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
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
Comunque se potete aiutarmi a capire come risolvere quel problema ve ne sarei grato.
Grazie
Grazie
Credo che i cicli vadano invertiti. La formula dice: ad ogni tempo (presumo) $k$ somma da $i=0$ a $L-1$.
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":
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.
Ho provato ad invertire come tu mi hai detto ma non è cambiato nulla. L'errore è sempre lo stesso e sinceramente non capisco il perchè.
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
%% 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
Chiedo una mano.
Grazie
Grazie