mirror of
https://github.com/lewismoten/data-over-audio.git
synced 2026-04-21 05:36:25 +08:00
increase sample collection
This commit is contained in:
53
index.js
53
index.js
@@ -12,16 +12,17 @@ var receivedGraph;
|
|||||||
var receivedData = [];
|
var receivedData = [];
|
||||||
var MAX_DATA = 300;
|
var MAX_DATA = 300;
|
||||||
var pauseTimeoutId;
|
var pauseTimeoutId;
|
||||||
var sampleIntervalId;
|
var sampleIntervalIds = [];
|
||||||
|
const SAMPLING_INTERVAL_COUNT = 3;
|
||||||
|
|
||||||
var TEXT_TO_SEND = "U";
|
var TEXT_TO_SEND = "U";
|
||||||
var RANDOM_COUNT = 64;
|
var RANDOM_COUNT = 128;
|
||||||
var MAX_BITS_DISPLAYED_ON_GRAPH = 58;
|
var MAX_BITS_DISPLAYED_ON_GRAPH = 78;
|
||||||
var SEGMENT_DURATION = 30;
|
var SEGMENT_DURATION = 30;
|
||||||
var AMPLITUDE_THRESHOLD_PERCENT = .75;
|
var AMPLITUDE_THRESHOLD_PERCENT = .75;
|
||||||
var AMPLITUDE_THRESHOLD = 160;
|
var AMPLITUDE_THRESHOLD = 160;
|
||||||
var MINIMUM_FREQUENCY = 308;
|
var MINIMUM_FREQUENCY = 304;
|
||||||
var MAXIMUM_FREQUENCY = 3400;
|
var MAXIMUM_FREQUENCY = 4800;
|
||||||
var LAST_SEGMENT_PERCENT = 0.6;
|
var LAST_SEGMENT_PERCENT = 0.6;
|
||||||
var FFT_SIZE_POWER = 10;
|
var FFT_SIZE_POWER = 10;
|
||||||
var FREQUENCY_RESOLUTION_MULTIPLIER = 2;
|
var FREQUENCY_RESOLUTION_MULTIPLIER = 2;
|
||||||
@@ -358,6 +359,7 @@ function sendBits(bits) {
|
|||||||
for(let i = 0; i < channelCount; i++) {
|
for(let i = 0; i < channelCount; i++) {
|
||||||
var oscillator = audioContext.createOscillator();
|
var oscillator = audioContext.createOscillator();
|
||||||
oscillator.connect(audioContext.destination);
|
oscillator.connect(audioContext.destination);
|
||||||
|
oscillator.type = 'sawtooth';
|
||||||
oscillators.push(oscillator);
|
oscillators.push(oscillator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,16 +397,23 @@ function sendBits(bits) {
|
|||||||
}
|
}
|
||||||
function stopGraph() {
|
function stopGraph() {
|
||||||
PAUSE = true;
|
PAUSE = true;
|
||||||
if(sampleIntervalId) {
|
stopCollectingSamples();
|
||||||
window.clearInterval(sampleIntervalId);
|
}
|
||||||
sampleIntervalId = undefined;
|
function startCollectingSamples() {
|
||||||
|
for(let i = 0; i < SAMPLING_INTERVAL_COUNT; i++) {
|
||||||
|
if(sampleIntervalIds[i]) continue;
|
||||||
|
sampleIntervalIds[i] = window.setInterval(collectSample, SAMPLE_DELAY_MS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function stopCollectingSamples() {
|
||||||
|
sampleIntervalIds.forEach(window.clearInterval);
|
||||||
|
sampleIntervalIds = sampleIntervalIds.map(() => {});
|
||||||
|
}
|
||||||
function resumeGraph() {
|
function resumeGraph() {
|
||||||
if(isListeningCheckbox.checked) {
|
if(isListeningCheckbox.checked) {
|
||||||
if(PAUSE) {
|
if(PAUSE) {
|
||||||
PAUSE = false;
|
PAUSE = false;
|
||||||
sampleIntervalId = window.setInterval(collectSample, SAMPLE_DELAY_MS);
|
startCollectingSamples();
|
||||||
resetGraphData();
|
resetGraphData();
|
||||||
requestAnimationFrame(drawFrequencyData);
|
requestAnimationFrame(drawFrequencyData);
|
||||||
} else {
|
} else {
|
||||||
@@ -431,6 +440,10 @@ function getInteger(start, end, samples) {
|
|||||||
|
|
||||||
function collectSample() {
|
function collectSample() {
|
||||||
const time = performance.now();
|
const time = performance.now();
|
||||||
|
if(frequencyOverTime.length !== 0) {
|
||||||
|
// we already have this sample
|
||||||
|
if(time === frequencyOverTime[0].time) return;
|
||||||
|
}
|
||||||
const frequencies = new Uint8Array(analyser.frequencyBinCount);
|
const frequencies = new Uint8Array(analyser.frequencyBinCount);
|
||||||
const length = audioContext.sampleRate / analyser.fftSize;
|
const length = audioContext.sampleRate / analyser.fftSize;
|
||||||
let processSegment = false;
|
let processSegment = false;
|
||||||
@@ -517,7 +530,7 @@ function collectSample() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function GET_SEGMENT_BITS(streamStarted, segmentIndex) {
|
function GET_SEGMENT_BITS(streamStarted, segmentIndex) {
|
||||||
const bits = frequencyOverTime.filter(f =>
|
const samples = frequencyOverTime.filter(f =>
|
||||||
f.segmentIndex === segmentIndex &&
|
f.segmentIndex === segmentIndex &&
|
||||||
f.streamStarted === streamStarted
|
f.streamStarted === streamStarted
|
||||||
);
|
);
|
||||||
@@ -527,7 +540,7 @@ function GET_SEGMENT_BITS(streamStarted, segmentIndex) {
|
|||||||
low: 0,
|
low: 0,
|
||||||
heard: 0
|
heard: 0
|
||||||
}));
|
}));
|
||||||
bits.forEach(({pairs}) => {
|
samples.forEach(({pairs}) => {
|
||||||
pairs.forEach(({ highAmp, lowAmp, channel }) => {
|
pairs.forEach(({ highAmp, lowAmp, channel }) => {
|
||||||
sums[channel].high += highAmp;
|
sums[channel].high += highAmp;
|
||||||
sums[channel].low += lowAmp;
|
sums[channel].low += lowAmp;
|
||||||
@@ -563,6 +576,8 @@ function processSegmentReceived(streamStarted, segmentIndex) {
|
|||||||
if((sampleDuration / SEGMENT_DURATION) < LAST_SEGMENT_PERCENT) return;
|
if((sampleDuration / SEGMENT_DURATION) < LAST_SEGMENT_PERCENT) return;
|
||||||
|
|
||||||
const bitValues = GET_SEGMENT_BITS(streamStarted, segmentIndex);
|
const bitValues = GET_SEGMENT_BITS(streamStarted, segmentIndex);
|
||||||
|
// let bitValues2 = GET_SEGMENT_BITS(streamStarted, segmentIndex);
|
||||||
|
// console.log(segmentIndex, bitValues.join('') === bitValues2.join(''), bitValues.join(''), bitValues2.join(''))
|
||||||
packetReceivedBits.push(...bitValues);
|
packetReceivedBits.push(...bitValues);
|
||||||
|
|
||||||
const encodingRatio = HAMMING_ERROR_CORRECTION ? 7/4 : 1;
|
const encodingRatio = HAMMING_ERROR_CORRECTION ? 7/4 : 1;
|
||||||
@@ -814,7 +829,6 @@ function drawSegmentIndexes(ctx) {
|
|||||||
};
|
};
|
||||||
if(streamEnded === -1) streamEnded = newest;
|
if(streamEnded === -1) streamEnded = newest;
|
||||||
let segmentIndex = 0;
|
let segmentIndex = 0;
|
||||||
ctx.fontSize = 24;
|
|
||||||
|
|
||||||
// determine max segments to prevent infinite loop later
|
// determine max segments to prevent infinite loop later
|
||||||
let maxBits = ((1 << PACKET_SIZE_BITS) * 8) + PACKET_SIZE_BITS;
|
let maxBits = ((1 << PACKET_SIZE_BITS) * 8) + PACKET_SIZE_BITS;
|
||||||
@@ -835,15 +849,17 @@ function drawSegmentIndexes(ctx) {
|
|||||||
if(rightX < 0) break; // in the future
|
if(rightX < 0) break; // in the future
|
||||||
|
|
||||||
// Draw segment index
|
// Draw segment index
|
||||||
|
ctx.fontSize = '24px';
|
||||||
let text = segmentIndex.toString();
|
let text = segmentIndex.toString();
|
||||||
let size = ctx.measureText(text);
|
let size = ctx.measureText(text);
|
||||||
let textX = leftX + (segmentWidth / 2) - (size.width / 2);
|
let textX = leftX + (segmentWidth / 2) - (size.width / 2);
|
||||||
ctx.strokeStyle = 'black';
|
ctx.strokeStyle = 'black';
|
||||||
ctx.lineWidth = 2;
|
ctx.lineWidth = 2;
|
||||||
ctx.textBaseline = 'bottom';
|
ctx.textBaseline = 'bottom';
|
||||||
ctx.strokeText(text, textX, height);
|
let textY = segmentIndex % 2 === 0 ? height : height - 12;
|
||||||
|
ctx.strokeText(text, textX, textY);
|
||||||
ctx.fillStyle = segmentStart > streamEnded ? 'grey' : 'white';
|
ctx.fillStyle = segmentStart > streamEnded ? 'grey' : 'white';
|
||||||
ctx.fillText(text, textX, height);
|
ctx.fillText(text, textX, textY);
|
||||||
|
|
||||||
// draw sample count
|
// draw sample count
|
||||||
const sampleCount = frequencyOverTime
|
const sampleCount = frequencyOverTime
|
||||||
@@ -856,12 +872,15 @@ function drawSegmentIndexes(ctx) {
|
|||||||
text = sampleCount.toString();
|
text = sampleCount.toString();
|
||||||
size = ctx.measureText(text);
|
size = ctx.measureText(text);
|
||||||
textX = leftX + (segmentWidth / 2) - (size.width / 2);
|
textX = leftX + (segmentWidth / 2) - (size.width / 2);
|
||||||
|
textY = segmentIndex % 2 === 0 ? 5 : 17;
|
||||||
ctx.strokeStyle = 'black';
|
ctx.strokeStyle = 'black';
|
||||||
ctx.lineWidth = 2;
|
ctx.lineWidth = 2;
|
||||||
ctx.textBaseline = 'top';
|
ctx.textBaseline = 'top';
|
||||||
ctx.strokeText(text, textX, 5);
|
ctx.strokeText(text, textX, textY);
|
||||||
ctx.fillStyle = 'white';
|
if(sampleCount === 0) ctx.fillStyle = 'red';
|
||||||
ctx.fillText(text, textX, 5);
|
else if(sampleCount < 3) ctx.fillStyle = 'yellow';
|
||||||
|
else ctx.fillStyle = 'white';
|
||||||
|
ctx.fillText(text, textX, textY);
|
||||||
|
|
||||||
segmentIndex++;
|
segmentIndex++;
|
||||||
// break out of potential infinite loop
|
// break out of potential infinite loop
|
||||||
|
|||||||
Reference in New Issue
Block a user