I am trying to validate some accelerator data that I have collected by comparing it against the LVDT displacements that were also recorded. To do this I am trying to differentiate the LVDT data twice to get acceleration. However when I run my code it has the error
Undefined function or variable 'DiffDiffLVDT'.
Investigating this I have found that Matlab is not processing the second for loop and hence the variable DiffDiffLVDT is never made.
Why is it skipping the second for loop?
enter code here
clear all
clc
test2 = csvread('HZ1.csv'); %raw data from excel
time = test2(:,1);
%% Filtering
f=250;% sampling frequency
f_cutoff = 2; % cutoff frequency
f_cutoff2 = 5;
fnorm =f_cutoff/(f/2); % normalized cut off freq, you can change it to any value depending on your requirements
fnorm2 =f_cutoff2/(f/2);
[b1,a1] = butter(4,fnorm,'low'); % Low pass Butterworth filter of order 4
[b2,a2] = butter(4,fnorm2,'low'); % Low pass Butterworth filter of order 4
filtaccZ = filtfilt(b2,a2,test2(:,6));
filtLVDTZ = filtfilt(b1,a1,test2(:,7));
%% Remove Offset
Accz = filtaccZ -mean(filtaccZ);
LVDTz = filtLVDTZ - mean(filtLVDTZ);
%% Unit Conversion
LVDTm = LVDTz/1000; % mm to m
%% LVDT Displacement to Acc
% Displacement to Velocity
for d = 2:1:(size(LVDTm)-1)
x = LVDTm(d+1);
y = LVDTm(d-1);
z = x-y; %differnce in y
a = time (d+1);
b = time (d-1);
c = a-b; %differnce in x
DiffLVDT(d)= (z/c); % Displacement to velocity
end
velocity = DiffLVDT;
% Velocity to Acceleration
for e=1:1:(size(velocity)-1)
x2 = velocity(e+1);
y2 = velocity(e-1);
z2 = x2-y2; %differnce in y
a2 = time (e+1);
b2 = time (e-1);
c2 = a2-b2; %differnce in x
DiffDiffLVDT(e)= (z2/c2) %velocity to acc.
end
Acc= DiffDiffLVDT
%% Plotting
close all
figure
hold on
plot(time(1:5000),Acc(1:5000),'b')
plot(time(1:5000),Accz(1:5000),'r')
grid on;box on
legend('DiffDiffLVDTFilter','Accz')
enter code here
Because
1:1:(size(velocity)-1)
does not do what you want it to.
velocity
is an 1xN
array, size(velocity)
therefore returns [1 N]
. The colon operator only cares about the first value in the array and the array you want to loop over ends up being empty since
1:1:[1 N]-1 == 1:1:1-1 == 1:1:0 == Empty matrix
Due to problems like these you should always use either of the following instead of size(var)
when constructing loops:
size(var, n) % Returns the size of the nth dimension of var
length(var) % Returns the size of the largest dimension of var
numel(var) % Returns the number of elements in var