Bonjour
j'ai un signal à filtrer que je souhaite filtrer avec un filtre adaptatif pour retirer le bruit. Mais dans un premier temps je voulais tester l’algorithme LMS avec des signaux simple, j'ai fait deux essais :
=> une constante bruité : la encore deux variante
- une constante d'amplitude 2 volts bruité (le bruit avec un offset de 2)
- Une constante d'amplitude 0 volt bruité (le bruit seul)
=> une sinusoïde bruité : la encore deux variante
- une sinusoïde avec un offset de 2 volt
- une sinusoïde centré en 0
Dans mes essais plusieurs choses m'intrigue :
- Quelque soit la courbe, lorsque j'ajoute un offset, j'observe une dégradation des performances. C'est à dire que le filtre n'est jamais vraiment stable et le signal utile est parfois dégradé.
- lorsque je modifie mu, le pas d'adaptation, ceci est vraiment significatif sur les courbe qui n'ont pas d'offset. Sur les autres, ça ne le rend pas plus stable
- Si j'augmente le nombre de coefficient du filtre, mon signal utile (ie : l'erreur, puisqu'on est dans le cas "suppression de bruit" de l'utilisation du filtre adaptatif), se dégrade.
Et je ne comprend pas pourquoi le filtre agit de la sorte. le filtrage adaptatif de Wiener (ie l'aglo LMS entre autre), est supposé bien marcher pour des signaux stationnaire. Mais il semblerait que l'amplitude joue aussi. J'aimerais donc être sûr qu'il ne s'agit pas d'une erreur dans mon code et si ce n'est pas le cas, comprendre pourquoi l'aglo agit de la sorte ?? je vous le met à la suite :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 N = 11; mu = 0.01; LMSFilter = dsp.LMSFilter('Method','LMS','Length',N,'StepSize',mu,'WeightsOutput','All'); sinewave = dsp.SineWave('Frequency',1,'SampleRate',400,'SamplesPerFrame',10000); d = 0.4*sinewave(); x = 0.4*randn(length(d),1); d = d + x; % d = zeros(1,30000); % d = d + 2; % x = 0.1*randn(length(d),1); % d = d + x'; % Use LMS Filter => return filtered signal, error and weights vector. [y,e,w] = LMSFilter(x,d); figure subplot(4,1,1) plot(d);ylabel('Noisy signal') subplot(4,1,2); plot(y);ylabel('y') subplot(4,1,3); plot(e);ylabel('e') subplot(4,1,4); plot(w(:,1));ylabel('w(:,1)')