114 lines
3.8 KiB
Matlab
114 lines
3.8 KiB
Matlab
%% Setup and Feature Extraction
|
|
% Ensure c1_dataVis.m has been run so filtered signals and labels exist.
|
|
|
|
% Parameters from Part 2.2b (Feature Selection)
|
|
WSize_sec = 0.1;
|
|
Olap_pct = 0;
|
|
|
|
% Group data for easy looping
|
|
signals_list = {filteredFlex, filteredPinch, filteredVF};
|
|
labels_list = {flexLabels, pinchLabels, VFLabels};
|
|
names = {'Flex', 'Pinch', 'VF'};
|
|
|
|
% Initialize struct to store the extracted features for each class
|
|
results = struct();
|
|
|
|
fprintf('Extracting features (WSize=%.2fs, Olap=%.2f)...\n', WSize_sec, Olap_pct);
|
|
|
|
for k = 1:3
|
|
sig = signals_list{k};
|
|
lbl = labels_list{k};
|
|
|
|
% --- Windowing Logic ---
|
|
WSize_samp = floor(WSize_sec * fs);
|
|
nOlap = floor(Olap_pct * WSize_samp);
|
|
hop = WSize_samp - nOlap;
|
|
nx = length(sig);
|
|
len = fix((nx - (WSize_samp - hop)) / hop);
|
|
|
|
% Preallocate
|
|
MAV_vec = zeros(1, len);
|
|
VAR_vec = zeros(1, len);
|
|
feat_lbl = zeros(1, len);
|
|
|
|
% Get triggers for labeling
|
|
Rise = gettrigger(lbl, 0.5);
|
|
Fall = gettrigger(-lbl, -0.5);
|
|
|
|
for i = 1:len
|
|
idx_start = (i-1)*hop + 1;
|
|
idx_end = idx_start + WSize_samp - 1;
|
|
|
|
segment = sig(idx_start:idx_end);
|
|
|
|
% Calculate Features
|
|
MAV_vec(i) = mean(abs(segment));
|
|
VAR_vec(i) = var(segment);
|
|
|
|
% Labeling: 1 if window is strictly inside stimulation, 0 otherwise
|
|
is_stim = any(idx_start >= Rise & idx_end <= Fall);
|
|
feat_lbl(i) = double(is_stim);
|
|
end
|
|
|
|
% --- Separate Rest vs Stimulus Data ---
|
|
% Store the features in the results struct
|
|
results(k).Name = names{k};
|
|
results(k).MAV_Stim = MAV_vec(feat_lbl == 1);
|
|
results(k).MAV_Rest = MAV_vec(feat_lbl == 0);
|
|
results(k).VAR_Stim = VAR_vec(feat_lbl == 1);
|
|
results(k).VAR_Rest = VAR_vec(feat_lbl == 0);
|
|
end
|
|
|
|
%% Calculate Fisher's Discriminant Ratio (FDR)
|
|
% Formula: J = (mu1 - mu2)^2 / (var1^2 + var2^2)
|
|
% Note: Using Variance (sigma^2) directly in denominator
|
|
|
|
fprintf('\n=== Fisher''s Discriminant Ratio (FDR) Results ===\n');
|
|
fprintf('Higher value = Better discriminability\n');
|
|
fprintf('----------------------------------------------------------\n');
|
|
fprintf('%-25s | %-12s | %-12s\n', 'Comparison', 'FDR (MAV)', 'FDR (VAR)');
|
|
fprintf('----------------------------------------------------------\n');
|
|
|
|
% 1. Rest vs Stimulus (Internal comparison for each file)
|
|
for k = 1:3
|
|
% Data for Stimulus vs Rest
|
|
data_stim = results(k);
|
|
|
|
% --- MAV ---
|
|
mu1 = mean(data_stim.MAV_Stim); var1 = var(data_stim.MAV_Stim);
|
|
mu2 = mean(data_stim.MAV_Rest); var2 = var(data_stim.MAV_Rest);
|
|
fdr_mav = ((mu1 - mu2)^2) / (var1 + var2);
|
|
|
|
% --- VAR ---
|
|
mu1 = mean(data_stim.VAR_Stim); var1 = var(data_stim.VAR_Stim);
|
|
mu2 = mean(data_stim.VAR_Rest); var2 = var(data_stim.VAR_Rest);
|
|
fdr_var = ((mu1 - mu2)^2) / (var1 + var2);
|
|
|
|
fprintf('%-25s | %-12.4f | %-12.4f\n', [names{k} ' vs Rest'], fdr_mav, fdr_var);
|
|
end
|
|
|
|
fprintf('----------------------------------------------------------\n');
|
|
|
|
% 2. Stimulus vs Stimulus (Compare 'Stim' vector of one to 'Stim' vector of another)
|
|
pairs = [1 2; 1 3; 2 3]; % Flex-Pinch, Flex-VF, Pinch-VF
|
|
|
|
for p = 1:3
|
|
idx1 = pairs(p, 1);
|
|
idx2 = pairs(p, 2);
|
|
|
|
name1 = names{idx1};
|
|
name2 = names{idx2};
|
|
|
|
% --- MAV ---
|
|
mu1 = mean(results(idx1).MAV_Stim); var1 = var(results(idx1).MAV_Stim);
|
|
mu2 = mean(results(idx2).MAV_Stim); var2 = var(results(idx2).MAV_Stim);
|
|
fdr_mav = ((mu1 - mu2)^2) / (var1 + var2);
|
|
|
|
% --- VAR ---
|
|
mu1 = mean(results(idx1).VAR_Stim); var1 = var(results(idx1).VAR_Stim);
|
|
mu2 = mean(results(idx2).VAR_Stim); var2 = var(results(idx2).VAR_Stim);
|
|
fdr_var = ((mu1 - mu2)^2) / (var1 + var2);
|
|
|
|
fprintf('%-25s | %-12.4f | %-12.4f\n', [name1 ' vs ' name2], fdr_mav, fdr_var);
|
|
end
|
|
fprintf('----------------------------------------------------------\n'); |