frequencyjs
Version:
Analyse signals with fourier / wavelets
72 lines (66 loc) • 2.1 kB
JavaScript
var _ = require("lodash");
var spectrumCreate = function(spectrumArray, sampling, signalLength){
var spectrum = _.map(_.range(spectrumArray.length), function(idx){
// frequency in hertz
var freq = idx/signalLength * sampling;
var freqFac = (idx == 0) ? 0.5 : 1;
return { frequency: freq, amplitude: spectrumArray[idx]*freqFac };
});
spectrum.dominantFrequency = function() {
return _.max(spectrum, function (s) {
return s.amplitude;
});
};
spectrum.amplitudes = function(){
return _.map(spectrum, function(v){
return v.amplitude;
});
}
spectrum.sampling = sampling;
return spectrum;
};
var timeDependentSpectrumCreate = function(spectrumArray, sampling){
var levels = Math.floor(Math.log(spectrumArray.length)/Math.log(2));
var curLevel = levels-1;
var idx = Math.pow(2,curLevel);
var spectrum = [];
var cnt = 0;
while(curLevel>=0){
var freq = sampling * idx /* = 2^curLevel */ / spectrumArray.length;
for(var i=idx; i<idx*2; i++){
var diffIdx = i - idx;
var stepSize = spectrumArray.length/(idx * sampling);
spectrum[i] = {
frequency: freq,
amplitude: spectrumArray[i],
timeStart: diffIdx * stepSize,
timeEnd:(diffIdx+1)*stepSize,
time: (diffIdx + 0.5)*stepSize
};
}
curLevel = curLevel - 1;
idx = idx / 2;
cnt++;
}
spectrum[0] = { frequency: 0, amplitude: spectrumArray[0] };
spectrum.dominantFrequency = function() {
return _.max(spectrum, function (s) {
return s.amplitude;
});
};
spectrum.amplitudes = function(){
return _.map(spectrum, function(v){
return v.amplitude;
});
}
spectrum.sampling = sampling;
return spectrum;
};
var Spectrum = function(spectrumArray, options){
if("amplitudes" in spectrumArray)
return spectrumArray;
if("timeDependent" in spectrumArray && spectrumArray.timeDependent)
return timeDependentSpectrumCreate(spectrumArray, options.sampling);
return spectrumCreate(spectrumArray, options.sampling, options.signalLength);
}
module.exports = Spectrum;