MATLAB Answers

0

How to post process each variable in a mat file ?

Asked by Shekhar Vats on 11 Jul 2019
Latest activity Answered by Shekhar Vats on 12 Jul 2019
I am trying to downsample all the variables in a mat file.
I can use downsample(var, newSampling) to downsample an individual variables but what to do if i need to downsample all the vectors in the mat file.
load ('my_mat_file_here.mat')
list_var = who; % to get the list of variables
for kk = 1:1:length(list_var) % to run the loop
% downsample(eval(list_var{kk}),10); <-- this part is working as expected with eval
[list_var{kk} '_1hz'] = downsample(eval(list_var{kk}),10);
end
% in this part how to define a new variable
% i am trying to use the variable name from list_var which is a character
% and add _1hs to ths string but matlab won't allow it to % be used as a varaible name
% trying to avoid using assignin & eval to assign the new variable to my base workspce
% any help appreciated.

  0 Comments

Sign in to comment.

2 Answers

Answer by Walter Roberson
on 11 Jul 2019
 Accepted Answer

S = load(filename)
fn = fieldnames(S)
Fc = length(fn)
for k = 1 : Fc
F = fn{k}
Data = S.(F)
Process Data
end

  1 Comment

It worked for me.
Thank you Walter for a quick and helpful response. Do not know why i was shying away from using structure and accesing variables inside it.

Sign in to comment.


Answer by Shekhar Vats on 12 Jul 2019

% Downsampling a given 'X' hz file to a input 'Y'hz file
%This script will load the file in a structure and append _YHz
% at the end of current variables. It will save the new file with the old
% name and append _down_sampled to it
% NOTE --> It will only DOWNSAMPLE the file. Although it can do up
% sampling, but it's not recommended to up sample data as it will just
% interpolate the data in between two points.
% You will need matlab SIGNAL PROCESSING TOOLBOX for this script to work
% In case you do not have access to the toolbox, please contact the author
% remote desktop matlab151a and matlab 151b have Signal Processing Toolbox
%% prompt dialog
tic;
prompt = {'Enter current data frequency[hz]:','Enter desired data frequency[hz]:'};
dlgtitle = 'Downsample data'; % dialog title
dims = [1 40];
definput = {'10','1'};
answer = inputdlg(prompt,dlgtitle,dims,definput);
%% post processing of dialoge
current_freq = str2double(cell2mat((answer(1,1))));
desired_freq = str2double(cell2mat(answer(2,1)));
dwn_smpl = current_freq/desired_freq; % desired downsampling frequency
str_var = ['_' num2str(desired_freq) 'Hz']; % var name append
%% file info
[f_name, f_path]= uigetfile({'*.mat'}, 'Select a mat file'); % select the file(s) from gui
File = [f_path '\' f_name]; % getting the file path and name
S = load(File); % loading file to a structure
fn = fieldnames(S); % get the variable names in the file.
Fc = length(fn); % num of variables in the structure file
for k = 1:1:Fc; % running look to process data
F = fn{k}; % field variable name
F = strrep(F, 'YOUR TEXT GOES HERE', ''); % replacing undesireable text from variable name
if dwn_smpl > 1
S.([fn{k} str_var]) = downsample(S.(F),dwn_smpl); % downsampling data
else
S.([fn{k} str_var]) = upsample(S.(F),dwn_smpl); % up sampling data
end
end
%% saving file based off up sampling or down sampling
if dwn_smpl > 1
save([f_name(1:end-4) '_down_sampled.mat'], '-struct', 'S') % extracting data from structure and saving as .mat file
else
save([f_name(1:end-4) '_up_sampled.mat'], '-struct', 'S') % extracting data from structure and saving as .mat file
end
disp (['All variables down sampled to: ' num2str(desired_freq) 'Hz']);
toc

  0 Comments

Sign in to comment.