Generate manual repeatable signal for matlab

1 Ansicht (letzte 30 Tage)
Jeroen Vermeulen
Jeroen Vermeulen am 9 Jul. 2020
Kommentiert: Jeroen Vermeulen am 20 Jul. 2020
Dear matlab forum,
At this moment I'm evaluating a 'sample entropy' algorithm, that is used in heart and gait data currently.
I want to show the effect of sample frequency and time scales on the algorithms outcomes.
For this I want to create a manual function that can be repeated, that resembles the gait flexion angle of the knee.
This function must look like the negative part of a sinusoid (1Hz), amplitude -5, followed by the positive part of a sinusoid (2Hz) amplitude +1.
I should be able to use this function in a matlab script. At this point I'm quite a novice on this topic, and I want to see what your recommendations for designing such a function for matlab would be. I added a sketch to give a better idea on the curve of the function.
I look forward to seeing your answer(s).
Greetings,
Jeroen

Akzeptierte Antwort

Alan Stevens
Alan Stevens am 9 Jul. 2020
Like this?
dt = 0.01;
tf = 1.5;
n = tf/dt + 1;
for i = 1:n
t(i) = (i-1)*dt;
y(i) = wave(t(i));
end
plot(t,y),grid
function y = wave(t)
w1 = 2*pi; % frequency rads/sec
w2 = 4*pi; % "
A1 = -5; % amplitude
A2 = 1; % "
if t<1
y = A1*sin(w1*t);
else
y = A2*sin(w2*t);
end
end
  1 Kommentar
Jeroen Vermeulen
Jeroen Vermeulen am 20 Jul. 2020
Thanks very much Alan! For the ones intrested, I found one other possible method (upper). The bottom method is your method, slightly adjusted to make the signal look like a better flexion-extension angle of the knee joint.
a1 = 5; %amplitude
t1 = 0:dt:T1; %timevector
f = @(x) [ -5*sin(2*pi*0.8*x).*(0.005<=x & x<=0.6) + -sin(2*pi*2.5*x).*(0.6<x & x<0.8) + 0.8*sin(2*pi*1.25*x).*(0.8<x & x<1.2) + 0.*(1.2<=x & x<1.3) ];
x = linspace(0,1.3);
intvl = [0 6];
repfx = repmat(f(x), 1, diff(intvl)/3);
px = linspace(intvl(1),intvl(2),length(repfx));
figure(1)
plot(px, repfx)
grid
%% Try 2
dt = 0.01;
tf = 1.2;
n = tf/dt + 1;
for i = 1:n
t(i) = (i-1)*dt;
y(i) = wave(t(i));
end
plot(t,y),grid
function y = wave(t)
w1 = 2*pi; % frequency rads/sec
w2 = 6*pi; % "
A1 = -5; % amplitude
A2 = 1; % "
if t<=0.5
y = A1*sin(w1*t);
elseif t>0.5 && t<0.67
y = -A2*sin(w2*t);
elseif t>0.67 && t<1
y = 0.8*sin(3*pi*t)
else
y = 0
end
end

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Introduction to Installation and Licensing finden Sie in Help Center und File Exchange

Produkte


Version

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by