MelFilterBank_Emu <- function(fs=16000, N = 512, m = 10) { # Jonathan Harrington 21.1.22 # builds a filter-bank of m mel-scaled filters # scaled in amplitude between 0 and 1 # between 0 and fs/2 Hz assuming the FFT was # derived from an N = 512 point window mat = NULL melfreq = seq(0, mel(fs/2), length=m+2) # Hz centre frequencies hzfreq = mel(melfreq, inverse=T) # get spectral components of centre frequencies k = floor((N+1)*hzfreq/fs) + 1 # build the filter bank for(j in 1:(length(k)-2)) { amp = c(seq(0, 1, length=k[j+1]-k[j]+1), seq(1, 0, length=k[j+2]-k[j+1]+1)[-1]) freq = seq(k[j], k[j+2], by = 1) centrefreq = freq[amp==1] fbank = rep(j, k[j+2]-k[j]+1) mat$amp = c(mat$amp, amp) mat$freq = c(mat$freq, freq) mat$centre = c(mat$centre, rep(centrefreq, length(amp))) # convert to Hz mat$fbank = c(mat$fbank, fbank) } # convert spectral component to Hz mat$Hz = fs/N * (mat$freq-1) mat$Hzcen = fs/N * (mat$centre-1) mat$Melcen = mel(mat$Hzcen) # output as data-frame d = data.frame(A = mat$amp, freq = mat$Hz, Hzcen = mat$Hzcen, Melcen = mat$Melcen, k = mat$freq, fbank = mat$fbank) as_tibble(d) }