Class: IIRFilter

Inherits:
Object
  • Object
show all
Defined in:
lib/Loudness/IIRFilter/IIRFilter.rb

Overview

IIR filter implementation

Direct Known Subclasses

PREFilter, RLBFilter

Instance Method Summary collapse

Constructor Details

#initialize(order) ⇒ IIRFilter

Returns a new instance of IIRFilter.



6
7
8
9
10
11
12
13
14
15
16
# File 'lib/Loudness/IIRFilter/IIRFilter.rb', line 6

def initialize(order)
  @OldSamples = nil
  @ACoefs= nil
  @BCoefs= nil
  @Order = 0

  @Order = order 
  
  @OldSamples = Array.new(@Order) {0.0}
      
end

Instance Method Details

#FilterSample(sampleIn) ⇒ Float

Set IIR filter coeficients

Parameters:

  • bsampleIn (Float)

    enters a new sample to filter

Returns:

  • (Float)

    the output filtered sample



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/Loudness/IIRFilter/IIRFilter.rb', line 37

def FilterSample (sampleIn)
  
  nFilterCoefs = @Order + 1;
  sx = sampleIn;
  spx = 0.0;   
  ox = 0.0;   
  
  #A coefs
  nA = 0; 
  while nA < nFilterCoefs do
    if (nA == 0)
      spx = sx.to_f;
    else
      spx = spx.to_f -  @ACoefs[nA].to_f * @OldSamples[nA - 1].to_f  #Spx - m_pACoefs[nA]*m_pOldSamples[nA-1];
    end
  
    nA = nA + 1  
  end       
  
  #B coefs
  nB = 0;  
  while nB < nFilterCoefs do
    if (nB == 0)
      ox = ox.to_f + @BCoefs[nB].to_f * spx.to_f   #Ox = Ox + m_pBCoefs[nB]*Spx;
    else
      ox = ox.to_f + @BCoefs[nB].to_f * @OldSamples[nB - 1].to_f   #Ox = Ox + m_pBCoefs[nB]*m_pOldSamples[nB-1];
    end
  
    nB = nB + 1  
  end       
  
  #Set Old samples
  nS = @Order     
  while nS > 0 do
    if ((nS - 2) < 0)
      @OldSamples[nS - 1] = spx.to_f
    else
      @OldSamples[nS - 1] = @OldSamples[nS - 2].to_f    
    end       
    
    nS = nS - 1
  end

  return ox
end

#InfoString

Gets filter information

Returns:

  • (String)

    filter information



85
86
87
# File 'lib/Loudness/IIRFilter/IIRFilter.rb', line 85

def Info
  return "IIR Filter Order #{@Order}\nACoefs #{@ACoefs}\nBCoefs #{@BCoefs}\n"
end

#SetCoefs(b, a) ⇒ Object

Set IIR filter coeficients

Parameters:

  • b (Array)

    sets the B coeficients of IIR filter example: [1.02, 0.99]

  • a (Array)

    sets the A coeficients of IIR filter example: [1.02, 0.99]



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/Loudness/IIRFilter/IIRFilter.rb', line 21

def SetCoefs (b, a)
  if ((a.kind_of?(Array) == false) or (b.kind_of?(Array) == false))
    raise 'Filter coeficinets must be an array'
  end
  if ((a.length != @Order + 1) or (b.length != @Order + 1))
    raise "Incorrect number of coeficients. A filter of order #{@Order} must have #{@Order+1} coeficients"
  end
  
  @ACoefs = a
  @BCoefs = b
   
end