How to plot harmonics

43 vues (au cours des 30 derniers jours)
JDilla
JDilla le 17 Mai 2015
Commenté : Guillaume le 19 Mai 2015
%PLOTTING TIME DEPENDENT MOTION OF A STANDING WAVE
%Define Parameters
a_n = 1;
k = 5;
w_n = 5;
x = 0:0.05:4;
t = 1:0.05:20;
for j=1:length(t)
for i=1:length(x)
u(i) = a_n*sin(k.* x(i)).* cos(w_n.*t(j)); %Formula for displacement
end
pause (0.1)
plot(u)
axis([1,65,-1.5,1.5])
grid on
end
Above is the code for a standing wave along a string. I need to create a few more of these, to end up with a series of standing waves which I can then calculate the sum of, which gives me the net displacement of the wave. I then need to plot this net displacement, which will result in a travelling wave.
Equation 1 on the formula sheet attached is the equation that governs the source that generates the series of standing waves. Tau is a 'tuning parameter'. I can just assign it a value. It determines the angular frequency. Imagine plucking a guitar. That is the source. We pluck the string of a guitar at a certain distance along the string. That distance is denoted as X_s (X subscript s). That can just be a value.
Equation 2 is the displacement for the nth standing wave (harmonic) where L is the length of the string, x is displacement and w_n (omega subscript n) is the angular frequency n is the harmonic number. I need to incorporate this somehow into the loop I have used to generate the wave in my code, in order to plot, lets say, the first 5 harmonics as subplots.
Equation 3 is then used to sum all of these harmonics together, to generate a final plot.
Any ideas on how to do this using the code and formula I have written
  2 commentaires
JDilla
JDilla le 17 Mai 2015
I was thinking of using symsum to calculate the sum of the standing waves,but this did not work.
JDilla
JDilla le 18 Mai 2015
Any ideas??

Connectez-vous pour commenter.

Réponses (1)

Guillaume
Guillaume le 18 Mai 2015
Modifié(e) : Guillaume le 18 Mai 2015
Learn to use vectorisation. You can calculate all the u(x,t) at once:
Using ndgrid (or meshgrid):
x = 0:0.05:4;
t = 1:0.05:20;
[tt, xx] = ndgrid(t, x);
u = a_n*sin(k*xx).*cos(w_n*tt);
%now you can plot u
for j = 1:numel(t)
pause(0,1);
plot(u(j, :));
%...
Using bsxfun:
x = 0:0.05:4;
t = 1:0.05:20;
u = bsxfun(@(x, t) a_n*sin(k*x).*cos(w_n*t), x, t');
%now you can plot u
for j = 1:numel(t)
pause(0,1);
plot(u(j, :));
%...
If you want to add a third variable L, just add an extra dimension to u:
x = 0:0.05:4;
t = 1:0.05:20;
L = 1:5
[tt, xx, LL] = ndgrid(t, x, L);
u = a_n*sin(k*xx./LL).*cos(w_n*tt);
%sum all the L together:
u = sum(u, 3);
  6 commentaires
JDilla
JDilla le 19 Mai 2015
Modifié(e) : JDilla le 19 Mai 2015
Thank you for your help
I want to plot the harmonics (first 5 harmonics individually, as subplots) and then sum a specified number (so I want to find the sum of 50) and plot it. Does that make sense? The third dimension you said was L? but L was length, which is just a variable.
Guillaume
Guillaume le 19 Mai 2015
Right, I misread your image, I thought the harmonic was L. It does not change much anyway. You have, u as a function of three variables x, t and n:
u = f(x, t, n) %the specific of f don't matter.
You generate u all at once, for whatever combination of values:
x = 0:0.05:4;
t = 1:0.05:20;
n = 1:50;
[xx, tt, nn] = ndgrid(x, t, n);
u = f(xx, tt, nn);
And if you want to fix a variable, you just fix that dimension. For example to plot the first 5 harmonics at time t0
figure;
for nh = 1:5
subplot(nh, 1, 5);
plot(squeeze(u(:, t0, nh));
end
The sum of the 50 harmonics (3rd dimension) is still:
sum(u, 3)

Connectez-vous pour commenter.

Catégories

En savoir plus sur Measurements and Spatial Audio dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by