hmm
This commit is contained in:
@@ -1,35 +1,123 @@
|
||||
%% Parameter Sweep Setup
|
||||
% Note: Ensure you have run c1_dataVis.m first to get filteredFlex/fs/flexLabels
|
||||
filteredSignal = filteredPinch; % Using Flex signal (High SNR) for demonstration
|
||||
label = pinchLabels; % Labels of stimulus locations
|
||||
|
||||
filteredSignal = ; % bandapass filtered signal
|
||||
label = ; % labels of stimulus locations
|
||||
% Sweep parameters
|
||||
WSize_values = [0.05, 0.1, 0.3]; % Window sizes in seconds
|
||||
Olap_values = [0, 0.25, 0.75]; % Overlap percentages
|
||||
|
||||
WSize = ; % window size in s
|
||||
Olap = ; % overlap percentage
|
||||
% Get trigger points once (indices in the raw signal)
|
||||
Rise1 = gettrigger(label, 0.5); % Start of stimulation
|
||||
Fall1 = gettrigger(-label, -0.5); % End of stimulation
|
||||
|
||||
%% Extracting Features over overlapping windows
|
||||
|
||||
WSize = floor(WSize*fs); % length of each data frame, 30ms
|
||||
nOlap = floor(Olap*WSize); % overlap of successive frames, half of WSize
|
||||
hop = WSize-nOlap; % amount to advance for next data frame
|
||||
nx = length(signal); % length of input vector
|
||||
len = fix((nx - (WSize-hop))/hop); %length of output vector = total frames
|
||||
|
||||
% preallocate outputs for speed
|
||||
[MAV_feature, VAR_feature, featureLabels] = deal(zeros(1,len));
|
||||
|
||||
Rise1 = gettrigger(label,0.5); % gets the starting points of stimulations
|
||||
Fall1 = gettrigger(-label,-0.5); % gets the ending points of stimulations
|
||||
|
||||
for i = 1:len
|
||||
segment = filteredSignal(((i-1)*hop+1):((i-1)*hop+WSize));
|
||||
MAV_feature(i) = ;
|
||||
VAR_feature(i) = ;
|
||||
|
||||
% re-build the label vector to match it with the feature vector
|
||||
featureLabels(i) = sum(arrayfun(@(t) ((i-1)*hop+1) >= Rise1(t) && ((i-1)*hop+WSize) <= Fall1(t), 1:length(Rise1)));
|
||||
end
|
||||
|
||||
%% Plotting the features
|
||||
% Note: when plotting the features, scale the featureLabels to the max of
|
||||
% the feature values for proper visualization
|
||||
% Create Figure
|
||||
figure('Name', 'Feature Extraction Sweep with MAV & VAR SNR', 'units', 'normalized', 'Position', [0, 0, 1, 1]);
|
||||
|
||||
plot_idx = 1; % Counter for subplot index
|
||||
|
||||
%% Loop through all combinations
|
||||
for w = 1:length(WSize_values)
|
||||
for o = 1:length(Olap_values)
|
||||
|
||||
% Current parameters
|
||||
current_WSize_s = WSize_values(w);
|
||||
current_Olap_pct = Olap_values(o);
|
||||
|
||||
% Windowing calculations
|
||||
WSize_samp = floor(current_WSize_s * fs); % Window size in samples
|
||||
nOlap = floor(current_Olap_pct * WSize_samp); % Overlap in samples
|
||||
hop = WSize_samp - nOlap; % Hop size
|
||||
nx = length(filteredSignal);
|
||||
len = fix((nx - (WSize_samp - hop)) / hop); % Total number of frames
|
||||
|
||||
% Preallocate
|
||||
MAV_feature = zeros(1, len);
|
||||
VAR_feature = zeros(1, len);
|
||||
featureLabels = zeros(1, len);
|
||||
|
||||
% Feature Extraction Loop
|
||||
for i = 1:len
|
||||
% Extract segment
|
||||
idx_start = (i-1)*hop + 1;
|
||||
idx_end = idx_start + WSize_samp - 1;
|
||||
|
||||
% Check bounds
|
||||
if idx_end > nx
|
||||
break;
|
||||
end
|
||||
|
||||
segment = filteredSignal(idx_start:idx_end);
|
||||
|
||||
% Calculate Features
|
||||
MAV_feature(i) = mean(abs(segment));
|
||||
VAR_feature(i) = var(segment);
|
||||
|
||||
% Re-build label vector
|
||||
% Strict: Window must be fully inside stimulation to count as '1'
|
||||
is_stim = any(idx_start >= Rise1 & idx_end <= Fall1);
|
||||
featureLabels(i) = double(is_stim);
|
||||
end
|
||||
|
||||
%% Calculate SNR
|
||||
% Separate Stimulus and Rest values using logical indexing
|
||||
stim_indices = (featureLabels == 1);
|
||||
rest_indices = (featureLabels == 0);
|
||||
|
||||
% --- MAV SNR ---
|
||||
mean_mav_stim = mean(MAV_feature(stim_indices));
|
||||
mean_mav_rest = mean(MAV_feature(rest_indices));
|
||||
if mean_mav_rest > 0
|
||||
mav_snr = 20 * log10(mean_mav_stim / mean_mav_rest);
|
||||
else
|
||||
mav_snr = 0;
|
||||
end
|
||||
|
||||
% --- VAR SNR ---
|
||||
mean_var_stim = mean(VAR_feature(stim_indices));
|
||||
mean_var_rest = mean(VAR_feature(rest_indices));
|
||||
if mean_var_rest > 0
|
||||
var_snr = 20 * log10(mean_var_stim / mean_var_rest);
|
||||
else
|
||||
var_snr = 0;
|
||||
end
|
||||
|
||||
%% Plotting MAV (Left Column)
|
||||
subplot(9, 2, plot_idx);
|
||||
plot(MAV_feature, 'b', 'LineWidth', 0.5); hold on;
|
||||
plot(featureLabels * max(MAV_feature), 'r', 'LineWidth', 1);
|
||||
|
||||
% Formatting Title with SNR
|
||||
title_str = sprintf('MAV (W=%.2g, Olap=%.2g) | SNR=%.2f dB', ...
|
||||
current_WSize_s, current_Olap_pct, mav_snr);
|
||||
grid on;
|
||||
title(title_str, 'FontSize', 8);
|
||||
|
||||
if mod(plot_idx, 2) == 1
|
||||
ylabel('MAV');
|
||||
end
|
||||
xlim([1, len]);
|
||||
set(gca, 'XTickLabel', []);
|
||||
|
||||
plot_idx = plot_idx + 1;
|
||||
|
||||
%% Plotting VAR (Right Column)
|
||||
subplot(9, 2, plot_idx);
|
||||
plot(VAR_feature, 'k', 'LineWidth', 0.5); hold on;
|
||||
plot(featureLabels * max(VAR_feature), 'r', 'LineWidth', 1);
|
||||
|
||||
% Formatting VAR with SNR
|
||||
title_str_var = sprintf('VAR (W=%.2g, Olap=%.2g) | SNR=%.2f dB', ...
|
||||
current_WSize_s, current_Olap_pct, var_snr);
|
||||
grid on;
|
||||
title(title_str_var, 'FontSize', 8);
|
||||
|
||||
if mod(plot_idx, 2) == 0
|
||||
ylabel('VAR');
|
||||
end
|
||||
xlim([1, len]);
|
||||
set(gca, 'XTickLabel', []);
|
||||
|
||||
plot_idx = plot_idx + 1;
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user