# How to decompose a mixed signal into its original signals?

I have generated a number of sinusoidal signals and added them together using the following Matlab code snippet:

%% Time Properties
Datapoints = 512;               % Sampling frequency
T = 1/Datapoints;               % Sampling period
Length = 512;                   % Length of signal
t = (0:Length-1)*T;             % Time vector

%% Signal Properties
signal=0;
for amp=1:10
for freq=2:5:100
for ph=0:pi/36:pi
signal=signal+amp*sin(2*pi*freq*t+ph);
end
end
end


After that I get back the original frequencies using a fast Fourier transform:

NFFT=Datapoints;
fs=Datapoints/Length;
f = fs/2*linspace(0,1,NFFT/2+1);
fftsignal=fft(signal);
fax_bins=[0:NFFT-1];
[pks,pos]=findpeaks(abs(fftsignal.^2),fax_bins);


Now pos will give me the constituent frequencies.

In addition to that I need to know the corresponding phases and amplitudes to reconstruct the original signals.

How can I get the original phase and amplitude information?

Edit 1 But pks is not giving me the constituent amplitudes.

Edit 2 For debugging I used the following code snippet:

Fs = 20000;
t = 0:1/Fs:0.01;
fc1=200;
fc2=300;
x1 = sin(pi*fc1*t);
x2 = sin(pi*fc2*t);
x=x1+x2;
x=x';
xFFT = abs(fft(x))/length(x);
[amp,freq]=findpeaks(xFFT);


I get amp=0.6252 and freq=2

## 1 Answer

An FFT will only decompose a mix of sinusoids to the original constituents if all the constituent sinusoids are exactly integer periodic in the FFT's length. One of your signals is not integer periodic in the number of samples in your FFT's length, so (1) its "leakage" (really windowing artifacts) will contaminate the magnitudes of other signals, and (2) you will need to interpolate (with a Sinc interpolation kernel) between FFT result bins to get a more accurate estimate of its magnitude.