Class: Mfcc::FilterBanks
- Inherits:
-
Object
- Object
- Mfcc::FilterBanks
- Defined in:
- lib/mfcc/mel.rb
Instance Attribute Summary collapse
-
#fft_size ⇒ Object
readonly
Returns the value of attribute fft_size.
-
#filters ⇒ Object
readonly
Returns the value of attribute filters.
-
#range ⇒ Object
readonly
Returns the value of attribute range.
-
#samplerate ⇒ Object
readonly
Returns the value of attribute samplerate.
Instance Method Summary collapse
- #bank(i) ⇒ Object
- #fft_frequencies ⇒ Object
-
#initialize(filters = 20, fft_size = 512, samplerate = 16_000, lowfreq = 0, highfreq = nil) ⇒ FilterBanks
constructor
A new instance of FilterBanks.
- #mel_frequencies ⇒ Object
- #mel_step ⇒ Object
- #process(fft) ⇒ Object
- #r(i) ⇒ Object
- #to_hz(mel) ⇒ Object
- #to_mel(hz) ⇒ Object
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_size ⇒ Object (readonly)
Returns the value of attribute fft_size.
17 18 19 |
# File 'lib/mfcc/mel.rb', line 17 def fft_size @fft_size end |
#filters ⇒ Object (readonly)
Returns the value of attribute filters.
17 18 19 |
# File 'lib/mfcc/mel.rb', line 17 def filters @filters end |
#range ⇒ Object (readonly)
Returns the value of attribute range.
17 18 19 |
# File 'lib/mfcc/mel.rb', line 17 def range @range end |
#samplerate ⇒ Object (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_frequencies ⇒ Object
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_frequencies ⇒ Object
48 49 50 |
# File 'lib/mfcc/mel.rb', line 48 def mel_frequencies @mel_frequencies ||= range.step(mel_step).to_a end |
#mel_step ⇒ Object
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 |