R-ohjelman sound-kirjaston pikaohjeet

Sound-kirjaston asentaminen

==========================
  * Windows R: Install package(s)...
  * Mac OS X R: Package Management... ->
     * CRAN Mirror: Norway

library(sound)

Ulkoisen äänisoittimen asetukset:

Linux, OS X, sox asennettuna, esim:
    setWavPlayer("/opt/local/bin/play");

OS X, ilman soxia:
    setWavPlayer("open -a 'quicktime player' ");  
# (avaa QT-soittimen ja antaa varoituksen tyhjästä äänipuskurista)

Windows: (löytää oletuksena soittimen)



Perusteet


Äänen lataaminen R-ohjelmaan
==========================
    loadSample("aani1.wav") -> s;


Pro Tools -äänen esikäsittely
==========================
Huom! loadSample ei (vielä) osaa lukea Pro Toolsin luomia wav -tiedostoja.
* Tapa 1: Lataa ja tallenna tiedosto toisessa editorissa (esim Praat?)
* Tapa 2: Tee wav-wav-muunnos angarakissa soxilla esim näin "sox sample1.wav Rsample1.wav")


Näytteistystaajuus, kanavat
==========================
rate(s) -> sr;
channels(s) -> sch;


Ääni lukuvektorina:
==========================
sound(s)[1,] -> w;


Äänen muokkaus, esim. ikkunointi puolella siniaallolla:
==========================
sound(s)[1,] <- w * sin( seq(0,3.14,length=(length(w))))


Äänen soittaminen:
==========================
play(s)



"Reseptejä" 4. istunnolta

 

# Äänen ikkunointi
#---------------

sampleLength(s) <- floor(1.0*rate(s))  # leikataan 1s mittainen sample
w <- as.Sample(sin(seq(0,3.14,l=sampleLength(s))),44100,16) # tehdään sini-näyteikkuna (1s)
ws <- s * w; # ikkunoidaan ääni s ääneksi ws


# Äänen luominen R-funktiolla
#---------------

wf <- seq(1,0,l=44100)*sin(seq(0,440*6.28,l=44100))
s <- as.Sample(wf,44100,16) # 44100 Hz, 16-bit


# Äänten yhdistäminen
# ---------------

f0 <- Sine(90,1)*.3
f1 <- Sine(800,1)*.2
f2 <- Sine(1300,1)*.3
f3 <- Sine(2100,1)*.1
ns <- Noise(1)*.4
s <- f0+f1+f2+f3+ns

# Muokatun (vahvistetun) äänen signaalitason normalisointi (leikkautumisen välttämiseksi)

play(normalize(s*w*3))


# Hz-mel-muunnokset
# ---------------
mel2Hz<-function(m)700*(exp(m/1127.01048)-1)
Hz2mel<-function(f)(1127.01048*log(1+f/700))


# Spektri FFT:n avulla
# (ääni ladattuna "s"-oliossa)

abs(fft(sound(s)[1,])) -> sp_a
fstep <- rate(s) / sampleLength(s)
plotlen <- floor(length(sp_a)/2)
fr = seq(0,fstep*(plotlen-1),length=plotlen)
plot(fr,sp_a[1:plotlen])

# Mel-spektri
# ---------------

mels <-Hz2mel(fr)
plot(mels, sp_a[1:plotlen])


# Kepstri
# --------

cepstr = abs(fft(log(sp_a)))
plot(cepstr[1:(length(cepstr)/200)],type='l')

# Konvoluutio, esim. FIR-suotimesta:
# ----------
#  "valkoista" kohinaa 3.0s ja 100 Hz kaistanpäästö-FIR-suodin

s <- Noise(3) 
c <- as.Sample(sin(seq(0,6.28*10,l=441))*seq(1,0,l=441),44100,16) 

cs <- as.Sample( convolve(sound(s)[1,], sound(c)[1,], type="filter") , 44100,16)
play(normalize(cs))



# Autokorrelaatio
# -------------------


# autokorrelaatioarvo siirrokselle h:

# Tässä oletetaan, että löydettävä impulssi mahtuu 800 näytettä leveään ikkunaan (F > 55 Hz)
# Matalemmille taajuuksille ( esim F0=40 Hz) "hmax" voi olla esim 1600 näytettä, jne.
#
# a = näyte, jonka alusta autokorrelaatio mitataan

# autokorrelaatio yhdelle siirrokselle h:

wautocor<-function(a,h)(cor(a[1:800],a[(1:800)+h]))


# autokorrelaatioarvot kaikille siirroksille 0...hmax:

wautocors<-function(a,hmax=800){v<-c();for(i in 1:hmax) v[i]<-cor(a[1:hmax],a[(1:hmax)+i]); v}


pickF0<-function(a,minf=70,maxf=250){
mind<-floor(44100/maxf);
maxd<-floor(44100/minf);
f0<-44100/(order(wautocors(a,maxd)[mind:maxd],decreasing=T)[1]+mind-1);
f0}


# F0-käyrän poimiminen näyteäänioliosta "a":
# nf = näytteistysikkunoiden lkm, oletus 20


pickF0cont<-function(a,nf=20,minf=70,maxf=250){
   wl<<-floor(44100/minf)*2+2; 
   soff<<-floor(seq(1,length(sound(a))-wl,length=nf));
   f0c<<-c();
   for (i in soff) {
      f0c <<- c(f0c,pickF0(sound(a)[i:(i+wl)],minf,maxf))};
   f0c}

# ajoesimerkki oma-äänioliolla (ikkunointi ja autokorrelointi voi kestää hetken):

> pickF0cont(oma,200)->omac

# plotataan...
> plot(omac,t='l')

# ... tai jopa näin:
> plot(seq(1,200,l=sampleLength(oma)),sound(oma)[1,],t='l')
> lines(omac/1000,t='l',col='red')

  • esimerkki F0-käyrän laskemisesta:
    oma-f0cont.png

  • IDEA! Jännittävä lisätehtävä: Voit tuottaa synteettistä "robottiääntä" käyttämällä Sine- ja appendSample-funktiota silmukassa f0-mittausten yli
Topic attachments
I Attachment Action Size Date Who Comment
PNGpng oma-f0cont.png manage 65.6 K 2009-01-02 - 13:38 UnknownUser esimerkki F0-käyrän laskemisesta
Topic revision: r6 - 2009-01-02 - SeppoNyrkko
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2018 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback