該函數用於對一段原始EEG信號進行分解,得到醫學上認定的9個頻段的時域、頻域信息。
(1)總頻段:0.5-45Hz;
(2)low-Delta:0.5-2Hz;
(3)high-Delta:2-4Hz;
(4)Theta:4-7Hz;
(5)Alpha:8-13Hz;
(6)low-Beta:13-20Hz;
(7)high-Beta:20-30Hz;
(8)low-Gamma:30-40Hz;
(9)high-Gamma:40-45Hz。
該函數不考慮FFT的採樣點數小於信號的採樣頻率的情況,即N<Fs。
function [Time_domain, Freq_domain] = EEG_decoding(signal, Fs, N)
% % 輸入 signal:待解碼原始信號
% % Fs: 信號的採樣頻率
% % N: FFT的採樣點數
% % 輸出 Time:時域信息
% % Freq:頻域信息
% 信號預處理
signal_nodc = signal-mean(signal);% 通過減去平均值來消除直流分量
%利用FFT進行濾波
frequency = Fs*(0:N-1)/N; %頻率
EEG_FFT = fft(signal_nodc, N); %對無直流分量的信號進行FFT
time = (1:length(EEG_FFT))/Fs;
%濾波截止頻率
% 截止頻率 = [總頻段; low-Delta; high-Delta; Theta; Alpha; low-Beta; high-Beta; low-Gamma, high-Gamma];
Cut_off_freq = [0.5,45; 0.5,2; 2,4; 4,7; 8,13; 13,20; 20,30; 30,40; 40,45];
Cut_off_freq0 = Cut_off_freq;
Time_domain = []; Freq_domain = [];
Str ={'總頻段', 'low-Delta', 'high-Delta', 'Theta', 'Alpha', 'low-Beta', 'high-Beta', 'low-Gamma', 'high-Gamma'};
[m,n] = size(Cut_off_freq0);
for i = 1:m
for j = 1:n
index = find(abs(frequency - Cut_off_freq0(i,j)) == min(abs(frequency - Cut_off_freq0(i,j))));
Cut_off_freq0(i,j) = frequency(index(1));
end
index1 = find(frequency == Cut_off_freq0(i,1));
index2 = find(frequency == Cut_off_freq0(i,2));
index3 = find(frequency == Fs-Cut_off_freq0(i,2));
index4 = find(frequency == Fs-Cut_off_freq0(i,1));
data = [zeros(1,index1-1),EEG_FFT(index1:index2),zeros(1,index3-index2-1),EEG_FFT(index3:index4),zeros(1,N-index4)];
EEG_IFFT = ifft(data,N); %選取特定頻段的數據進行IFFT
Time_domain = [Time_domain; abs(data)]; %信號的時域信息
Freq_domain = [Freq_domain; real(EEG_IFFT)]; %信號的頻域信息
%分解結果可視化
subplot(size(Cut_off_freq0,1),2,2*i-1);
plot(time, EEG_IFFT);
title([Str{i},'(',num2str(Cut_off_freq(i,1)),'-',num2str(Cut_off_freq(i,2)),'Hz',')','時域圖']); %子標題
subplot(size(Cut_off_freq0,1),2,2*i);
stem(frequency(1:N/2),abs(data(1:N/2)*2/N));
title([Str{i},'(',num2str(Cut_off_freq(i,1)),'-',num2str(Cut_off_freq(i,2)),'Hz',')','頻域圖']); %子標題
end
suptitle('FFT濾波結果') %總標題