Ensimmäisellä tunnilla Fourier-muunnoksen ominaisuuksiin.
Ominaisuuksista tutustuttiin lähemmin siirtoon ajassa (esim. laske
signaalin x(n+20) muunnos, kun tiedetään x(n):n muunnos) sekä konvoluution muunnokseen (DFT muuntaa konvoluution kertolaskuksi, eli x(n)*y(n) -> X(n)Y(n)).
Yksi tämän ominaisuuden seurauksista on että Fourier-muunnoksen (käytännössä FFT:n) avulla voidaan laskea konvoluutio kaavasta (Matlabin syntaksilla ilmaistuna):
conv(x,y) = ifft(fft(x) .* fft(y))
Lisäksi käsiteltiin nopeaa Fourier-muunnosta eli FFT:tä,
joka on vain nopeampi tapa toteuttaa diskreetti Fourier-muunnos (DFT).
FFT perustuu signaalin jakamiseen lyhyempiin pätkiin, jotka muunnetaan
jakamalla ne edelleen rekursiivisesti kahtia. Rekursio päättyy, kun
muunnoksen pituus on 1, jolloin muunnosta ei tarvitse enää tehdä.
1-ulotteisen vektorin tapauksessa muunnosmatriisi on yksinkertaisesti F =
[1], joka tarkoittaa pelkkää ykkösellä kertomista eikä sitä tarvitse
tehdä. Lyhyemmistä vektoreista saadaan koostettua pidemmät vektorit
kaavoilla (3.3) ja (3.4).
Lisäksi tutustuttiin demoon, jossa tunnistettiin automaattisesti puheesta S-kirjaimet. Alla on luennon esimerkkikoodi S-kirjaimen tunnistuksesta.
function vokaalin_tunnistus()
%
% Esimerkki vokaalin ja S-kirjaimen erottelusta äänisignaalista.
% heikki.huttunen@tut.fi -- 4.2.2015
%
close all
% Ladataan opetusaineisto:
[x, Fs] = audioread('seiska.wav');
[X, H, numFrames] = extractFeatures(x, Fs);
title ('Merkitse S-kirjaimet hiirella');
isConsonant = zeros(numFrames, 1);
while true
[x1, y1] = ginput(1);
[x2, y2] = ginput(1);
if x1 > x2
xt = x1;
x1 = x2;
x2 = xt;
end
isConsonant(round(x1 * numFrames) : round(x2 * numFrames)) = 1;
response = questdlg('Jatketaanko annotointia?', ...
'Kysymys', ...
'Kyllä', 'Ei', 'Kyllä');
if strcmp(response, 'Ei')
break
end
end
[B, FitInfo] = lassoglm(X, isConsonant, 'binomial', 'CV', 5);
B = B(:,FitInfo.IndexMinDeviance);
B0 = FitInfo.Intercept(FitInfo.IndexMinDeviance);
yHat = sigmoid(X*B + B0);
coefficients = H * B;
figure()
subplot(211)
plot(yHat);
ylabel('S-kirjaimen TN')
subplot(212)
stem(coefficients)
response = questdlg('Valmiina tunnistamaan?', ...
'Tunnistus', ...
'OK', 'OK');
while true
close all
myRecObj = audiorecorder(Fs, 16, 1);
recordblocking(myRecObj, 2);
y = getaudiodata(myRecObj);
X = extractFeatures(y, Fs);
yHat = sigmoid(X*B + B0);
figure()
subplot(211)
plot(yHat);
subplot(212)
[~,f,t,S] = spectrogram(y, 256, 128, 256, Fs, 'yaxis');
surf(t, f, 10*log10(abs(S)), 'EdgeColor', 'none');
axis xy; axis tight; colormap(jet); view(0,90);
response = questdlg('Jatketaanko tunnistusta?', ...
'Kysymys', ...
'Kyllä', 'Ei', 'Kyllä');
if strcmp(response, 'Ei')
break
end
end
end
function [F, H, numFrames] = extractFeatures(x, Fs)
[~,f,t,S] = spectrogram(x, 256, 128, 256, Fs, 'yaxis');
surf(t, f, 10*log10(abs(S)), 'EdgeColor', 'none');
axis xy; axis tight; colormap(jet); view(0,90);
S = log10(S)';
H = [];
n = (1:size(S, 2))';
for k = 0:3
H = [H, n.^k];
end
F = S * H;
numFrames = size(S, 1);
end
function y = sigmoid(x)
y = 1 ./ (1 + exp(-x));
end
Toisella tunnilla johdettiin nopean Fourier-muunnoksen menetelmä (FFT), jonka jälkeen tarkasteltiin Z-muunnosta ja sen tärkeimpiä
ominaisuuksia. Z-muunnoksen avulla voidaan selvittää mm. suotimen
stabiilisuus: suodin on stabiili jos kaikki siirtofunktion navat ovat
yksikköympyrän sisäpuolella.