MATLAB Answers

Combine or Superpose 151 Sine Waves?

Using the below code and I have been able to successfully created 151 different sine waves all fit to my data set.

y = Score(:);
n = 501;
t = (1:501)';
games = 1:501;
data(1:151) = struct('X',NaN(501,3),'bhat',NaN(3,1),'yhat',NaN);
for ii = 1:151
tmp = 2*pi*(sincos(ii))*t;
data(ii).X = rand(501,3);
data(ii).X(:,2) = cos(tmp)';
data(ii).X(:,3) = sin(tmp)';
data(ii).bhat = data(ii).X\y;
data(ii).yhat = data(ii).bhat(1)+data(ii).bhat(2)*cos(tmp)+data(ii).bhat(3)*sin(tmp);

My question is how do I combine or superpose all 151 sine waves into one sine wave?



Log in to comment.


No products are associated with this question.

2 Answers

Answer by Walter Roberson
on 3 May 2012
 Accepted Answer

Guessing about which field you are referring to:

sum(horzcat(data.yhat),2) ./ 151

  1 Comment



Log in to comment.

Answer by Clifford Shelton on 4 May 2012

Thanks a bunch. Both of the suggestions work. But now it seems that the single sin wave created is extremely thin. My data set has values that range between 0-20.

and each of the 151 sine waves constructed separately also have amplitudes that fit the range of values.

When the sin waves are all added together using your above suggestion..the single sine wave only has a value range between 5-5.4. This makes the newly constructed single sine wave look like a small tightrope when plotted with my data set and isn't very useful visually to see the best fit.

Do you have any idea how to remedy that problem?


I'm a little confused as to how to combine the two operations. Could you give me example code as to how I should

1.) combine all the sine waves
2.) then change their max and min.

Here is what I have been doing..but I'm missing a step:

>> yhat = sum(horzcat(data.yhat),2) ./151;
>> yhat = horzcat(data.yhat); <this doesnt' make sense>
>> std(yhat,[],2);
>> max(yhat,[],2)-min(yhat,[],2);

Umm...this is clearly wrong. Please help!

The std() and max/min calls are just for information to try to figure out the problem. You can remove the std() call.

Remove the existing line

yhat = sum(horzcat(data.yhat),2) ./151;

and use

yhat_array = horzcat(data.yhat);
yhat = mean(yhat_array,2);

and then for information purposes

max(yhat_array, [], 2) - min(yhat_array, [], 2)

with no semi-colon

hm..that gives me a max of 1.67 and a min of 1.12.
that didn't seem to do what we had planned.

I'm not exactly understanding how if the 151 sine waves standing alone have a wider range in values...why does that all of a sudden shrink when they are added together?

Shouldn't the sums of them create even higher and lower max and mins on the sine waves?

What would be a way for me to just do simple addition of each sine wave from the scalar structure? I've done that in the past with sinewaves and it created desired results.

You are the MAN by the way!

Log in to comment.

Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

MATLAB Academy

New to MATLAB?

Learn MATLAB today!