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.
Ei kommentteja:
Lähetä kommentti