Matlab - Filterung EEG-Signal

From XennisWiki
Jump to: navigation, search

Programm zur Filterung (Glättung) eines EEG-Signals mit Hilfe geeigneter Filtermasken.

eegSignal.txt (Auszug)

  7.5000000e+000
  5.0000000e+000
 -1.0000000e+000
 -2.0000000e+000

filterFIR.m

function [y] = filterFIR (xOrg, h)
% xOrg: zu filternde Signal
% h: sysmmetrische Filtermaske
% y: gefiltertes Signal

	% Filterordnung M
	M = length(h) - 1;
	m = M/2;

	% Spiegelung der ersten bzw. letzten M/2 Signalwerte
	xPad1 = xOrg(m : -1 : 1);
	xPad2 = xOrg(end : -1 : end-m+1);
	x = [xPad1; xOrg; xPad2];

	% Signal filtern (y)
	y = zeros(length(xOrg), 1);
	for n = 1 : length(xOrg)
		y(n) = dot(h, x(n:n+M));
	end

end

signalSmoothing.m

% --- GRUNDLAGEN ---

% Datei öffnen und Signal in Speicher laden (xOrg)
xOrg = load('eegSignal.txt', '-ascii');
xL = length(xOrg);

% Grafische Darstellung des eingelesenen Signals
figure(1);
subplot(2,2,1);
plot(1:xL,xOrg,'k-');
title('Ungefiltertes EEG-Signal x')
xlabel('n');
ylabel('Amplitude/micro V');
legend('x-ungefiltert');

%
% Symmetrisch gleitende Mittelwertberechnung für die Filterordnung M
%
M = 6; % Filterordnung M
m = M/2;

% Spiegelung der ersten bzw. letzten M/2 Signalwerte
xPad1 = xOrg(m :-1 : 1);
xPad2 = xOrg(end : -1 : end-m+1);
x = [xPad1; xOrg; xPad2];

% Signal filtern (y)
y = zeros(xL, 1);
faktor = 1/(M+1);
for n = 1 : xL
    y(n) = faktor * sum(x( n:n+M ));
end

% Plot des geglätteten Signals y und des Originalsignals x
plotWerte = 1 : floor(xL * 0.1); % Darstellung auf die ersten 10% der Werte beschränken
subplot(2,2,2);
plot(plotWerte, xOrg(plotWerte), 'b-', plotWerte, y(plotWerte), 'r-')
title('Ungefiltertes EEG-Signal x und geglättetes Signal y')
xlabel('n')
ylabel('Amplitude/mikroV')
legend('x-ungefiltert','y-gefiltert');

Matlab Filterung EEG Signal Ungefiltert.png

Matlab Filterung EEG Signal Gefiltert.png

Fortsetzung signalSmoothing.m

% --- VARIATION DES FILTERKERNELS ---

hAver7 = 1/7 * ones(7, 1);                 % Filtermaske nach Gl. 1
yAver7 = filterFIR(xOrg, hAver7);          % Gefiltertes Signal

% Differenz von y und yAver7
maxDifferenz = max(y - yAver7);
if maxDifferenz > 10^(-12)
    fprintf('Maximale Differenz von y und yAver7 ist größer als 10^(-12): %f\n', maxDifferenz);
else
    fprintf('Maximale Differenz von y und yAver7 ist kleiner als / gleich 10^(-12): %f\n', maxDifferenz);
end

% Filterung unter Verwendung verschiedener Filtermasken
hBinom7 = 1/64 * [1 6 15 20 15 6 1]';       % Filtermaske nach Gl. 4
yBinom7 = filterFIR(xOrg, hBinom7);

% Plot Filterkernel
subplot(2,2,3);
plot(-3:3,hBinom7,'r.-', -3:3,hAver7,'b.-');
title('Filterkernel: Gl. (1) und (2)')
xlabel('n')
ylabel('Amplitude/mikroV')
legend('h binom7', 'h aver7');

% Plot Signale (ersten 10% der Werte)
subplot(2,2,4);
plot(plotWerte, xOrg(plotWerte), 'g-', plotWerte, yBinom7(plotWerte), 'r-', plotWerte, yAver7(plotWerte), 'b-')
title('Anwendung Filterkernel: Gl. (1) und (2)')
xlabel('n')
ylabel('Amplitude/mikroV')
legend('x-ungefiltert', 'y binom7', 'y aver7');

Matlab Filterung EEG Signal binom7 und aver7.png

Matlab Filterung EEG Signal binom7 und aver7 2.png

Fortsetzung signalSmoothing.m

% --- VERSTÄRKKUNG DER FILTERWIRKUNG ---

% Filterung unter wiederholter Verwendung des symmetrisch gleitenden Mittelwertes
yAver7 = zeros(xL, 5);                     % Filtermaske nach Gl. 1
temp = xOrg;
for i = 1:5
    temp = filterFIR(temp, hAver7);
    yAver7(:,i) = temp;
end

% hAver9
hAver9 = 1/9 * ones(9, 1);                 % Filtermaske nach Gl. 1
yAver9 = filterFIR(xOrg, hAver9);

% Plot (ersten 10% der Werte)
figure(2);
subplot(1,2,1);
plot(plotWerte, yAver7(plotWerte,1),'b-', plotWerte, yAver7(plotWerte,2),'r-', plotWerte, yAver7(plotWerte,5), 'g-', plotWerte, yAver9(plotWerte), 'k-');
title('Iteration: sym. gleit. Mittelwertfilter')
xlabel('n')
ylabel('Amplitude/mikroV')
legend('y aver7 (I1)', 'y aver7 (I2)', 'y aver7 (I5)', 'y aver9');

% Wiederholte Verwendung des symmetrischen Binomialfilters
yBinom7 = zeros(xL, 5);
temp = xOrg;
for i = 1:5
    temp = filterFIR(temp, hBinom7);
    yBinom7(:,i) = temp;
end

% Plot (ersten 10% der Werte)
subplot(1,2,2);
plot(plotWerte, yAver7(plotWerte,1),'b-', plotWerte, yAver7(plotWerte,2),'r-', plotWerte, yAver7(plotWerte,5), 'g-', plotWerte, yBinom7(plotWerte,1),'k-', plotWerte, yBinom7(plotWerte,2),'c-', plotWerte, yBinom7(plotWerte,5),'m-');
title('Iteration: sym. gleit. Mittelwert- und sym. Binominalfilter')
xlabel('n')
ylabel('Amplitude/mikroV')
legend('y aver7 (I1)', 'y aver7 (I2)', 'y aver7 (I5)', 'y binom7 (I1)', 'y binom7 (I2)', 'y binom7 (I5)');

Matlab Filterung EEG Signal Iteration Mittelwert.png

Matlab Filterung EEG Signal Iteration Mittelwert Binominal.png


See also