class SPCore::SincFilter

Base windowed sinc filter. Implements lowpass and highpass. A bandpass and bandstop filter would be implemented using two of these.

Theoretical source: www.labbookpages.co.uk/audio/firWindowing.html

@author James Tunnell

Constants

ARG_SPECS

Use to process hashed args in initialize.

Attributes

highpass_fir[R]
lowpass_fir[R]

Public Class Methods

new(args) click to toggle source

Given a filter order, cutoff frequency, sample rate, and window class, develop a FIR filter kernel that can be used for lowpass filtering.

# File lib/spcore/filters/fir/sinc_filter.rb, line 26
def initialize args
  hash_make args, SincFilter::ARG_SPECS
  
  raise ArgumentError, "cutoff_freq is greater than 0.5 * sample_rate" if @cutoff_freq > (@sample_rate / 2.0)
  
  size = @order + 1
  transition_freq = @cutoff_freq.to_f / @sample_rate
  b = TWO_PI * transition_freq
  
  # make FIR filter kernels for lowpass and highpass
  
  lowpass_kernel = Array.new(size)
  highpass_kernel = Array.new(size)
  window = @window_class.new(size)
  
  for n in 0...(@order / 2)
    c = n - (@order / 2)
    y = Math::sin(b * c) / (Math::PI * (c))
    lowpass_kernel[size - 1 - n] = lowpass_kernel[n] = y * window.data[n]
    highpass_kernel[size - 1 - n] = highpass_kernel[n] = -lowpass_kernel[n]
  end
  lowpass_kernel[@order / 2] = 2 * transition_freq * window.data[@order / 2]
  highpass_kernel[@order / 2] = (1 - 2 * transition_freq) * window.data[@order / 2]
  
  @lowpass_fir = FIR.new lowpass_kernel, @sample_rate
  @highpass_fir = FIR.new highpass_kernel, @sample_rate
end

Public Instance Methods

highpass(input) click to toggle source

Process the input with the highpass FIR. @return [Array] containing the filtered input.

# File lib/spcore/filters/fir/sinc_filter.rb, line 62
def highpass input
  return @highpass_fir.convolve input
end
lowpass(input) click to toggle source

Process the input with the lowpass FIR. @return [Array] containing the filtered input.

# File lib/spcore/filters/fir/sinc_filter.rb, line 56
def lowpass input
  return @lowpass_fir.convolve input
end