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

# Combine or Superpose 151 Sine Waves?

Asked by Clifford Shelton on 3 May 2012

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);
end
```

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

Thanks!!

## Products

No products are associated with this question.

Answer by Walter Roberson on 3 May 2012

Guessing about which field you are referring to:

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

## 1 Comment

Walter Roberson on 3 May 2012

Alternately,

mean(horzcat(data.yhat),2)

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?

Clifford Shelton on 4 May 2012

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);

Walter Roberson on 4 May 2012

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

Clifford Shelton on 4 May 2012

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!