% clc; clear all; close all; % clear all viene segnalato come warning da Matlab perchè non ottimale in % termini di code performances. E' chiaro che questo non provoca alcun % problema vista la ridotta complessità del codice, ma nel caso ci si % trovasse ad avaere a che fare con un codice molto complesso si consiglia % l'utilizzo alternativo di clearvars %% DEFINIZIONE DEI PARAMETRI E DI Tw V0=2; %Volt, valore di picco Phi0=0; %s, valore della fase f0=50; %Hz, valore dellla frequenza della sinusoide Tw=0.2; %s, larghezza della finestra di osservazione %% CREAZIONE ASSE DEI TEMPI CONTINUO t=linspace(0,Tw,10000); % Notare che questo comando realizza un vettore con punti equispaziati di % Tw/N-1=0.2/9999=0.00002 s, corrispondente quindi a un campionamento di % circa 50000 Hz, ben 1000 volte la frequenza del segnale: tale numero è più % che sufficiente per simulare un'acquisizione continua V=V0*sin(2*pi*f0*t+Phi0); % creazione del segnale continuo figure plot(t,V,'k'); % osservare il grafico senza l'interpolazione eseguita automaticamente da % Matlab, ma come dots permette di confermare visivamente quanto detto % sopra; provare a vedere come cambierebbe cambiando il valore di % campioni inseriti in linspace %% CREAZIONE DELL'ASSE DEI TEMPI E SEGNALE CAMPIONATO fs=1000; %Hz % fs va definita ricordando i discorsi visti sul teorema del campionamento, % per valutare come variano le varie analisi al variare di fs basterà % modificare qui il suo valore e ricompilare il codice ts=1/fs; %s, intervallo di campionamento, distanza tra due punti successivi N_sample=round(Tw/ts); % il comando round arrotonda al numero intero più vicino. In questo caso % restituirà il numero di campioni acquisiti nella finestra di osservazione t_sample=[0:N_sample-1]*ts; % poichè i campioni saranno N_sample, partendo da 0 è necessario porre come % limite superiore N_sample-1, altrimenti la lunghezza del vettore sarebbe % N_sample+1 V_SAMPLE=V0*sin(2*pi*f0*t_sample+Phi0);% creazione del segnale campionato %% CONFRONTO TRA SEGNALE CONTINUO E CAMPIONATO figure plot(t,V,'k'); % segnale continuo hold on plot(t_sample,V_SAMPLE,'ro-'); % segnale campionato mostrato come dots rossi interploati con linee % spezzate continue legend('Segnale continuo','Segnale campionato') xlabel('Tempo (s)') ylabel('Ampiezza segnale (V)') hold off % provare a ripetere fino a qui modificando il valore di fs, e valutando in % che punti vi è il massimo errore tra segnale continuo e campionato %% SIMULAZIONE OPERAZIONE DI QUANTIZZAZIONE ADC %1) Definizione parametri Vfs=2; CI=2*Vfs; %Vfs corrisponde al valore di fondo scala del quantizzatore, ossia il %riferimento massimo che viene preso per creare i sotto-livelli. Per un %quantizzatore bipolare il campo di ignresso CI sarà il doppio di Vfs % Attenzione alla sua scelta in modo che corrisponda al valore di picco del % segnale N_bit=6; % N_bit è il numero di cifre binarie disponibili per convertire le % ampiezze. E' proporzionale al numero di livelli. N_liv=2^N_bit; % N_liv è il numero di livelli disponibili, legato al numero di bit dalla % relazione 2^n_bit DELTA=CI/(N_liv); % DELTA è il passo di quantizzazione, la distanza tra due livelli % successivi. %2) Creazione del quantizzatore % Come prima cosa creiamo il vettore dei livelli, dividendo ciascun % campione del segnale campionato per l'ampiezza del passo di % quantizzazione, arrotondando in modo di trovare i livello corrispondente levels=round(V_SAMPLE/DELTA); % a questo punto replichiamo l'effetto della saturazione che si verifica % al di fuori del campo di ingresso for i=1:length(levels) if levels(i)>2^(N_bit-1)-1 levels(i)=2^(N_bit-1)-1; end if levels(i)<-2^(N_bit-1) levels(i)=-2^(N_bit-1); end end % una volta poste queste condizioni siamo pronti per moltiplicare il % vettore levels per il passo di quantizzazione per ottenere il nuovo % segnale quantizzato V_SAMPLE_q=DELTA.*levels; % calcoliamo poi il valore dell'errore di quantizzazione eq=V_SAMPLE_q-V_SAMPLE; figure plot(t_sample,V_SAMPLE,'b'); hold on plot(t_sample,V_SAMPLE_q,'r'); plot(t_sample,eq); hold off % A questo punto prendere confidenza con il processo di quantizzazioen % provando a variare il numero di bit, il valore di fondo scala rispetto % all'ampiezza del segnale %% Test per valutare il funzionamento del quantizzatore % se volete valutare che il vostro quantizzatore funzioni correttamente % potete farlo con un segnale test lineare da -Vfs a Vfs, ripetendo gli % stessi passaggi test=linspace(-2,2,1000); % 1) creazione dei livelli levels=round(test/DELTA); % 2) condizioni di saturazione for i=1:length(levels) if levels(i)>2^(N_bit-1)-1 levels(i)=2^(N_bit-1)-1; end if levels(i)<-2^(N_bit-1) levels(i)=-2^(N_bit-1); end end % 3) creazione dels egnale quantizzato test_q=DELTA*levels; figure plot(test); hold on plot(test_q,'r'); hold off %% CALCOLO DEL VALORE EFFICACE O RMS V_RMS_q=sqrt(1/N_sample*(sum(V_SAMPLE_q.*V_SAMPLE_q))); % Valore efficace calcolato sui campioni del segnale campionato e % quantizzato, attraverso la formula vista da teoria V_RMS_samp=sqrt(1/N_sample*(sum(V_SAMPLE.*V_SAMPLE))); % Valore efficace calcolato sui campioni del segnale campionato, %attraverso la formula vista da teoria V_RMS_cont=sqrt(1/10000*(sum(V.*V))); % Valore efficace calcolato sui campioni del segnale campionato, %attraverso la formula vista da teoria V_RMS_theory=V0/sqrt(2); % Valore efficace calcolato come da teoria sui segnali continui come % rapporto tra picco/sqrt(2) Error_cont=V_RMS_cont-V_RMS_theory; Error_sampled=V_RMS_samp-V_RMS_theory; Error_quant=V_RMS_q-V_RMS_theory; % utile sfruttare questa sezione per valutare come cambiano i valori % efficaci in base alle scelte compiute sia in fase di campionamento che % in fase di quantizzazione %% AGGIUNTA DEL RUMORE, CONFRONTO DEI SEGNALI E CALCOLO SNR SNR=30; % espresso in lineare come (Val_eff_segnale)^2/(Val_eff_rumore)^2 SNR_dB=10*log10(SNR); % il corrispondente SNR in dB %noto l'SNR è possibile calcolare la potenza del rumore e il relativo %valore efficace come: P_noise=(V_RMS_samp^2)/SNR; V_eff_noise=sqrt(P_noise); % a questo punto si può creare un vettore contenente i campioni del rumore % con il comando randn scalandolo per il valore efficace noise=V_eff_noise*randn(1,N_sample); % Possiamo a questo punto creare il vattore con rumore aggiungendo noise al % segnale campionato V_signal_noise=V_SAMPLE+noise; figure plot(t_sample, V_SAMPLE,'r'); hold on plot(t_sample, V_signal_noise,'b'); xlabel('time(s)'); ylabel('Amplitude(V)'); hold off figure periodogram(V_signal_noise); hold on periodogram(V_SAMPLE); hold off SNR_th=snr(V_signal_noise); % espresso in dB, da confrontare quindi con SNR_dB, a meno di % approssimazioni dovute all'algoritmo di stima usato; Provare a cambiare % il numero di bit e di fs per vedere come variano tra loro questi due % valori