%% Diagrama 3D do espectro de Fourier
%
% Esta Script irá gerar um diagrama 3D do espectro de Fourier, com os eixos da frequência e do tempo formando o plano horizontal.
%
clear all; close all; clc

%% Parâmetros da simulação
%

% Amplitudes das senoides
A = [1 1 0 0.5 0 0.25 0 0 0 0];

% Frequência fundamental
Wo = 0.01*pi;

% Número de ciclos do sinal a ser mostrado no gráfico
ciclos = 10;

% Frequências das senoides (múltiplos inteiros da fundamental)
f = 0:length(A)-1;

% Período do sinal
No = 2*pi/Wo;

% Eixo do tempo
n = 0 : No*ciclos - 1;

%% Geração do sinal
%
% O sinal ao qual iremos decompor nas séries de Fourier, será a soma de sinais senoidais segundo os parâmetros da célula anterior

% Variável que irá guardar o sinal
sinal = 0;

% Para cada sinal passado nos parâmetros, soma à variável
for i = 1:length(A)
    
    sinal = sinal + A(i)*cos(f(i)*Wo*n);
    
end

% Exibindo os resultados:
figure
plot(n,sinal)
title(['Sinal periódico da análise - Período: ' num2str(No)])
grid on

%% Gráfico 3D de Fourier
%
% Nesta seção será criada a figura 3D que repreenta a expansão em Séries de Fourier do sinal, seguindo a definição:
%     Eixo x = tempo
%     Eixo y = frequência
%     Eixo z = gráfico

figure

% Plot do sinal
plot3(n, zeros(size(n)), sinal, 'r')
xlabel('tempo [n]'); ylabel('frequência [\Omega]'); zlabel('|D_r|')
% grid on
hold on
view(130,50)

% Eixos X e Y
plot3([0 max(n)], [0 0], [0 0], 'k')
plot3([0 0], [0 max(f)], [0 0], 'k')
plot3([max(n) max(n)], [0 max(f)], [0 0], 'k')
% Comparação dos máximos para definir o eixo Z
maximo = max([sinal, A]);
minimo = min([sinal, A]);
% A amplitude do eixo Z será o maior valor absoluto entre os obtidos
amp = max(abs([maximo, minimo]));
% Eixo Z
plot3([0 0], [0 0], [-amp, amp], 'k')

% Plotando cada componente da série de Fourier
for i = 1:length(A)
    
    plot3(n, f(i)*ones(size(n)), A(i)*cos(f(i)*Wo*n),'b')
    plot3([0 0], [f(i) f(i)], [0 A(i)], 'b', 'LineWidth', 2)
    plot3([max(n) max(n)], [f(i) f(i)], [0 A(i)], 'b', 'LineWidth', 2)
    
end




