vuoi
o PayPal
tutte le volte che vuoi
–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