Class: Mfcc::FilterBanks

Inherits:
Object
  • Object
show all
Defined in:
lib/mfcc/mel.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filters = 20, fft_size = 512, samplerate = 16_000, lowfreq = 0, highfreq = nil) ⇒ FilterBanks

Returns a new instance of FilterBanks.



18
19
20
21
22
23
# File 'lib/mfcc/mel.rb', line 18

def initialize(filters = 20, fft_size = 512, samplerate = 16_000, lowfreq = 0, highfreq = nil)
  @filters = filters
  @fft_size = fft_size
  @samplerate = samplerate
  @range = lowfreq..(highfreq || (samplerate / 2))
end

Instance Attribute Details

#fft_sizeObject (readonly)

Returns the value of attribute fft_size.



17
18
19
# File 'lib/mfcc/mel.rb', line 17

def fft_size
  @fft_size
end

#filtersObject (readonly)

Returns the value of attribute filters.



17
18
19
# File 'lib/mfcc/mel.rb', line 17

def filters
  @filters
end

#rangeObject (readonly)

Returns the value of attribute range.



17
18
19
# File 'lib/mfcc/mel.rb', line 17

def range
  @range
end

#samplerateObject (readonly)

Returns the value of attribute samplerate.



17
18
19
# File 'lib/mfcc/mel.rb', line 17

def samplerate
  @samplerate
end

Instance Method Details

#bank(i) ⇒ Object



29
30
31
32
33
34
# File 'lib/mfcc/mel.rb', line 29

def bank(i)
  lower = fft_frequencies.map { |x| (x - mel_frequencies[i]) / (mel_frequencies[i + 1] - mel_frequencies[i]).to_f }
  upper = fft_frequencies.map { |x| (mel_frequencies[i + 2] - x) / (mel_frequencies[i + 2] - mel_frequencies[i + 1]).to_f }

  (0..(fft_size / 2)).map { |n| [0, [lower[n], upper[n]].min].max }
end

#fft_frequenciesObject



56
57
58
# File 'lib/mfcc/mel.rb', line 56

def fft_frequencies
  @fft_frequencies ||= [0] + (fft_size / 2).times.map { |i| (i + 1) * (samplerate / fft_size.to_f) }
end

#mel_frequenciesObject



48
49
50
# File 'lib/mfcc/mel.rb', line 48

def mel_frequencies
  @mel_frequencies ||= range.step(mel_step).to_a
end

#mel_stepObject



52
53
54
# File 'lib/mfcc/mel.rb', line 52

def mel_step
  ((range.end - range.begin) / filters)
end

#process(fft) ⇒ Object



25
26
27
# File 'lib/mfcc/mel.rb', line 25

def process(fft)
  (0..filters).map { |n| fft.zip(bank[n]).reject { |(_, b)| b.nil? }.inject(0) { |memo, (a, b)| memo + a * b } }
end

#r(i) ⇒ Object



36
37
38
# File 'lib/mfcc/mel.rb', line 36

def r(i)
  mel_frequencies[i]
end

#to_hz(mel) ⇒ Object



40
41
42
# File 'lib/mfcc/mel.rb', line 40

def to_hz(mel)
  700 * (10**(mel / 2595.0) - 1)
end

#to_mel(hz) ⇒ Object



44
45
46
# File 'lib/mfcc/mel.rb', line 44

def to_mel(hz)
  2595 * Math.log10(1 + hz / 700.0)
end