Class: WSK::FFT::FFTComputing

Inherits:
Object
  • Object
show all
Defined in:
lib/WSK/FFT.rb

Instance Method Summary collapse

Constructor Details

#initialize(iUseTrigoCache, iHeader) ⇒ FFTComputing

Constructor The trigo cache is VERY useful when several FFT of the same length are computed.

Parameters
  • iUseTrigoCache (Boolean): Do we use the trigonometric cache ?

  • iHeader (WSK::Model::Header): Header of the data we will perform FFT on.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/WSK/FFT.rb', line 43

def initialize(iUseTrigoCache, iHeader)
  @UseTrigoCache, @Header = iUseTrigoCache, iHeader
  require 'WSK/FFTUtils/FFTUtils'
  @FFTUtils = FFTUtils::FFTUtils.new
  # Initialize FFT utils objects
  @W = @FFTUtils.createWi(FREQINDEX_FIRST, FREQINDEX_LAST, @Header.SampleRate)
  @NbrFreq = FREQINDEX_LAST - FREQINDEX_FIRST + 1
  if (@UseTrigoCache)
    # Initialize the cache of trigonometric values if not done already
    if ((defined?(@@TrigoCacheSampleRate) == nil) or
        (@@TrigoCacheSampleRate != @Header.SampleRate))
      @@TrigoCacheSampleRate = @Header.SampleRate
      @@TrigoCache = @FFTUtils.initTrigoCache(@W, @NbrFreq, @Header.SampleRate/FFTSAMPLE_FREQ)
    end
  end
  # Initialize the cos and sin arrays
  resetData
end

Instance Method Details

#completeFFT(iRawBuffer, iNbrSamples) ⇒ Object

Add FFT coefficients based on a buffer

Parameters
  • iRawBuffer (String): The raw buffer

  • iNbrSamples (Integer): Number of samples to take from this buffer to compute the FFT



74
75
76
77
78
79
80
81
# File 'lib/WSK/FFT.rb', line 74

def completeFFT(iRawBuffer, iNbrSamples)
  if (@UseTrigoCache)
    @FFTUtils.completeSumCosSin(iRawBuffer, @NbrSamples, @Header.NbrBitsPerSample, iNbrSamples, @Header.NbrChannels, @NbrFreq, nil, @@TrigoCache, @SumCos, @SumSin)
  else
    @FFTUtils.completeSumCosSin(iRawBuffer, @NbrSamples, @Header.NbrBitsPerSample, iNbrSamples, @Header.NbrChannels, @NbrFreq, @W, nil, @SumCos, @SumSin)
  end
  @NbrSamples += iNbrSamples
end

#getFFTProfileObject

Get the resulting FFT profile

Return
  • [Integer,Integer,list<list<Integer>>]: Number of bits per sample, number of samples, list of FFT coefficients, per frequency, per channel



87
88
89
# File 'lib/WSK/FFT.rb', line 87

def getFFTProfile
  return [@Header.NbrBitsPerSample, @NbrSamples, @FFTUtils.computeFFT(@Header.NbrChannels, @NbrFreq, @SumCos, @SumSin)]
end

#resetDataObject

Reset the cos and sin arrays



63
64
65
66
67
# File 'lib/WSK/FFT.rb', line 63

def resetData
  @SumCos = @FFTUtils.initSumArray(@NbrFreq, @Header.NbrChannels)
  @SumSin = @FFTUtils.initSumArray(@NbrFreq, @Header.NbrChannels)
  @NbrSamples = 0
end