dist-javascript-algorithms-and-data-structures
Version:
Algorithms and data-structures implemented on JavaScript
164 lines (156 loc) • 5.18 kB
JavaScript
"use strict";
var _fastFourierTransform = _interopRequireDefault(require("../fastFourierTransform"));
var _ComplexNumber = _interopRequireDefault(require("../../complex-number/ComplexNumber"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @param {ComplexNumber[]} sequence1
* @param {ComplexNumber[]} sequence2
* @param {Number} delta
* @return {boolean}
*/
function sequencesApproximatelyEqual(sequence1, sequence2, delta) {
if (sequence1.length !== sequence2.length) {
return false;
}
for (let numberIndex = 0; numberIndex < sequence1.length; numberIndex += 1) {
if (Math.abs(sequence1[numberIndex].re - sequence2[numberIndex].re) > delta) {
return false;
}
if (Math.abs(sequence1[numberIndex].im - sequence2[numberIndex].im) > delta) {
return false;
}
}
return true;
}
const delta = 1e-6;
describe('fastFourierTransform', () => {
it('should calculate the radix-2 discrete fourier transform #1', () => {
const input = [new _ComplexNumber.default({
re: 0,
im: 0
})];
const expectedOutput = [new _ComplexNumber.default({
re: 0,
im: 0
})];
const output = (0, _fastFourierTransform.default)(input);
const invertedOutput = (0, _fastFourierTransform.default)(output, true);
expect(sequencesApproximatelyEqual(expectedOutput, output, delta)).toBe(true);
expect(sequencesApproximatelyEqual(input, invertedOutput, delta)).toBe(true);
});
it('should calculate the radix-2 discrete fourier transform #2', () => {
const input = [new _ComplexNumber.default({
re: 1,
im: 2
}), new _ComplexNumber.default({
re: 2,
im: 3
}), new _ComplexNumber.default({
re: 8,
im: 4
})];
const expectedOutput = [new _ComplexNumber.default({
re: 11,
im: 9
}), new _ComplexNumber.default({
re: -10,
im: 0
}), new _ComplexNumber.default({
re: 7,
im: 3
}), new _ComplexNumber.default({
re: -4,
im: -4
})];
const output = (0, _fastFourierTransform.default)(input);
const invertedOutput = (0, _fastFourierTransform.default)(output, true);
expect(sequencesApproximatelyEqual(expectedOutput, output, delta)).toBe(true);
expect(sequencesApproximatelyEqual(input, invertedOutput, delta)).toBe(true);
});
it('should calculate the radix-2 discrete fourier transform #3', () => {
const input = [new _ComplexNumber.default({
re: -83656.9359385182,
im: 98724.08038374918
}), new _ComplexNumber.default({
re: -47537.415125808424,
im: 88441.58381765135
}), new _ComplexNumber.default({
re: -24849.657029355192,
im: -72621.79007878687
}), new _ComplexNumber.default({
re: 31451.27290052717,
im: -21113.301128347346
}), new _ComplexNumber.default({
re: 13973.90836288876,
im: -73378.36721594246
}), new _ComplexNumber.default({
re: 14981.520420492234,
im: 63279.524958963884
}), new _ComplexNumber.default({
re: -9892.575367044381,
im: -81748.44671677813
}), new _ComplexNumber.default({
re: -35933.00356823792,
im: -46153.47157161784
}), new _ComplexNumber.default({
re: -22425.008561855735,
im: -86284.24507370662
}), new _ComplexNumber.default({
re: -39327.43830818355,
im: 30611.949874562706
})];
const expectedOutput = [new _ComplexNumber.default({
re: -203215.3322151,
im: -100242.4827503
}), new _ComplexNumber.default({
re: 99217.0805705,
im: 270646.9331932
}), new _ComplexNumber.default({
re: -305990.9040412,
im: 68224.8435751
}), new _ComplexNumber.default({
re: -14135.7758282,
im: 199223.9878095
}), new _ComplexNumber.default({
re: -306965.6350922,
im: 26030.1025439
}), new _ComplexNumber.default({
re: -76477.6755206,
im: 40781.9078990
}), new _ComplexNumber.default({
re: -48409.3099088,
im: 54674.7959662
}), new _ComplexNumber.default({
re: -329683.0131713,
im: 164287.7995937
}), new _ComplexNumber.default({
re: -50485.2048527,
im: -330375.0546527
}), new _ComplexNumber.default({
re: 122235.7738708,
im: 91091.6398019
}), new _ComplexNumber.default({
re: 47625.8850387,
im: 73497.3981523
}), new _ComplexNumber.default({
re: -15619.8231136,
im: 80804.8685410
}), new _ComplexNumber.default({
re: 192234.0276101,
im: 160833.3072355
}), new _ComplexNumber.default({
re: -96389.4195635,
im: 393408.4543872
}), new _ComplexNumber.default({
re: -173449.0825417,
im: 146875.7724104
}), new _ComplexNumber.default({
re: -179002.5662573,
im: 239821.0124341
})];
const output = (0, _fastFourierTransform.default)(input);
const invertedOutput = (0, _fastFourierTransform.default)(output, true);
expect(sequencesApproximatelyEqual(expectedOutput, output, delta)).toBe(true);
expect(sequencesApproximatelyEqual(input, invertedOutput, delta)).toBe(true);
});
});