0
$\begingroup$

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

$\endgroup$
2
$\begingroup$

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.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.