% camp96 = segnale con banda di 20 kHz campionato a 96 kHz (in totale 2^17=131072 campioni)
%
% si campiona a frequenza ridotta, si interpola a 96 kHz e si confronta con l'originale
%
% si puo' prefiltrare, nei casi di campionamento a frequenza molto bassa (se prefiltro = 1)
%
% si possono salvare i file nel formato .wav (se salvataggio = 1)
%
% COMMENTO: tipico esempio di programma scritto di fretta per un solo caso e poi riutilizzato (male) per N casi!!
%           si dovrebbero usare due o tre semplici funzioni per le operazioni fondamentali (e ripetitive);
%           sarebbe bene introdurre anche variabili ausiliarie, per semplificare la lettura
%
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
[x fc nbit]=wavread('camp96');x=x';
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);
trasf=abs(fft(x));semilogy(f,trasf)
xlabel('f'),title('modulo trasformata del segnale campionato a 96 kHz'),figure(1),pause

if prefiltro==0
    
% filtro passo basso ideale con banda 24 kHz
% troncato e ritardato di Ntr campioni (in figura sono mostrati Nview campioni)
Ntr=300;Nview=50;
h=sin(.5*pi*(-Ntr:Ntr)+1e-6)./(.5*pi*(-Ntr:Ntr)+1e-6);
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 (troncata) passo basso ideale 24 kHz'),figure(1),pause
clf
y=zeros(1,N);y(1:2:N)=x(1:2:N);
trasf=abs(fft(2*y));semilogy(f(1:N/2),trasf(1:N/2))
xlabel('f'),title('modulo trasformata del segnale campionato a 48 kHz'),figure(1),pause
z=conv(y,h);
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1,wavwrite(z,fc,'camp48_ideale'),end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause
Ntr=100;Nview=50;
H=zeros(1,N);
n20=round(20000/df);
H(1:n20)=1;
H(n20+1:N/4+1)=cos(.5*pi*(1:(N/4-n20)+1)/(N/4-n20)).^2;
H(N:-1:3*N/4+1)=H(2:N/4+1);
plot(f(1:N/2),H(1:N/2)),xlabel('f'),title('passa basso con taglio a 20-24 kHz'),figure(1),pause
h=2*real(ifft(H));
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 20-24 kHz'),figure(1),pause
clf
y=zeros(1,N);y(1:2:N)=x(1:2:N);
z=conv(y,h);
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1,wavwrite(z,fc,'camp48'),end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause
Ntr=100;Nview=100;
H=zeros(1,N);
n10=round(10000/df);
H(1:n10)=1;
H(n10+1:N/8+1)=cos(.5*pi*(1:(N/8-n10)+1)/(N/8-n10)).^2;
H(N:-1:7*N/8+1)=H(2:N/8+1);
h=4*real(ifft(H));
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 10-12 kHz'),figure(1),pause
clf
y=zeros(1,N);y(1:4:N)=x(1:4:N);
trasf=abs(fft(4*y));semilogy(f(1:N/4),trasf(1:N/4))
xlabel('f'),title('modulo trasformata del segnale campionato a 24 kHz'),figure(1),pause
z=conv(y,h);
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1,wavwrite(z,fc,'camp24'),end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause

end

Ntr=200;Nview=200;
H=zeros(1,N);
n5=round(5000/df);
H(1:n5)=1;
H(n5+1:N/16+1)=cos(.5*pi*(1:(N/16-n5)+1)/(N/16-n5)).^2;
H(N:-1:15*N/16+1)=H(2:N/16+1);
h=8*real(ifft(H));
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 5-6 kHz'),figure(1),pause
clf
if prefiltro==1
    xx=.125*conv(x,h);
    xx=xx(Ntr+1:N+Ntr);
    y=zeros(1,N);y(1:8:N)=xx(1:8:N);
else
    y=zeros(1,N);y(1:8:N)=x(1:8:N);
end
trasf=abs(fft(8*y));semilogy(f(1:N/8),trasf(1:N/8))
if prefiltro==0
    xlabel('f'),title('modulo trasformata del segnale campionato a 12 kHz'),figure(1),pause
else
    xlabel('f'),title('modulo trasformata del segnale prefiltrato e campionato a 12 kHz'),figure(1),pause
end
z=conv(y,h);
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1 & prefiltro==0,wavwrite(z,fc,'camp12'),end
if salvataggio==1 & prefiltro==1,wavwrite(z,fc,'camp12_prefiltrato'),end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause
Ntr=400;Nview=400;
H=zeros(1,N);
n2_5=round(2500/df);
H(1:n2_5)=1;
H(n2_5+1:N/32+1)=cos(.5*pi*(1:(N/32-n2_5)+1)/(N/32-n2_5)).^2;
H(N:-1:31*N/32+1)=H(2:N/32+1);
h=16*real(ifft(H));
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 2.5-3 kHz'),figure(1),pause
clf
if prefiltro==1
    xx=.0625*conv(x,h);
    xx=xx(Ntr+1:N+Ntr);
    y=zeros(1,N);y(1:16:N)=xx(1:16:N);
else
    y=zeros(1,N);y(1:16:N)=x(1:16:N);
end
trasf=abs(fft(16*y));semilogy(f(1:N/16),trasf(1:N/16))
if prefiltro==0
    xlabel('f'),title('modulo trasformata del segnale campionato a 6 kHz'),figure(1),pause
else
    xlabel('f'),title('modulo trasformata del segnale prefiltrato e campionato a 6 kHz'),figure(1),pause
end
z=conv(y,h);
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1 & prefiltro==0,wavwrite(z,fc,'camp6'),end
if salvataggio==1 & prefiltro==1,wavwrite(z,fc,'camp6_prefiltrato'),end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1),pause
Ntr=800;Nview=800;
H=zeros(1,N);
n1_25=round(1250/df);
H(1:n1_25)=1;
H(n1_25+1:N/64+1)=cos(.5*pi*(1:(N/64-n1_25)+1)/(N/64-n1_25)).^2;
H(N:-1:63*N/64+1)=H(2:N/64+1);
h=32*real(ifft(H));
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 1.25-1.5 kHz'),figure(1),pause
clf
if prefiltro==1
    xx=.03125*conv(x,h);
    xx=xx(Ntr+1:N+Ntr);
    y=zeros(1,N);y(1:32:N)=xx(1:32:N);
else
    y=zeros(1,N);y(1:32:N)=x(1:32:N);
end
trasf=abs(fft(32*y));semilogy(f(1:N/32),trasf(1:N/32))
if prefiltro==0
    xlabel('f'),title('modulo trasformata del segnale campionato a 3 kHz'),figure(1),pause
else
    xlabel('f'),title('modulo trasformata del segnale prefiltrato e campionato a 3 kHz'),figure(1),pause
end
z=conv(y,h);
z=z(Ntr+1:N+Ntr);
E_errore=(x-z)*(x-z)'*dt;
if salvataggio==1 & prefiltro==0,wavwrite(z,fc,'camp3'),end
if salvataggio==1 & prefiltro==1,wavwrite(z,fc,'camp3_prefiltrato'),end
plot(dt*(0:N-1),x-z),xlabel('t'),title(['errore      energia = ' num2str(E_errore)]),figure(1)
