Spaces:
Running
Running
| import { describe, it, expect } from 'vitest'; | |
| import { dctForward8x8, dctInverse8x8 } from '../core/dct.js'; | |
| describe('DCT', () => { | |
| it('should round-trip an 8x8 block', () => { | |
| const block = new Float64Array(64); | |
| for (let i = 0; i < 64; i++) { | |
| block[i] = Math.random() * 255; | |
| } | |
| const original = new Float64Array(block); | |
| dctForward8x8(block); | |
| dctInverse8x8(block); | |
| for (let i = 0; i < 64; i++) { | |
| expect(block[i]).toBeCloseTo(original[i], 6); | |
| } | |
| }); | |
| it('should produce DC coefficient as mean of block', () => { | |
| const block = new Float64Array(64); | |
| let sum = 0; | |
| for (let i = 0; i < 64; i++) { | |
| block[i] = 100 + Math.random() * 10; | |
| sum += block[i]; | |
| } | |
| const mean = sum / 64; | |
| dctForward8x8(block); | |
| // DC coefficient should be proportional to the mean | |
| // DC = alpha(0) * alpha(0) * sum = (1/8) * sum = mean * 8 * (1/8) = mean * sqrt(64)/... | |
| // Actually: DC = (1/sqrt(8)) * (1/sqrt(8)) * sum(block) = sum/8 | |
| expect(block[0]).toBeCloseTo(sum / 8, 4); | |
| }); | |
| }); | |