speaker-calibration 2.2.198 → 2.2.200
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +71 -71
- package/.eslintrc.json +40 -40
- package/.github/workflows/update-phrases.yml +37 -0
- package/.prettierignore +69 -69
- package/.prettierrc +14 -14
- package/LICENSE +20 -20
- package/README.md +133 -133
- package/__mocks__/fileMock.js +1 -1
- package/__mocks__/styleMock.js +1 -1
- package/babel.config.js +3 -3
- package/coverage/clover.xml +71 -71
- package/coverage/coverage-final.json +224 -224
- package/coverage/lcov-report/PythonServerInterface.js.html +265 -265
- package/coverage/lcov-report/base.css +354 -354
- package/coverage/lcov-report/block-navigation.js +82 -82
- package/coverage/lcov-report/index.html +123 -123
- package/coverage/lcov-report/prettify.css +101 -101
- package/coverage/lcov-report/prettify.js +937 -937
- package/coverage/lcov-report/sorter.js +189 -189
- package/coverage/lcov-report/src/index.html +121 -121
- package/coverage/lcov-report/src/server/PythonServerInterface.js.html +268 -268
- package/coverage/lcov-report/src/server/index.html +123 -123
- package/coverage/lcov-report/src/tasks/audioCalibrator.js.html +499 -499
- package/coverage/lcov-report/src/tasks/audioRecorder.js.html +412 -412
- package/coverage/lcov-report/src/tasks/index.html +143 -143
- package/coverage/lcov-report/src/tasks/volume/index.html +123 -123
- package/coverage/lcov-report/src/tasks/volume/volume.js.html +409 -409
- package/coverage/lcov-report/src/utils.js.html +172 -172
- package/coverage/lcov.info +91 -91
- package/dist/example/NoSleep.min.js +1 -1
- package/dist/example/fetch-languages-sheets.js +77 -77
- package/dist/example/i18n.js +27366 -27366
- package/dist/example/index.html +47 -47
- package/dist/example/listener.html +79 -79
- package/dist/example/listener.js +149 -149
- package/dist/example/server.js +51 -51
- package/dist/example/speaker.html +145 -145
- package/dist/example/speakerUI.js +273 -273
- package/dist/example/styles.css +99 -99
- package/dist/main.js +1234 -1234
- package/dist/mlsGen.js +6814 -6814
- package/dist/mlsGen.wasm +0 -0
- package/dist/package-lock.json +1018 -1018
- package/dist/package.json +18 -18
- package/doc/AudioCalibrator.html +417 -417
- package/doc/AudioPeer.html +251 -251
- package/doc/AudioRecorder.html +195 -195
- package/doc/ImpulseResponse.html +215 -215
- package/doc/Listener.html +308 -308
- package/doc/MlsGenInterface.html +226 -226
- package/doc/MyEventEmitter.html +274 -274
- package/doc/PythonServerAPI.html +109 -109
- package/doc/Speaker.html +276 -276
- package/doc/Takes%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +128 -128
- package/doc/Takes%20the%20url%20of%20the%20current%20site%0Aand%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +138 -138
- package/doc/Takes%20the%20url%20of%20the%20current%20site%20and%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +137 -137
- package/doc/Volume.html +88 -88
- package/doc/audioCalibrator.js.html +179 -179
- package/doc/audioPeer.js.html +175 -175
- package/doc/audioRecorder.js.html +163 -163
- package/doc/creates%20a%20new%20AudioRecorder%20instance.%20%0ASets%20up%20the%20audio%20context%20and%20file%20reader..html +114 -114
- package/doc/fonts/OpenSans-Bold-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-BoldItalic-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-Italic-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-Light-webfont.svg +1830 -1830
- package/doc/fonts/OpenSans-LightItalic-webfont.svg +1834 -1834
- package/doc/fonts/OpenSans-Regular-webfont.svg +1830 -1830
- package/doc/global.html +308 -308
- package/doc/index.html +58 -58
- package/doc/listener.js.html +170 -170
- package/doc/mlsGen_mlsGenInterface.js.html +117 -117
- package/doc/myEventEmitter.js.html +124 -124
- package/doc/peer-connection_audioPeer.js.html +188 -188
- package/doc/peer-connection_listener.js.html +311 -311
- package/doc/peer-connection_speaker.js.html +381 -381
- package/doc/scripts/linenumber.js +25 -25
- package/doc/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/doc/scripts/prettify/lang-css.js +24 -24
- package/doc/scripts/prettify/prettify.js +640 -640
- package/doc/server_PythonServerAPI.js.html +160 -160
- package/doc/speaker.js.html +248 -248
- package/doc/styles/jsdoc-default.css +371 -371
- package/doc/styles/prettify-jsdoc.css +111 -111
- package/doc/styles/prettify-tomorrow.css +163 -163
- package/doc/tasks_audioCalibrator.js.html +207 -207
- package/doc/tasks_audioRecorder.js.html +190 -190
- package/doc/tasks_impulse-response_impulseResponse.js.html +442 -442
- package/doc/tasks_impulse-response_mlsGen_mlsGenInterface.js.html +175 -175
- package/doc/tasks_volume_volume.js.html +185 -185
- package/doc/utils.js.html +105 -105
- package/jest.config.js +173 -173
- package/makefile +74 -0
- package/netlify.toml +26 -26
- package/package.json +73 -72
- package/src/config/firebase.js +26 -26
- package/src/index.html +21 -21
- package/src/main.js +23 -23
- package/src/myEventEmitter.js +83 -83
- package/src/peer-connection/audioPeer.js +178 -178
- package/src/peer-connection/listener.js +340 -340
- package/src/peer-connection/peerErrors.js +25 -25
- package/src/peer-connection/speaker.js +731 -724
- package/src/powerCheck.js +98 -98
- package/src/server/PythonServerAPI.js +869 -869
- package/src/tasks/audioCalibrator.js +335 -335
- package/src/tasks/audioRecorder.js +315 -315
- package/src/tasks/combination/combination.js +2969 -3033
- package/src/tasks/combination/mlsGen/mlsGen.cpp +98 -98
- package/src/tasks/combination/mlsGen/mlsGen.hpp +303 -303
- package/src/tasks/combination/mlsGen/mlsGenInterface.js +131 -131
- package/src/tasks/combination/mlsGen/mlsGenTest.cpp +180 -180
- package/src/tasks/impulse-response/impulseResponse.js +610 -610
- package/src/tasks/impulse-response/mlsGen/mlsGen.cpp +98 -98
- package/src/tasks/impulse-response/mlsGen/mlsGen.hpp +303 -303
- package/src/tasks/impulse-response/mlsGen/mlsGenInterface.js +131 -131
- package/src/tasks/impulse-response/mlsGen/mlsGenTest.cpp +180 -180
- package/src/tasks/volume/volume.cpp +2 -2
- package/src/tasks/volume/volume.hpp +22 -22
- package/src/tasks/volume/volume.js +279 -279
- package/src/utils.js +205 -205
- package/webpack.config.js +37 -37
- package/.gitignore +0 -81
package/src/powerCheck.js
CHANGED
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
export const volumePowerCheck = (rec, fs, preSec, Sec, _calibrateSoundPowerBinDesiredSec) => {
|
|
2
|
-
const coarseHz = 1 / _calibrateSoundPowerBinDesiredSec;
|
|
3
|
-
const power = rec.map(x => Math.pow(x, 2)); // Squared values of the signal
|
|
4
|
-
|
|
5
|
-
// Adjust coarseHz so that fs is an integer multiple of coarseHz.
|
|
6
|
-
let n = Math.round(fs / coarseHz);
|
|
7
|
-
|
|
8
|
-
// Sampling times for plotting
|
|
9
|
-
const t = Array.from({ length: power.length }, (_, i) => i / fs);
|
|
10
|
-
|
|
11
|
-
const coarseSamples = Math.ceil(power.length / n);
|
|
12
|
-
const coarsePowerDb = new Array(coarseSamples).fill(0);
|
|
13
|
-
const coarseT = new Array(coarseSamples).fill(0);
|
|
14
|
-
|
|
15
|
-
for (let i = 0; i < coarseSamples; i++) {
|
|
16
|
-
const indices = Array.from({ length: Math.min(n, power.length - i * n) }, (_, idx) => i * n + idx);
|
|
17
|
-
const extremeIndices = [indices[0], indices[indices.length - 1]];
|
|
18
|
-
|
|
19
|
-
const avgPower = indices.reduce((sum, idx) => sum + power[idx], 0) / indices.length;
|
|
20
|
-
coarsePowerDb[i] = 10 * Math.log10(avgPower);
|
|
21
|
-
|
|
22
|
-
const avgTime = (t[extremeIndices[0]] + t[extremeIndices[1]]) / 2;
|
|
23
|
-
coarseT[i] = avgTime;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const prepSamples = Math.round(coarseHz * preSec);
|
|
27
|
-
const postSamples = Math.round(coarseHz * (preSec + Sec));
|
|
28
|
-
const sd = Math.round(standardDeviation(coarsePowerDb.slice(prepSamples)) * 10) / 10;
|
|
29
|
-
|
|
30
|
-
const coarseTRounded = coarseT.map(t => Math.round(t * 1000) / 1000); // Round to 3 decimal places
|
|
31
|
-
const coarsePowerDbRounded = coarsePowerDb.map(db => Math.round(db * 1000) / 1000); // Round to 3 decimal places
|
|
32
|
-
|
|
33
|
-
const start = interpolate(coarseT, coarsePowerDb, preSec);
|
|
34
|
-
const end = interpolate(coarseT, coarsePowerDb, preSec + Sec);
|
|
35
|
-
|
|
36
|
-
let preT = coarseTRounded.slice(0, prepSamples);
|
|
37
|
-
let preDb = coarsePowerDbRounded.slice(0, prepSamples);
|
|
38
|
-
|
|
39
|
-
// Adjust starting point of preT and preDb
|
|
40
|
-
if (preT[preT.length - 1] < preSec) {
|
|
41
|
-
preT.push(preSec);
|
|
42
|
-
preDb.push(start);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
let recT = coarseTRounded.slice(prepSamples, postSamples);
|
|
46
|
-
let recDb = coarsePowerDbRounded.slice(prepSamples, postSamples);
|
|
47
|
-
|
|
48
|
-
if (recT[0] > preSec) {
|
|
49
|
-
recT.unshift(preSec);
|
|
50
|
-
recDb.unshift(start);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (recT[recT.length - 1] < preSec + Sec) {
|
|
54
|
-
recT.push(preSec + Sec);
|
|
55
|
-
recDb.push(end);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
let postT = coarseTRounded.slice(postSamples);
|
|
59
|
-
let postDb = coarsePowerDbRounded.slice(postSamples);
|
|
60
|
-
|
|
61
|
-
if (postT[0] > preSec + Sec) {
|
|
62
|
-
postT.unshift(preSec + Sec);
|
|
63
|
-
postDb.unshift(end);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return { preT, preDb, recT, recDb, postT, postDb, sd };
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Helper function for interpolation
|
|
70
|
-
export const interpolate = (x, y, target) => {
|
|
71
|
-
let lowIdx = 0;
|
|
72
|
-
while (lowIdx < x.length - 1 && x[lowIdx] < target) {
|
|
73
|
-
lowIdx++;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const x0 = x[lowIdx - 1];
|
|
77
|
-
const y0 = y[lowIdx - 1];
|
|
78
|
-
const x1 = x[lowIdx];
|
|
79
|
-
const y1 = y[lowIdx];
|
|
80
|
-
|
|
81
|
-
// Linear interpolation
|
|
82
|
-
return y0 + ((target - x0) * (y1 - y0)) / (x1 - x0);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Helper function to calculate standard deviation
|
|
86
|
-
export const standardDeviation = (arr) => {
|
|
87
|
-
const mean = arr.reduce((sum, val) => sum + val, 0) / arr.length;
|
|
88
|
-
const variance = arr.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / arr.length;
|
|
89
|
-
return Math.sqrt(variance);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export const getPower = (dataArray) => {
|
|
93
|
-
const squaredValues = dataArray.map(value => value * value);
|
|
94
|
-
const sum_of_squares = squaredValues.reduce((total, value) => total + value, 0);
|
|
95
|
-
const squared_mean = sum_of_squares / dataArray.length;
|
|
96
|
-
const dbLevel = 20 * Math.log10(Math.sqrt(squared_mean));
|
|
97
|
-
const roundedDbLevel = Math.round(dbLevel * 10) / 10;
|
|
98
|
-
return roundedDbLevel;
|
|
1
|
+
export const volumePowerCheck = (rec, fs, preSec, Sec, _calibrateSoundPowerBinDesiredSec) => {
|
|
2
|
+
const coarseHz = 1 / _calibrateSoundPowerBinDesiredSec;
|
|
3
|
+
const power = rec.map(x => Math.pow(x, 2)); // Squared values of the signal
|
|
4
|
+
|
|
5
|
+
// Adjust coarseHz so that fs is an integer multiple of coarseHz.
|
|
6
|
+
let n = Math.round(fs / coarseHz);
|
|
7
|
+
|
|
8
|
+
// Sampling times for plotting
|
|
9
|
+
const t = Array.from({ length: power.length }, (_, i) => i / fs);
|
|
10
|
+
|
|
11
|
+
const coarseSamples = Math.ceil(power.length / n);
|
|
12
|
+
const coarsePowerDb = new Array(coarseSamples).fill(0);
|
|
13
|
+
const coarseT = new Array(coarseSamples).fill(0);
|
|
14
|
+
|
|
15
|
+
for (let i = 0; i < coarseSamples; i++) {
|
|
16
|
+
const indices = Array.from({ length: Math.min(n, power.length - i * n) }, (_, idx) => i * n + idx);
|
|
17
|
+
const extremeIndices = [indices[0], indices[indices.length - 1]];
|
|
18
|
+
|
|
19
|
+
const avgPower = indices.reduce((sum, idx) => sum + power[idx], 0) / indices.length;
|
|
20
|
+
coarsePowerDb[i] = 10 * Math.log10(avgPower);
|
|
21
|
+
|
|
22
|
+
const avgTime = (t[extremeIndices[0]] + t[extremeIndices[1]]) / 2;
|
|
23
|
+
coarseT[i] = avgTime;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const prepSamples = Math.round(coarseHz * preSec);
|
|
27
|
+
const postSamples = Math.round(coarseHz * (preSec + Sec));
|
|
28
|
+
const sd = Math.round(standardDeviation(coarsePowerDb.slice(prepSamples)) * 10) / 10;
|
|
29
|
+
|
|
30
|
+
const coarseTRounded = coarseT.map(t => Math.round(t * 1000) / 1000); // Round to 3 decimal places
|
|
31
|
+
const coarsePowerDbRounded = coarsePowerDb.map(db => Math.round(db * 1000) / 1000); // Round to 3 decimal places
|
|
32
|
+
|
|
33
|
+
const start = interpolate(coarseT, coarsePowerDb, preSec);
|
|
34
|
+
const end = interpolate(coarseT, coarsePowerDb, preSec + Sec);
|
|
35
|
+
|
|
36
|
+
let preT = coarseTRounded.slice(0, prepSamples);
|
|
37
|
+
let preDb = coarsePowerDbRounded.slice(0, prepSamples);
|
|
38
|
+
|
|
39
|
+
// Adjust starting point of preT and preDb
|
|
40
|
+
if (preT[preT.length - 1] < preSec) {
|
|
41
|
+
preT.push(preSec);
|
|
42
|
+
preDb.push(start);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let recT = coarseTRounded.slice(prepSamples, postSamples);
|
|
46
|
+
let recDb = coarsePowerDbRounded.slice(prepSamples, postSamples);
|
|
47
|
+
|
|
48
|
+
if (recT[0] > preSec) {
|
|
49
|
+
recT.unshift(preSec);
|
|
50
|
+
recDb.unshift(start);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (recT[recT.length - 1] < preSec + Sec) {
|
|
54
|
+
recT.push(preSec + Sec);
|
|
55
|
+
recDb.push(end);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let postT = coarseTRounded.slice(postSamples);
|
|
59
|
+
let postDb = coarsePowerDbRounded.slice(postSamples);
|
|
60
|
+
|
|
61
|
+
if (postT[0] > preSec + Sec) {
|
|
62
|
+
postT.unshift(preSec + Sec);
|
|
63
|
+
postDb.unshift(end);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return { preT, preDb, recT, recDb, postT, postDb, sd };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Helper function for interpolation
|
|
70
|
+
export const interpolate = (x, y, target) => {
|
|
71
|
+
let lowIdx = 0;
|
|
72
|
+
while (lowIdx < x.length - 1 && x[lowIdx] < target) {
|
|
73
|
+
lowIdx++;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const x0 = x[lowIdx - 1];
|
|
77
|
+
const y0 = y[lowIdx - 1];
|
|
78
|
+
const x1 = x[lowIdx];
|
|
79
|
+
const y1 = y[lowIdx];
|
|
80
|
+
|
|
81
|
+
// Linear interpolation
|
|
82
|
+
return y0 + ((target - x0) * (y1 - y0)) / (x1 - x0);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Helper function to calculate standard deviation
|
|
86
|
+
export const standardDeviation = (arr) => {
|
|
87
|
+
const mean = arr.reduce((sum, val) => sum + val, 0) / arr.length;
|
|
88
|
+
const variance = arr.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / arr.length;
|
|
89
|
+
return Math.sqrt(variance);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const getPower = (dataArray) => {
|
|
93
|
+
const squaredValues = dataArray.map(value => value * value);
|
|
94
|
+
const sum_of_squares = squaredValues.reduce((total, value) => total + value, 0);
|
|
95
|
+
const squared_mean = sum_of_squares / dataArray.length;
|
|
96
|
+
const dbLevel = 20 * Math.log10(Math.sqrt(squared_mean));
|
|
97
|
+
const roundedDbLevel = Math.round(dbLevel * 10) / 10;
|
|
98
|
+
return roundedDbLevel;
|
|
99
99
|
}
|