% Si seleziona un file wav di partenza, e lo si sottocampiona a frequenze ridotte via via di un
% fattore 2 fino ad un minimo di 2 kHz, si interpola alla frequenza fc e si confronta con l'originale
%
% si puo' prefiltrare (se prefiltro = 1) e si possono salvare i file nel formato .wav (se salvataggio = 1)
% default 0 per entrambi

disp(' '),disp(' DOPO OGNI FIGURA PREMERE RETURN PER PROSEGUIRE'),drawnow
close all
if exist('prefiltro')~=1,prefiltro=0;end
if exist('salvataggio')~=1,salvataggio=0;end
disp(' ')
if prefiltro==1,disp(' prefiltro'),disp(' '),end
if salvataggio==1,disp(' salvataggio'),disp(' '),end
[file,path]=uigetfile('*.wav','Scegli il file wav:');
file=file(1:(length(file)-4)); % si toglie .wav dal nome del file
[x,fc,nbit]=wavread([file '.wav']);

N=length(x);
x=x(1:2^(floor(log2(N))))'; % se ne fa una potenza di 2
N=length(x);
dt=1/fc;               % passo di campionamento
E_segnale=x*x'*dt;     % energia del segnale
plot(dt*(0:N-1),x),xlabel('t')
title(['segnale originale      energia = ' num2str(E_segnale)]),figure(1),pause
T=N*dt;                % durata complessiva
df=1/T;                % passo in frequenza
f=df*(0:N-1);
% if rem(N,2),
%    f=(N-1)/2+df*(0:N-1);
% else
%    f=N/2+df*(0:N-1);
% end   
trasf=abs(fft(x)); %trasf=fftshift(trasf);
semilogy(f,trasf)
xlabel('f'),title(['modulo trasformata del segnale campionato a ' num2str(fc) ' kHz']),figure(1),pause

Ntr=50;Nview=50;
alpha=0.2;         % roll-off

% sottocampionamento a fc/2
Ntr=2*Ntr;Nview=2*Nview;
fattore=2;
if fc/fattore<2000, break; end
fT=fc/2/fattore;    % Frequenza di taglio
fIni=fT/(1+alpha);  % freq. di inizio transizione
Initrans=max(find(f<=fIni));
Finetrans=max(find(f<=fT));
H=ones(1,Initrans-1);
H=[H cos(.5*pi*(0:(Finetrans-Initrans))/(Finetrans-Initrans)).^2];
H=[H zeros(1,N/2-length(H))];
H=[H 0 fliplr(H)];
H=H(1:N);
h=fattore*real(ifft(H)); % N*df*fattore/fc=fattore
h=[h(N+1-Ntr:N) h(1:Ntr+1)]; 
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'.'),hold on
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'r'),grid
xlabel('t'),title(['risposta impulsiva passo basso con taglio a ' num2str(fT/1000) ' kHz']),figure(1),pause
if prefiltro==1
    xx=conv(x,h)*dt*fc/fattore;
    xx=xx(Ntr+1:N+Ntr);
    y=zeros(1,N);y(1:fattore:N)=xx(1:fattore:N);
else
    y=zeros(1,N);y(1:fattore:N)=x(1:fattore:N);
end
clf
trasf=abs(fft(fattore*y));semilogy(f(1:N/fattore),trasf(1:N/fattore))
xlabel('f'),title(['modulo trasformata del segnale campionato a ' num2str(fc/fattore/1000) ' kHz']),figure(1),pause
z=conv(y,h); % segnale ricostruito a fc da quello sottocampionato
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1,
   if prefiltro==1,
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz_pref.wav']);
   else
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz.wav']);
   end
end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause


% sottocampionamento a fc/4
Ntr=2*Ntr;Nview=2*Nview;
fattore=4;
if fc/fattore<2000, break; end
fT=fc/2/fattore;    % Frequenza di taglio
fIni=fT/(1+alpha);  % freq. di inizio transizione
Initrans=max(find(f<=fIni));
Finetrans=max(find(f<=fT));
H=ones(1,Initrans-1);
H=[H cos(.5*pi*(0:(Finetrans-Initrans))/(Finetrans-Initrans)).^2];
H=[H zeros(1,N/2-length(H))];
H=[H 0 fliplr(H)];
H=H(1:N);
h=fattore*real(ifft(H)); % N*df*fattore/fc=fattore
h=[h(N+1-Ntr:N) h(1:Ntr+1)]; 
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'.'),hold on
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'r'),grid
xlabel('t'),title(['risposta impulsiva passo basso con taglio a ' num2str(fT/1000) ' kHz']),figure(1),pause
if prefiltro==1
    xx=conv(x,h)*dt*fc/fattore;
    xx=xx(Ntr+1:N+Ntr);
    y=zeros(1,N);y(1:fattore:N)=xx(1:fattore:N);
else
    y=zeros(1,N);y(1:fattore:N)=x(1:fattore:N);
end
clf
trasf=abs(fft(fattore*y));semilogy(f(1:N/fattore),trasf(1:N/fattore))
xlabel('f'),title(['modulo trasformata del segnale campionato a ' num2str(fc/fattore/1000) ' kHz']),figure(1),pause
z=conv(y,h); % segnale ricostruito a fc da quello sottocampionato
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1,
   if prefiltro==1,
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz_pref.wav']);
   else
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz.wav']);
   end
end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause


% sottocampionamento a fc/8
Ntr=2*Ntr;Nview=2*Nview;
fattore=8;
if fc/fattore<2000, break; end
fT=fc/2/fattore;    % Frequenza di taglio
fIni=fT/(1+alpha);  % freq. di inizio transizione
Initrans=max(find(f<=fIni));
Finetrans=max(find(f<=fT));
H=ones(1,Initrans-1);
H=[H cos(.5*pi*(0:(Finetrans-Initrans))/(Finetrans-Initrans)).^2];
H=[H zeros(1,N/2-length(H))];
H=[H 0 fliplr(H)];
H=H(1:N);
h=fattore*real(ifft(H)); % N*df*fattore/fc=fattore
h=[h(N+1-Ntr:N) h(1:Ntr+1)]; 
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'.'),hold on
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'r'),grid
xlabel('t'),title(['risposta impulsiva passo basso con taglio a ' num2str(fT/1000) ' kHz']),figure(1),pause
if prefiltro==1
    xx=conv(x,h)*dt*fc/fattore;
    xx=xx(Ntr+1:N+Ntr);
    y=zeros(1,N);y(1:fattore:N)=xx(1:fattore:N);
else
    y=zeros(1,N);y(1:fattore:N)=x(1:fattore:N);
end
clf
trasf=abs(fft(fattore*y));semilogy(f(1:N/fattore),trasf(1:N/fattore))
xlabel('f'),title(['modulo trasformata del segnale campionato a ' num2str(fc/fattore/1000) ' kHz']),figure(1),pause
z=conv(y,h); % segnale ricostruito a fc da quello sottocampionato
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1,
   if prefiltro==1,
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz_pref.wav']);
   else
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz.wav']);
   end
end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause

% sottocampionamento a fc/16
Ntr=2*Ntr;Nview=2*Nview;
fattore=16;
if fc/fattore<2000, break; end
fT=fc/2/fattore;    % Frequenza di taglio
fIni=fT/(1+alpha);  % freq. di inizio transizione
Initrans=max(find(f<=fIni));
Finetrans=max(find(f<=fT));
H=ones(1,Initrans-1);
H=[H cos(.5*pi*(0:(Finetrans-Initrans))/(Finetrans-Initrans)).^2];
H=[H zeros(1,N/2-length(H))];
H=[H 0 fliplr(H)];
H=H(1:N);
h=fattore*real(ifft(H)); % N*df*fattore/fc=fattore
h=[h(N+1-Ntr:N) h(1:Ntr+1)]; 
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'.'),hold on
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'r'),grid
xlabel('t'),title(['risposta impulsiva passo basso con taglio a ' num2str(fT/1000) ' kHz']),figure(1),pause
if prefiltro==1
    xx=conv(x,h)*dt*fc/fattore;
    xx=xx(Ntr+1:N+Ntr);
    y=zeros(1,N);y(1:fattore:N)=xx(1:fattore:N);
else
    y=zeros(1,N);y(1:fattore:N)=x(1:fattore:N);
end
clf
trasf=abs(fft(fattore*y));semilogy(f(1:N/fattore),trasf(1:N/fattore))
xlabel('f'),title(['modulo trasformata del segnale campionato a ' num2str(fc/fattore/1000) ' kHz']),figure(1),pause
z=conv(y,h); % segnale ricostruito a fc da quello sottocampionato
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1,
   if prefiltro==1,
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz_pref.wav']);
   else
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz.wav']);
   end
end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause

% sottocampionamento a fc/32
Ntr=2*Ntr;Nview=2*Nview;
fattore=32;
if fc/fattore<2000, break; end
fT=fc/2/fattore;    % Frequenza di taglio
fIni=fT/(1+alpha);  % freq. di inizio transizione
Initrans=max(find(f<=fIni));
Finetrans=max(find(f<=fT));
H=ones(1,Initrans-1);
H=[H cos(.5*pi*(0:(Finetrans-Initrans))/(Finetrans-Initrans)).^2];
H=[H zeros(1,N/2-length(H))];
H=[H 0 fliplr(H)];
H=H(1:N);
h=fattore*real(ifft(H)); % N*df*fattore/fc=fattore
h=[h(N+1-Ntr:N) h(1:Ntr+1)]; 
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'.'),hold on
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'r'),grid
xlabel('t'),title(['risposta impulsiva passo basso con taglio a ' num2str(fT/1000) ' kHz']),figure(1),pause
if prefiltro==1
    xx=conv(x,h)*dt*fc/fattore;
    xx=xx(Ntr+1:N+Ntr);
    y=zeros(1,N);y(1:fattore:N)=xx(1:fattore:N);
else
    y=zeros(1,N);y(1:fattore:N)=x(1:fattore:N);
end
clf
trasf=abs(fft(fattore*y));semilogy(f(1:N/fattore),trasf(1:N/fattore))
xlabel('f'),title(['modulo trasformata del segnale campionato a ' num2str(fc/fattore/1000) ' kHz']),figure(1),pause
z=conv(y,h); % segnale ricostruito a fc da quello sottocampionato
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1,
   if prefiltro==1,
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz_pref.wav']);
   else
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz.wav']);
   end
end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause


% sottocampionamento a fc/64
Ntr=2*Ntr;Nview=2*Nview;
fattore=64;
if fc/fattore<2000, break; end
fT=fc/2/fattore;    % Frequenza di taglio
fIni=fT/(1+alpha);  % freq. di inizio transizione
Initrans=max(find(f<=fIni));
Finetrans=max(find(f<=fT));
H=ones(1,Initrans-1);
H=[H cos(.5*pi*(0:(Finetrans-Initrans))/(Finetrans-Initrans)).^2];
H=[H zeros(1,N/2-length(H))];
H=[H 0 fliplr(H)];
H=H(1:N);
h=fattore*real(ifft(H)); % N*df*fattore/fc=fattore
h=[h(N+1-Ntr:N) h(1:Ntr+1)]; 
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'.'),hold on
plot(dt*(-Nview:Nview),h(Ntr+1-Nview:Ntr+1+Nview),'r'),grid
xlabel('t'),title(['risposta impulsiva passo basso con taglio a ' num2str(fT/1000) ' kHz']),figure(1),pause
if prefiltro==1
    xx=conv(x,h)*dt*fc/fattore;
    xx=xx(Ntr+1:N+Ntr);
    y=zeros(1,N);y(1:fattore:N)=xx(1:fattore:N);
else
    y=zeros(1,N);y(1:fattore:N)=x(1:fattore:N);
end
clf
trasf=abs(fft(fattore*y));semilogy(f(1:N/fattore),trasf(1:N/fattore))
xlabel('f'),title(['modulo trasformata del segnale campionato a ' num2str(fc/fattore/1000) ' kHz']),figure(1),pause
z=conv(y,h); % segnale ricostruito a fc da quello sottocampionato
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1,
   if prefiltro==1,
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz_pref.wav']);
   else
      wavwrite(z,fc,nbit,[file num2str(round(fc/fattore/1000)) 'kHz.wav']);
   end
end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause

