SFTD (DTFS) para Octave/QtOctave e MATLAB
Autor: Luís Cláudio LA | Publicado: 2010-07-15T14:37:00-03:00





  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX", "output/HTML-CSS"],
    tex2jax: {
      inlineMath: [ ['$','$'], ["\\(","\\)"] ],
      displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
      processEscapes: true
    },
    "HTML-CSS": { availableFonts: ["TeX"] }
  });










A seguir mostramos um programa feito para Octave.&nbsp;O código mostrado a seguir foi feito em sala de aula com alunos do curso de Métodos Matemáticos para Engenharia do UniCEUB e pode ser colocado em um arquivo *.m que rodará tanto no Octave) quanto no MATLAB. Ele mostra os Espectros de Magnitude e de Fase de um sinal x[n] com período N. O procedimento mostra ao final uma janela com os referidos espectros no intervalo [-N+1,N], ou seja, colocarmos o sinal com dois períodos fundamentais para que ficasse mais fácil a visualização.

Só lembrando do referencial teórico




Considere um sinal x[n] com período fundamental N (natural) então temos




$$x[n]=\sum_{k\in \left\langle N \right\rangle} X[k]e^{jk\Omega_0 n}$$
.
$$X[k]=\frac{1}{N}\sum_{n\in \left\langle N \right\rangle} x[n]e^{-jk\Omega_0 n}$$






onde $\Omega_0=\frac{2\pi}{N}$ e X[k] são os coeficientes de Fourier (complexos), $j^2=-1$ e&nbsp;



$$e^{j\Box}=\cos(\Box)+j.\sin(\Box)$$.




 

O que o procedimento faz é simples. Você entrando com o sinal x[n] e o tamanho do período ele mostra X[k]. Como X[k] não é, necessariamente, real, mostramos o |X[k]| (Espetro de Magnitude) e o Arg{X[k]} (Espectro de Fase).&nbsp; Como trabalho de casa (valendo parte da nota da avaliação seguinte) os alunos deveriam fazer a volta, ou seja, dados os Espetros de Magnitude e de Fase de um sinal, mostrar o sinal x[n].




Como mencionado anteriormente é possível rodar o arquivo *.m tanto no Octave quanto no MATLAB.






No Octave (figura anterior) basta clicar no monitor preto entre o botão &gt; e a seta para esquerda azul.









e no MATLAB (figura anterior) basta apertar a tecla F5.




Em ambos a resposta será como mostrado nas figuras seguintes, respectivamente, para o Octave e o MATLAB.





















d



 

O código que geral esta saída está em azul logo a seguir. Naturalmente que % serve para comentar e que, naturalmente, o código pode ser melhorado.




Como em sala de aula, a volta fica como exercício e é relativamente fácil.




Grande abraço

Luís Cláudio LA








clear;

&nbsp; &nbsp; N=24;

&nbsp; &nbsp; nn=1:N;

&nbsp; &nbsp; Omega0=2*pi/N;

&nbsp; &nbsp; x=1+sin(nn*pi/12+3*pi/8);

&nbsp; &nbsp; Xr=zeros(1,N);

&nbsp; &nbsp; Xi=zeros(1,N);

&nbsp; &nbsp; EspMag=zeros(1,N);

&nbsp; &nbsp; EspFase=zeros(1,N);



&nbsp; &nbsp; for k=1:N

&nbsp; &nbsp; &nbsp; &nbsp; for n=1:N

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Xr(k)=Xr(k)+1/N*cos(k*Omega0*n)*x(n);

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Xi(k)=Xi(k)-1/N*sin(k*Omega0*n)*x(n);

&nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp; &nbsp; end



&nbsp; &nbsp; for k=1:N

&nbsp; &nbsp; &nbsp; &nbsp; if abs(Xr(k))<0 .0001="" font="">

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Xr(k)=0;

&nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp; &nbsp; &nbsp; &nbsp; if abs(Xi(k))<0 .0001="" font="">

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Xi(k)=0;

&nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp; &nbsp; end





&nbsp; &nbsp; for k=1:N

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if (Xr(k)&gt;0)

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EspFase(k)=atan(Xi(k)/Xr(k));

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif (Xr(k)<0 amp="" i="" k="">0)

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EspFase(k)=atan(Xi(k)/Xr(k))+pi;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif (Xr(k)<0 amp="" font="" i="" k="">

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EspFase(k)=atan(Xi(k)/Xr(k))-pi;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif (Xr(k)==0)&amp;&amp;(Xi(k)&gt;0)

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EspFase(k)=pi/2;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif (Xr(k)==0)&amp;&amp;(Xi(k)<0 font="">

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EspFase(k)=-pi/2;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else EspFase(k)=0; &nbsp;&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; end &nbsp;&nbsp;

&nbsp; &nbsp; end

&nbsp; &nbsp; %stem(EspFase) &nbsp;%Mostra só o Espectro de Fase





&nbsp; &nbsp; for k=1:N

&nbsp; &nbsp; &nbsp; &nbsp; EspMag(k)=sqrt(Xr(k)^2+Xi(k)^2);

&nbsp; &nbsp; end

&nbsp; &nbsp; %stem(EspMag) %Mostra só o Espectro de Magnitude



&nbsp; &nbsp; %% As quatro linhas seguintes mostram o espectro de magnitude e de fase

&nbsp; &nbsp; %% em uma mesma janela Descomente para ver..



&nbsp; &nbsp; %subplot(2,1,1);

&nbsp; &nbsp; %stem(EspMag,)

&nbsp; &nbsp; %subplot(2,1,2);

&nbsp; &nbsp; %stem(EspFase)





%Daqui para baixo é um "plus"; eu duplico o tamanho do sinal e peço

%para ele plotar duas janelas e mostrar os dois gráficos juntos sendo que uma

%cópia ficará na parte negativa. Assim vemos melhor o resultado.

%Criei inicialmente o vetor Xr2 que representa o vetor Xr com o dobro de tamanho

%Depois criei inicialmente o vetor Xi2 que representa o vetor Xi com o dobro de tamanho



&nbsp; &nbsp; Xr2=zeros(1,2*N);

&nbsp; &nbsp; Xi2=zeros(1,2*N);



&nbsp; &nbsp; for k=1:N

&nbsp; &nbsp; &nbsp; &nbsp; Xr2(k)=EspMag(k);

&nbsp; &nbsp; &nbsp; &nbsp; Xi2(k)=EspFase(k);

&nbsp; &nbsp; end &nbsp;&nbsp;



&nbsp; &nbsp; for k=N+1:2*N

&nbsp; &nbsp; &nbsp; &nbsp; Xr2(k)=EspMag(k-N);

&nbsp; &nbsp; &nbsp; &nbsp; Xi2(k)=EspFase(k-N);

&nbsp; &nbsp; end



&nbsp; &nbsp; subplot(2,1,1);

&nbsp; &nbsp; stem(-N+1:N,Xr2)

&nbsp; &nbsp; subplot(2,1,2);

&nbsp; &nbsp; stem(-N+1:N,Xi2)