Search code examples
matlabfftphaseamplitude

Amplitude and Phase of result of FFT in MATLAB


I tried to extract amplitude & phase values from the fft function result in the Matlab. I implemented the script as below

clear;
sf = 100; %sampling frequency
si = 1/sf; dt=si; %time sampling interval
L = 10; %Length of signal
t = linspace(0,L,L/dt+1);%(0:L-1)*dt; %time vector
t(end)=[];

fr = 4 %frequency
data = cos(2*pi*fr*t);
df = sf/length(data3); %frequency increment
f = linspace(0,length(data3)/2,length(data3)/2)*df; %frequency
fft_result =fft(data)/length(data);
spec_fft = abs(fft_result); %amplitude
pha_fft = angle(fft_result); %phase

When I checked the results of amplitude and phase values, of course, they showed peak values at a specific frequency that I specified. But, other frequencies also have amplitude. Of course, their values are very very small, but because of this problem, the phase spectrum didn't show me a clear result. Why other frequencies also have amplitude values?

And I made a cosine function that is not shifted. So I think the phase value should show the zero value, but it wasn't. Why this problem occurred?


Solution

  • These values won't be exactly zero due to the floating point operations involved. You generated a 4 Hz cosine with amplitude of 1. Taking the single-sided amplitude and phase spectrum shows an amplitude of 1, and a phase of 0 radians at the 4 Hz bin:

    clear;
    sf = 100; %sampling frequency
    si = 1/sf; dt=si; %time sampling interval
    L = 10; %Length of signal
    t = linspace(0,L,L/dt+1);%(0:L-1)*dt; %time vector
    t(end)=[];
    
    fr = 4; %frequency
    data = cos(2*pi*fr*t);
    df = sf/length(data); %frequency increment
    N = length(data);
    f = ((0:(N/2))/ N) * sf; %frequency
    fft_result =fft(data)/N;
    spec_fft = abs(fft_result); %amplitude
    % single sided amplitude
    amp_single_side = spec_fft(1:N/2+1);
    amp_single_side(2:end-1) = 2*amp_single_side(2:end-1);
    % single sided phase
    phase_single_side = angle(fft_result(1:N/2+1));
    
    four_hertz_bin = find(f == 4);
    four_hertz_amp = amp_single_side(four_hertz_bin);
    four_hertz_phase = phase_single_side(four_hertz_bin);
    
    figure;
    subplot(2,1,1);
    plot(f, amp_single_side)
    xlabel('Frequency');
    ylabel('Amplitude');
    hold on;
    plot(f(four_hertz_bin), four_hertz_amp, 'ro');
    subplot(2,1,2);
    plot(f, phase_single_side);
    xlabel('Frequency');
    ylabel('Phase');
    hold on;
    plot(f(four_hertz_bin), four_hertz_phase, 'ro');
    

    Amplitude and Phase Spectrum