| gammatone | R Documentation |
Generate gammatone filter in the time domain (impulse response).
gammatone(f, d, cfreq, n = 4, a = 1, p = 0, output = "matrix")
f |
sampling frequency (in Hz). |
d |
duration (in s). |
cfreq |
center frequency (in Hz). |
n |
filter order (no unit). |
a |
amplitude (linear scale, no unit). |
p |
initial phase (in radians). |
output |
character string, the class of the object to return, either
|
The gammatone function in the time domain (impulse response) is
obtained with:
g(t) = a \times t^{n-1} \times e^{-2\pi \beta t} \times \cos(2 \pi cf t + \phi)
with a the amplitude, t time, n the filter order, cf the center frequency, \phi the initial phase.
The parameter \beta is the equivalent rectangular
bandwidth (ERB) bandwidth which varies according to the center
frequency cf following:
\beta = 24.7 \times (4.37 \times \frac{cf}{1000} + 1)
A wave is returned. The class of the returned object is set with the argument output.
Use the FFT based function, as spec or
meanspec, to get the filter in the frequency domain. See examples.
Jerome Sueur
Holdsworth J, Nimmo-Smith I, Patterson R, Rice P (1988) Implementing a gammatone filter bank. Annex C of the SVOS Final Report: Part A: The Auditory Filterbank, 1, 1-5.
melfilterbank
## gammatone filter in the time domain (impulse response)
f <- 44100
d <- 0.05
res <- gammatone(f=f, d=d, cfreq=440, n=4)
## time display
oscillo(res, f=f)
## frequency display
spec(res, f=f)
## generate and plot a bank of 32 filters from 500 to 10000 Hz
n <- 32
cfreq <- round(seq(500, 10000, length.out=n))
res <- matrix(NA, nrow=f*d/2, ncol=n)
for(i in 1:n){
res[,i] <- spec(gammatone(f=f, d=d, cfreq=cfreq[i]), f=f, dB="max0", plot=FALSE)[,2]
}
x <- seq(0,f/2,length.out=nrow(res))/1000
plot(x=x, y=res[,1],
xlim=c(0,14), ylim=c(-60,0),
type="l", col=2, las=1,
xlab="Frequency (kHz)", ylab="Relative amplitude (dB)")
for(i in 2:n) lines(x, res[,i], col=2)
## use the frequency domain to filter a white noise input
## here around the center frequency 2000 Hz
res <- gammatone(f=f, d=d, cfreq=2000, n=4)
gspec <- spec(res, f=f, plot=FALSE)[,2]
nw <- noisew(f=44100, d=1)
nwfilt <- fir(nw, f=44100, wl=length(gspec)*2, custom=gspec)
spectro(nwfilt, f=f)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.