Analisi Segnale Multiarmonico - Programma Matlab PDF

Title Analisi Segnale Multiarmonico - Programma Matlab
Author Roberta Diaferia
Course Misure Elettriche [2255]
Institution Politecnico di Bari
Pages 16
File Size 1 MB
File Type PDF
Total Downloads 14
Total Views 130

Summary

Esercitazione Matlab - Analisi nel tempo e nelle frequenze di un segnale multiarmonico rumoroso


Compito da svolgere
1) Generare una sinusoide di ampiezza e frequenza a piacere, visualizzarla nel tempo e nel dominio delle frequenze. Calcolare valore medio e valore efficace....


Description

Ese Eserrcit citazio azio azione ne Matla atlab b-A Analis nalis nalisii nel ttem em empo po e n nelle elle ffreq req requen uen uenzze di un segn segnale ale mu multiar ltiar ltiarmo mo monico nico rum rumor or oroso oso

Co Compit mpit mpito o da sv svolg olg olger er ere e 1) Generare una sinusoide di ampiezza e frequenza a piacere, visualizzarla nel tempo e nel dominio delle frequenze. Calcolare valore medio e valore efficace. Commentare i risultati. 2) Ripetere la prova aggiungendo un rumore a distribuzione Gaussiana, a media nulla e deviazione standard pari a 1/3 del valore di picco dell’ampiezza della sinusoide. Calcolare valore medio e valore efficace. Commentare i risultati. 3) Ripetere la prova con rumore a distribuzione Gaussiana a media diversa da zero e deviazione standard pari a 4/3 del valore di picco dell’ampiezza della sinusoide. Calcolare valore medio e valore efficace. Commentare i risultati. 4) Ripetere 2) e 3) con rumore a distribuzione uniforme. 5) Generare segnale multiarmonico a quattro componenti, visualizzarlo nel tempo e nel dominio delle frequenze. Calcolare valore medio e valore efficace. Commentare i risultati. 6) Ripetere 2), 3), 4) con segnale 5). 7) Generare un’onda quadra di ampiezza e frequenza a piacere, visualizzarla nel tempo e nel dominio delle frequenze. Calcolare valore medio e valore efficace. Commentare i risultati. 8) Generare un’onda triangolare di ampiezza e frequenza a piacere, visualizzarla nel tempo e nel dominio delle frequenze. Calcolare valore medio e valore efficace. Commentare i risultati.

Programma Matlab – Suddivisione nelle varie funzioni ES_Matlab01.m  main del programma % L'obiettivo di questa esercitazione è quello di analizzare l’andamento % di vari segnali periodici nel dominio del tempo e di ricavarne lo spettro % delle ampiezze nel dominio delle frequenze.

% RESET DEL WORKSPACE E DELLA COMMAND WINDOW clc; clear variables; close all;

% DAL PUNTO 1 AL 4 disp('Generiamo un segnale sinusoidale.'); [N, f, Tc, df] = get_info(); campionamenti = (0:N-1); istanti = Tc*campionamenti; % Input dell'ampiezza e della fase iniziale della sinusoide k = 1; A = double_input('Inserisci l''ampiezza della sinusoide: '); fi = double_input('Inserisci la fase iniziale [rad] della sinusoide: '); % Costruisco il segnale segnale = costruisci_segnale(k, A, fi, f, istanti); % Calcolo il valore di picco del segnale picco = max(segnale); % Mostra il grafico dei tempi grafico(istanti, segnale, 'k', 'Segnale sinusoidale', 't [s]', 's(t)'); % Mostro lo spettro delle ampiezze spettro(N, df, segnale, 'k', 'Spettro del segnale sinusoidale', 'f [Hz]', 'S(f)'); disp(newline); disp('Sommo al segnale sinusoidale un rumore a distribuzione gaussiana, con media nulla e varianza 1/3 del valore di picco del segnale iniziale.'); media = 0; deviazione = picco*1/3; varianza = deviazione^2; segnale_rumoroso = add_rumore_gaussiano(segnale, media, varianza, N); % Mostra il grafico dei tempi grafico(istanti, segnale_rumoroso, '', 'Segnale con rumore gaussiano', 't [s]', 's(t)+n1(t)');

% Mostro lo spettro delle ampiezze spettro(N, df, segnale_rumoroso, '', 'Spettro del segnale con rumore gaussiano', 'f [Hz]', 'S(f)+N1(f)'); disp(newline); disp('Sommo al segnale sinusoidale un rumore a distribuzione gaussiana, con media NON nulla (assunta pari a 2) e varianza 4/3 del valore di picco del segnale iniziale.'); media = 2; deviazione = picco*4/3; varianza = deviazione^2; segnale_rumoroso = add_rumore_gaussiano(segnale, media, varianza, N); % Mostra il grafico dei tempi grafico(istanti, segnale_rumoroso, 'c', 'Segnale con rumore gaussiano', 't [s]', 's(t)+n2(t)'); % Mostro lo spettro delle ampiezze spettro(N, df, segnale_rumoroso, 'c', 'Spettro del segnale con rumore gaussiano', 'f [Hz]', 'S(f)+N2(f)'); disp(newline); disp('Sommo al segnale sinusoidale un rumore a distribuzione uniforme, a media nulla e massimo 1/3 del valore di picco del segnale iniziale.'); media = 0; deviazione = picco*1/3; varianza = deviazione^2; segnale_rumoroso = add_rumore_uniforme(segnale, media, varianza, N); % Mostra il grafico dei tempi grafico(istanti, segnale_rumoroso, 'm', 'Segnale con rumore uniforme', 't [s]', 's(t)+n3(t)'); % Mostro lo spettro delle ampiezze spettro(N, df, segnale_rumoroso, 'm', 'Spettro del segnale con rumore uniforme', 'f [Hz]', 'S(f)+N3(f)'); disp(newline); disp('Sommo al segnale sinusoidale un rumore a distribuzione uniforme, a media NON nulla (assunta pari a 10) e massimo 4/3 del valore di picco del segnale iniziale.'); media = 10; deviazione = picco*4/3; varianza = deviazione^2; segnale_rumoroso = add_rumore_uniforme(segnale, media, varianza, N); % Mostra il grafico dei tempi grafico(istanti, segnale_rumoroso, 'g', 'Segnale con rumore uniforme', 't [s]', 's(t)+n4(t)');

% Mostro lo spettro delle ampiezze spettro(N, df, segnale_rumoroso, 'g', 'Spettro del segnale con rumore uniforme', 'f [Hz]', 'S(f)+N4(f)'); % DAL PUNTO 5 AL 6 disp(newline); disp('Generiamo un segnale multiarmonico a 4 componenti sinusoidali.'); [N, f, Tc, df] = get_info(); campionamenti = (0:N-1); istanti = Tc*campionamenti; % Input degli ordini armonici, delle ampiezze e delle fasi iniziale % delle armoniche k = zeros(4); A = zeros(4); fi = zeros(4); for i = 1:4 [armonica, ampiezza, fase] = get_armonica(i); k(i) = armonica; A(i) = ampiezza; fi(i) = fase; end % Costruisco il segnale segnale = costruisci_segnale(k, A, fi, f, istanti); % Calcolo il valore di picco del segnale picco = max(segnale); % Mostra il grafico dei tempi grafico(istanti, segnale, 'k', 'Segnale sinusoidale', 't [s]', 's(t)'); % Mostro lo spettro delle ampiezze spettro(N, df, segnale, 'k', 'Spettro del segnale sinusoidale', 'f [Hz]', 'S(f)'); disp(newline); disp('Sommo al segnale sinusoidale un rumore a distribuzione gaussiana, con media nulla e varianza 1/3 del valore di picco del segnale iniziale.'); media = 0; deviazione = picco*1/3; varianza = deviazione^2; segnale_rumoroso = add_rumore_gaussiano(segnale, media, varianza, N); % Mostra il grafico dei tempi grafico(istanti, segnale_rumoroso, '', 'Segnale con rumore gaussiano', 't [s]', 's(t)+n1(t)');

% Mostro lo spettro delle ampiezze spettro(N, df, segnale_rumoroso, '', 'Spettro del segnale con rumore gaussiano', 'f [Hz]', 'S(f)+N1(f)'); disp(newline); disp('Sommo al segnale sinusoidale un rumore a distribuzione gaussiana, con media NON nulla (assunta pari a 2) e varianza 4/3 del valore di picco del segnale iniziale.'); media = 2; deviazione = picco*4/3; varianza = deviazione^2; segnale_rumoroso = add_rumore_gaussiano(segnale, media, varianza, N); % Mostra il grafico dei tempi grafico(istanti, segnale_rumoroso, 'c', 'Segnale con rumore gaussiano', 't [s]', 's(t)+n2(t)'); % Mostro lo spettro delle ampiezze spettro(N, df, segnale_rumoroso, 'c', 'Spettro del segnale con rumore gaussiano', 'f [Hz]', 'S(f)+N2(f)'); disp(newline); disp('Sommo al segnale sinusoidale un rumore a distribuzione uniforme, a media nulla e massimo 1/3 del valore di picco del segnale iniziale.'); media = 0; deviazione = picco*1/3; varianza = deviazione^2; segnale_rumoroso = add_rumore_uniforme(segnale, media, varianza, N); % Mostra il grafico dei tempi grafico(istanti, segnale_rumoroso, 'm', 'Segnale con rumore uniforme', 't [s]', 's(t)+n3(t)'); % Mostro lo spettro delle ampiezze spettro(N, df, segnale_rumoroso, 'm', 'Spettro del segnale con rumore uniforme', 'f [Hz]', 'S(f)+N3(f)'); disp(newline); disp('Sommo al segnale sinusoidale un rumore a distribuzione uniforme, a media NON nulla (assunta pari a 10) e massimo 4/3 del valore di picco del segnale iniziale.'); media = 10; deviazione = picco*4/3; varianza = deviazione^2; segnale_rumoroso = add_rumore_uniforme(segnale, media, varianza, N); % Mostra il grafico dei tempi grafico(istanti, segnale_rumoroso, 'g', 'Segnale con rumore uniforme', 't [s]', 's(t)+n4(t)');

% Mostro lo spettro delle ampiezze spettro(N, df, segnale_rumoroso, 'g', 'Spettro del segnale con rumore uniforme', 'f [Hz]', 'S(f)+N4(f)'); % PUNTO 7 disp(newline); disp('Generiamo un segnale onda quadra.'); [N, f, Tc, df] = get_info(); duty = double_input('Inserisci il duty cycle dell''onda: '); while duty < 0 || duty > 100 disp(' Sono accettati solo valori percentuali, riprova!'); duty = double_input('Inserisci il duty cycle dell''onda: '); end A = double_input('Inserisci l''ampiezza dell''onda: '); campionamenti = (0:N-1); istanti = Tc*campionamenti; quadra = A*square(2*pi*f*istanti, duty); fprintf('Il segnale onda quadra ha valore medio %.2f e valore efficace %.2f.\n', mean(quadra), rms(quadra)); % Mostra il grafico dei tempi grafico(istanti, quadra, 'r', 'Segnale onda quadra', 't [s]', 'sq(t)'); % Mostro lo spettro delle ampiezze spettro(N, df, quadra, 'r', 'Spettro del segnale onda quadra', 'f [Hz]', 'Sq(f)'); % PUNTO 8 disp(newline); disp('Generiamo un segnale onda trinagolare.'); [N, f, Tc, df] = get_info(); A = double_input('Inserisci l''ampiezza dell''onda: '); campionamenti = (0:N-1); istanti = Tc*campionamenti; triangolare = A*sawtooth(2*pi*f*istanti, 0.5); fprintf('Il segnale onda trinagolare ha valore medio %.2f e valore efficace %.2f.\n', mean(triangolare), rms(triangolare)); % Mostra il grafico dei tempi grafico(istanti, triangolare, 'b', 'Segnale onda trinagolare', 't [s]', 'tr(t)'); % Mostro lo spettro delle ampiezze spettro(N, df, triangolare, 'b', 'Spettro del segnale onda triangolare', 'f [Hz]', 'Tr(f)');

add_rumore_gaussiano.m

% AGGIUNGE RUMORE GAUSSIANO function segnale_rumoroso = add_rumore_gaussiano(segnale, media, varianza, N) rumore = media + varianza*randn(1, N); segnale_rumoroso = segnale + rumore; fprintf('Il segnale con rumore gaussiano ha valore medio %.2f e valore efficace %.2f.\n', mean(segnale_rumoroso), rms(segnale_rumoroso)); return end

add_rumore_uniforme.m

% AGGIUNGE RUMORE UNIFORME function segnale_rumoroso = add_rumore_uniforme(segnale, media, varianza, N) rumore = media + varianza*rand(1, N); segnale_rumoroso = segnale + rumore; fprintf('Il segnale con rumore uniforme ha valore medio %.2f e valore efficace %.2f.\n', mean(segnale_rumoroso), rms(segnale_rumoroso)); return end

costruisci_segnale.m % COSTRUISCE IL SEGNALE MULTIARMONICO function segnale = costruisci_segnale(k, A, fi, f, t) len = length(k); % Numero di armoniche da sommare segnale = 0; for i = 1:len % onda = ampiezza * sin( 2pigreco*frequenza del segnale*numero dell'armonica*t + fase iniziale) sinusoide = A(i)*sin( 2*pi*f*k(i)*t + fi(i) ); segnale = segnale + sinusoide; end fprintf('Il segnale ha valore medio %.2f e valore efficace %.2f.\n', mean(segnale), rms(segnale)); return end

double_input.m % INPUT SOLO DI TIPO DECIMALE function X = double_input(prompt) while true str = input(prompt,'s'); str = strrep(str,',','.'); X = str2double(str); if numel(X)==1 && ~isnan(X) return else disp(' Sono accettati solo valori decimali, riprova!'); end end end

get_armonica.m % INPUT INFO ARMONICA function [k, A, fi] = get_armonica(indice) if indice == 1 disp('La prima componente ha ordine armonico 1.'); k = 1; else k = int_input( strcat(['Inserisci l''ordine dell''armonica n°', num2str(indice), ': ']) ); end A = double_input( strcat(['Inserisci l''ampiezza dell''armonica n°', num2str(indice), ': ']) ); fi = double_input( strcat(['Inserisci la fase iniziale [rad] dell''armonica n°', num2str(indice), ': ']) ); return end

get_info.m

% INPUT INFO SEGNALE PERIODICO function [N, f, Tc, df] = get_info() % Input di numero di campionamenti, frequenza, numero di % periodi di osservazione, da cui ricavare passo di campionamento e % intervallo infinitesimo per i campionamenti nel dominio delle frequenze disp('Sono richiesti i dati del segnale.'); N = int_input('Inserisci il numero di campionamenti: '); % A differenza degli altri dati decimali richiesti in input, si assume % che la frequenza debba essere positiva f = double_input('Inserisci la frequenza del segnale [Hz]: '); while f0 && (mod(X,1)==0) && ~isnan(X) return else disp(' Sono accettati solo valori interi positivi, riprova!'); end end end

spettro.m

% CREA LO SPETTRO DELLE AMPIEZZE function spettro(N, df, segnale, colore, titolo, Xlabel, Ylabel) disp('Genero lo spettro delle ampiezze del segnale.'); len = floor(N/8); asseX = (0:len-1)*df; spettro = abs(fft(segnale)); spettro = [spettro(1) 2*spettro(2:len)]/N; % Ripiegamento in frequenza figure('Name', 'Spettro delle ampiezze'), stem(asseX, spettro(:,1:len), colore), title(titolo), xlabel(Xlabel), ylabel(Ylabel) end

L’obiettivo di questa esercitazione è quello di analizzare l’andamento dei vari segnali periodici nel dominio del tempo e di ricavare lo spettro delle ampiezze nel dominio delle frequenze. Il risultato dell’analisi è stato conseguito tramite la stesura di un codice scritto in linguaggio di programmazione MATLAB (fare riferimento al programma ES_Matlab01.m allegato). Per segnale si intende una funzione matematica che rappresenti la variazione di una grandezza fisica (ad esempio: tensione, corrente, ecc). [NOTA: Per ricavare tutti i seguenti grafici sono stati inseriti come valori arbitrari: ampiezze pari a 5, frequenze del valore di 50 Hz e numero di campionamenti pari a 800]



Il primo segnale preso in esame è una sinusoide (grafico 1) e il suo relativo spettro (grafico 2):

Dal grafico 2 si evince che il segnale è costituito da una sola armonica alla frequenza fondamentale di valore 50 Hz e ampiezza 5. Inoltre, alla frequenza di 0 Hz lo spettro indica un valore nullo che si riferisce al valore medio del segnale.



Successivamente, a tale segnale è stato aggiunto un rumore a distribuzione gaussiana, con media nulla e deviazione standard pari ad un terzo del valore di picco dell’ampiezza della sinusoide.

Dal grafico 3 si deduce che la distorsione prodotta dal rumore non altera significativamente la forma dell’onda ma al contempo non permette una distinzione precisa delle singole componenti che la costituiscono. Osservando il dominio delle frequenze (grafico 4) però, è ancora possibile riconoscere la riga corrispondente all’armonica fondamentale, con un valore di ampiezza che si aggira nell’intorno di quello del segnale non sporcato, inoltre rispetto al grafico 2 è ora possibile notare che il rumore si esprime con componenti non nulle, che si distribuiscono su tutta la banda delle frequenze. Si vuole evidenziare, però, che le componenti non sono ancora tali da modificare il valor medio del segnale, il quale si aggira attorno a valori sempre vicini allo 0.



Se al segnale di partenza si aggiunge invece un rumore a distribuzione gaussiana a media non nulla (assunta pari a 2) e deviazione standard pari a 4/3 del valore di picco, si ottengono i seguenti grafici:

Analizzando l’andamento temporale del grafico 5, a causa della forte intensità della distorsione applicata, non è più possibile riconoscere la forma d’onda. Parallelamente, nel grafico 6, le righe spettrali del rumore sono confrontabili con la riga dell’armonica fondamentale, pertanto il segnale di partenza non è più filtrabile.



Applicando alla sinusoide un rumore a distribuzione uniforme, a media nulla e deviazione standard pari ad 1/3 del valore di picco, il grafico corrispondente (figura 7) risulterà nuovamente disturbato ma con forma d’onda riconoscibile, quindi ancora una volta nel grafico 8 l’ampiezza della frequenza fondamentale è distinguibile rispetto alle ampiezze del rumore. Essendo uniforme la distribuzione, il valor medio visualizzabile alla frequenza 0 Hz risulta non più nullo.



Equivalentemente al caso precedente (grafico 5-6), considerando un valore di deviazione standard di 4/3 del valore di picco e media non nulla (assunta pari a 10), non si distingue in modo importante la riga spettrale associata alla frequenza fondamentale. L’unica differenza risulta essere il valore medio della funzione, il quale subisce un incremento più significativo (grafico 9-10).



Prendendo in esame un segnale periodico multiarmonico costituito da 4 componenti, ciascuna caratterizzata da una propria ampiezza, fase iniziale e ordine armonico (grafico 11), il segnale ha sempre valor medio nullo e le 4 componenti sono ben distinguibili nello spettro (grafico 12).

Si ripetano tutti i passaggi già visti precedentemente. •

Applicando un rumore a distribuzione gaussiana (µ = 0 e σ = 1/3 del valore di picco del segnale), la forma d’onda è ancora sommariamente riconoscibile, il valore medio è ancora prossimo a 0, e le righe spettrali delle 4 armoniche sono evidenti.



Si consideri invece media pari a 2 e deviazione standard 4/3 del valore di picco: la forma d’onda è totalmente distorta, e ciò si ripercuote nel dominio delle frequenze, in cui per ogni valore di f le ampiezze sono tra loro paragonabili.



Applicando un rumore uniforme (µ = 0 e σ = 1/3 del valore di picco del segnale) nel dominio dei tempi, l’onda risulterà poco distorta. Dall’analisi frequenziale è possibile riconoscere le 4 componenti riferite alle armoniche e il valor medio risulterà alterato.



La distribuzione uniforme (µ = 10 e σ = 4/3 del valore di picco del segnale) anche in questo caso renderà l’onda di partenza irriconoscibile (grafico 19). Spostando l’attenzione sull’analisi spettrale (grafico 20), si nota come il valor medio sia fortemente influenzato dal rumore.



Si analizzi adesso un’onda quadra (grafico 21):

Nello spettro delle frequenze è possibile riscontrare che questo tipo di onda periodica sia ottenibile dalla somma di infinite componenti frequenziali di ordine armonico dispari, la cui ampiezza segue l’andamento di un’esponenziale decrescente (grafico 22).



Si analizzi un’onda triangolare (grafico 23):

Anche lo spettro di questo segnale evidenzia la presenza di infinite componenti armoniche di ordine dispari le cui ampiezze decadono sempre con legge esponenziale, ma più velocemente rispetto all’onda quadra. Infatti, nell’onda quadra decadono in modo inverso rispetto all’ordine dell’armonica, mentre nell’onda triangolare in modo quadratico inverso.

Infine, si nota che applicando a qualunque segnale di partenza una distorsione di qualunque natura, il valore efficace tende ad aumentare. Quest’ultimo è definito dalla radice dell’integrale sul periodo del quadrato della funzione, perciò nel caso di segnale disturbato, che presenta ampiezze mediamente maggiori rispetto al segnale di partenza, il valore calcolato risulterà essere maggiore rispetto al medesimo calcolo effettuato per il segnale non sporcato....


Similar Free PDFs