FOURIER OTIMIZADO
A função Scilab descrita ao final desse texto (a qual deve ser salva em arquivo com
terminação “.sci”) também executa a recuperação de pontos da função “dente de serra”
apresentada em aula. Porém, a implementação ora apresentada é extremamente mais
eficiente do que a primeira versão discutida pois nessa nova versão não são utilizados laços
nem isolados nem aninhados. Todo o processamento é matricial.
Os casos relativos à transformada de Fourier aqui discutidos servem apenas
como estratégia de apoio para o exercício da programação. D e fato, o Scilab já
possui funções internas (fft e dft) as quais lidam com transformadas de Fourier.
As expressões são preparadas para executar operações por álgebra de matrizes, para tanto, a
função mtlb_repmat é utilizada para replicar linhas ou colunas de maneira adequada à
realização das operações.
Outro operador utilizado (talvez uma novidade) é “.*” o qual realiza o produto ponto-aponto entre as células das matrizes operadas. Note, no exemplo a seguir, a diferença em
relação ao produto convencional de matrizes:
X=[1 2 3] e Y=[4 5 6]:
a) X.*Y=[1*4 2*5 3*6]=[4 10 18], ao passo que...;
b) O produto convencional das matrizes X e Y é calculado através da
expressão: X*Y' = [1*4+ 2*5+ 3*6]= [32]
No que se refere às alterações realizadas sobre a primeira implementação, a parte mais
importante da otimização consiste na adaptação da expressão contida nos dois laços
aninhados (o mais externo para determinação dos valores de t e o mais interno para
determinação da f(t)).
for t=0:%pi/32:2*%pi
acum=a0/2;
for n=1:MAX
an=(cos(n*%pi)-1)/(n*%pi)^2;
bn=-cos(n*%pi)/(n*%pi);
acum=acum+(an*cos(n*W0*t)+bn*sin(n*W0*t));
end
cont=cont+1;
XY(1:2,cont)=[t,acum]';
end
Uma etapa inicial consiste em adaptar (an*cos(n*W0*t)+bn*sin(n*W0*t) à forma
matricial. O vetor t é facilmente obtido fazendo t=[0:pi/32:2pi] , porém n é de tamanho
variável (1 linha MAX colunas) e tem que ser operado junto com o vetor t. Fazemos então
uma replicação de t (através da função mtlb_repmat) criando uma matriz tt de MAX linhas,
onde cada linha é uma cópia de t. Com isso temos: n de dimensões 1,MAX e tt com
dimensões MAX,numColsEm_t, com essa adaptação o produto n*W0*t fica viabilizado pelo
produto das matrizes n*W0*tt, sendo que este operador (produto de matrizes) é
disponibilizado pelo próprio Scilab.
As outras adaptações seguem o mesmo princípio, ou seja, criar um sistema matricial que
viabilize as operações algébricas necessárias. Temos abaixo, o código da função otimizada:
function fourier1Otimo(MAX)
T=2*%pi;
a0=1/4;
W0=2*%pi/T;
t=[0:%pi/32:T];
tt=mtlb_repmat(t,MAX,1);//cria uma matriz tt com MAX linhas, sendo cada uma a cópia de t
n=[1:1:MAX];
an=(cos(n*%pi)-1)./((n*%pi)^2);
bn=-cos(n*%pi)./(n*%pi);
nn=mtlb_repmat(n',1,size(tt,2));
A=cos(nn.*(W0*tt));
B=sin(nn.*(W0*tt));
C=an*A;
D=bn*B;
A0=a0/2;
ft=A0+(C+D);// <<< EQUAÇÃO MATRICIAL EQUIVALENTE AOS DOIS LAÇOS FOR ANINHADOS
// UTILIZADOS NA PRIMEIRA VERSÃO DO PROGRAMA
h=figure(1);
plot(t,ft);
nomeFig=input("Entre com o nome do arquivo a ser salvo \n","string");
caminho="c:\PRE1001\";
caminhoEnome=strcat([caminho, nomeFig,".jpg"]);
xs2jpg(1,caminhoEnome);
endfunction
Download

FOURIER OTIMIZADO