–ASCII
Nel file elnino.mat (load elnino.mat) vi sono tali valori, misurati ogni mese per 14 anni.
Effettuare il grafico del fenomeno, ed il periodogramma.
Determinare i due picchi di massima potenza ed il corrispondente periodo.
Svolgimento
Tramite i valori contenuti nel file elnino.mat abbiamo calcolato i parametri essenziali per analizzare
il fenomeno nel tempo e nella frequenza.
load -ASCII elnino.mat;
samplingFrequency = 1; % una al mese
samplesNumber = numel(elnino); % numero di campioni
samplingInstants = 1:samplesNumber; % in mesi
time = samplesNumber/samplingFrequency; % tempo (in mesi)
spectrumFrequencies = (0:samplesNumber-1) / time; % frequenze dello spettro
maxFrequencyIndex = ceil((samplesNumber+1)/2);
%indice della frequenza più alta rappresentata nello spettro
Abbiamo graficato il fenomeno nel dominio del tempo.
% grafico del fenomeno nel dominio del tempo
figure();
subplot(2,1,1);
plot(samplingInstants, elnino);
xlabel('Months'); ylabel('Southern Oscillation Index');
title('Phenomenon El Nino');
% applicazione della fast fourier transform
elninoAbsSpectrum = abs(fft(elnino));
% grafico del fenomeno nel dominio della frequenza senza DC
subplot2 = subplot(2,1,2);
box(subplot2,'on');
hold(subplot2,'all');
xlim(subplot2,[0 0.51]);
stem(spectrumFrequencies(2:maxFrequencyIndex),elninoAbsSpectrum(2:maxFrequencyIndex),'Parent',su
bplot2);
title('Periodogram of Phenomenon El Nino');
xlabel('Frequency (1/Month)'); ylabel('Amplitude');
Per determinare i due picchi di massima potenza, analizziamo il fenomeno El Nino nel dominio
della frequenza tramite l’applicazione della “Fast Fourier Transform”. Inoltre abbiamo graficato il
periodogramma.
% prendo solo le componenti necessarie per un segnale reale
maxAmplitude = elninoAbsSpectrum(1:maxFrequencyIndex);
maxAmplitude(1) = 0; %annullo componente continuo
% calcolo dei picchi di massima ampiezza
[maxAmplitude,orderIndex] = sort(maxAmplitude,'descend');
% calcolo le frequenze relative ai picchi
maxFrequencies = spectrumFrequencies(orderIndex);
maxPeriod = 1./maxFrequencies;
Per determinare i picchi abbiamo preso solo le componenti significative del fenomeno e le abbiamo
ordinate in maniera decrescente; successivamente calcoliamo le frequenze e i periodi relativi ai
picchi.
stem(maxFrequencies(1:2),maxAmplitude(1:2),'MarkerFaceColor',[1 0 0],'Parent',subplot2);
text(maxFrequencies(1),maxAmplitude(1)+20,'1° Peak','FontSize',8);
text(maxFrequencies(2),maxAmplitude(2)+20,'2° Peak','FontSize',8);
text(0.20,200,[ ...
' --- First Peak --- ' 10 13 ...
'Amplitude: ' num2str(maxAmplitude(1)) 10 13 ...
'Frequency: ' num2str(maxFrequencies(1)) ' 1/month' 10 13 ...
'Period : ' num2str(maxPeriod(1)) ' months'],'FontSize',6);
text(0.35,200,[ ...
'--- Second Peak --- ' 10 13 ...
'Amplitude: ' num2str(maxAmplitude(2)) 10 13 ...
'Frequency: ' num2str(maxFrequencies(2)) ' 1/month' 10 13 ...
'Period : ' num2str(maxPeriod(2)) ' months'], 'FontSize',6);
Infine, abbiamo evidenziato nel periodogramma i primi 2 picchi trovati, ed inoltre visualizzato le
relative ampiezze, frequenze e periodi. Phenomenon El Nino
Index 20
Oscillation 15
10
Southern 5
0 0 20 40 60 80 100 120 140 160 180
Months
Periodogram of Phenomenon El Nino
300 1° Peak --- First Peak --- --- Second Peak ---
Amplitude: 259.5953 Amplitude: 118.9278
Amplitude 200 Frequency: 0.083333 1/month Frequency: 0.02381 1/month
Period : 12 months Period : 42 months
2° Peak
100
0 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5
Frequency (1/Month)
Il risultato dell’elaborazione è mostrato in figura.
Esercizio 3
Specifiche
Realizzare due function file:
1) La codifica DTMF di un numero di telefono. Il segnale generato è costituito per ogni cifra
da un tono di 0.5sec. seguito da un silenzio di 0.2sec. La frequenza di campionamento è
Fs=8000Hz.
2) La decodifica di un segnale che individua un numero di telefono. Il segnale è composto da
un tono di 0.5sec. per ogni cifra seguito da un silenzio di 0.2sec. La frequenza di
campionamento è Fs=8000Hz.
Svolgimento
Vedere documentazione esterna di dtmf.m; dtmfInv.m; dtmfPhone.m.
Esempi d’uso:
>> audio = dtmf('08173855AB');
>> sound(audio,8000);
>> dtmfInv(audio),
ans =
08173855AB
>> audio = dtmfPhone('withVoice');
Prima della digitazione Dopo la digitazione del numero
>> % chiuderea la GUI e proseguire
>> dtmfInv(audio),
ans =
0817309#BCC
>>
Esercizio 4
Specifiche
Comporre un file musicale, ascoltarlo e scriverlo su un file WAVE.
Nel file WAVE note.wav vi è un segnale sonoro costituito da sei note, ognuna della durata di 0.5 sec.,
con frequenza di campionamento Fs=8000. Fare il grafico dello spettro di note.wav. Estrarre le sei note
(A=LA4, B=SI4, C=DO#5, D=RE5, E=MI5, F=FA#5) e combinarle per ottenere il brano musicale da
salvare, composto dalla seguenti strofe:
Strofa (I) AA EE FF EE
Strofa (II) DD CC BB AA
Strofa (III) EE DD CC BB x2
ripetere strofe I e II.
Svolgimento
Carichiamo il file audio note.wav e calcoliamo i parametri essenziali per analizzare il file.
[notes samplingFrequency]=wavread('note.wav'); %caricamento file note.wav
samplesNumber = numel(notes); % numero di campioni
samplingInstants = (0:(samplesNumber-1))/samplingFrequency; % in sec
time = samplesNumber/samplingFrequency; % tempo (in sec)
spectrumFrequencies = (0:samplesNumber-1) / time; % frequenze dello spettro
maxFrequencyIndex = ceil((samplesNumber+1)/2);
%indice della frequenza più alta rappresentata nello spettro
noteNumber = 6; %numero di note del file note.wav
samplesPerNote = floor(samplesNumber/noteNumber);
%calcolo dello spettro dell'audio note.wav
notesAbsSpectrum = abs(fft(notes));
%calcolo dello spettrogramma usando la Short-Time Fourier Transform (STFT)
[notesSTFT,notesSTFT_F,notesSTFT_T] = spectrogram(notes,128,120,256,samplingFrequency);
% notesSTFT (matrice)spettrogramma dell'audio note.wav
% notesSTFT_F vettore delle frequenze su cui lo spettrogramma è calcolato
% notesSTFT_T vettore dei tempi su cui lo spettrogramma è calcolato
%
Calcolo dello spettro e dello spettrogramma di note.wav.
% grafico dello spettrogramma dell'audio note.wav
figure1 = figure;
axes1 = subplot(2,2,1,'Parent',figure1);
hold(axes1,'all');
surf(notesSTFT_T,notesSTFT_F,abs(notesSTFT),'Parent',axes1,'EdgeColor','none');
xlim([0 time]); ylim([0 1000]);
colormap(1-gray);
title('STFT of Signal');
xlabel('Time (sec)'); ylabel('Frequency (Hz)');
% grafico dello spettro dell'audio note.wav
axes2 = subplot(2,2,2,'Parent',figure1);
plot(spectrumFrequencies(2:maxFrequencyIndex),notesAbsSpectrum(2:maxFrequencyIndex));
view([90 -90]); xlim([0 1000]);
title('Spectrum of Signal');
xlabel('Frequency (Hz)'); ylabel('Amplitude');
% grafico dell'audio note.wav nel dominio del tempo
axes3 = subplot(2,2,3,'Parent',figure1);
plot(samplingInstants,notes);
xlim([0 time]);
xlabel('Time (sec)'); ylabel('Signal');
Grafichiamo lo spettro, lo spettrogramma e l’andamento temporale di note.wav .
STFT of Signal Spectrum of Signal
1000 1000
(Hz) (Hz)
Frequency Frequency
500 500
0 0
0 1 2 3 0 500 1000 1500
Time (sec) Amplitude
1
0.5
Signal 0
-0.5
-1 0 1 2 3
Time (sec)
% estrazione note dal segnale
A = notes(1:samplesPerNote)'; %LA4
B = notes(samplesPerNote+1:2*samplesPerNote)'; %SI4
C = notes(2*samplesPerNote+1:3*samplesPerNote)'; %DO#5
D = notes(3*samplesPerNote+1:4*samplesPerNote)'; %RE5
E = notes(4*samplesPerNote+1:5*samplesPerNote)'; %MI5
F = notes(5*samplesPerNote+1:6*samplesPerNote)'; %FA#5
% composizione delle strofe
strophe1 = [A A E E F F E E];
strophe2 = [D D C C B B A A];
strophe3 = [E E D D C C B B];
% composizione del brano
track = [strophe1 strophe2 strophe3 strophe3 strophe1 strophe2];
% salvo il brano nel file brano.wav
wavwrite(track,samplingFrequency,'track.wav');
Sono state estratte le 6 note da note.wav, ed è stato composto il brano come da specifica.
% Costruzione dello spartito del brano
figure();
axes4 = axes();
hold(axes4,'all');
%calcolo dello spettrogramma usando la Short-Time Fourier Transform (STFT)
[trackSTFT,trackSTFT_F,trackSTFT_T] = spectrogram(track,256,120/8,256,samplingFrequency);
% trackSTFT (matrice)spettrogramma del brano
% trackSTFT_F vettore delle frequenze su cui lo spettrogramma è calcolato
% trackSTFT_T vettore dei tempi su cui lo spettrogramma è calcolato
%
pentagramLabel = {'Do4','Do#4','Re4','Re#4','Mi4','Fa4','Fa#4','Sol4', ...
'Sol#4','La4','La#4','Si4','Do5','Do#5','Re5','Re#5', ...
'Mi5','Fa5','Fa#5','Sol5'};
pentagramNote = 440.* 2.^((-9:10)./12);
pentagramLine = 440.* 2.^([-5 -2 2 5 8]./12);
trackLevel = double(abs(trackSTFT)>60);
colormap([1 1 1; 0 0 0]);
surf(trackSTFT_T,trackSTFT_F,trackLevel,'Parent',axes4, 'EdgeColor','none');
set(axes4,'YTickLabel',pentagramLabel,'YTick',pentagramNote,'Yscale','log');
plot([0 numel(track)/samplingFrequency],[pentagramLine ; pentagramLine], ...
'LineWidth',2, 'Color',[0.5 0.5 0.5] , 'LineStyle' ,'-');
title('Sheet music of track');
xlabel('Time (sec)'); ylabel('Notes');
ylim([200 900]); xlim([0 numel(track)/samplingFrequency]);
% riproduzione del brano
sound(track,samplingFrequency);
Infine abbiamo creato il pentagramma e graficato lo spartito del brano.
Sheet music of track
Sol5
Fa#5
Fa5
Mi5
Re#5
Re5
Do#5
Do5
Si4
La#4
Notes La4
Sol#4
Sol4
Fa#4
Fa4
Mi4
Re#4
Re4
Do#4
Do4 0 5 10 15 20
Time (sec)
dtmf :: Functions file:///D:/Universita/workspaceCN/Elaborati2/dtmf/dtmf.html
dtmf
Dato in ingresso un codice numerico lo codifica in un segnale sonoro secondo il sistema Dual Tone Multi-
Frequency(DTMF).
Sintassi
audio = dtmf(number)
Descrizione , restituisce
-
Calcolo Numerico II – Elaborato
-
Calcolo Numerico II – Elaborato
-
Calcolo
-
Calcolo Numerico – Elaborato