@audio/auditory-erb 1.0.0
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/erb-bank.js +40 -0
- package/package.json +30 -0
package/erb-bank.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERB-spaced filter bank using gammatone filters.
|
|
3
|
+
* Bands spaced according to the Equivalent Rectangular Bandwidth scale,
|
|
4
|
+
* matching human auditory frequency resolution.
|
|
5
|
+
*
|
|
6
|
+
* Reference: Glasberg & Moore, "Derivation of auditory filter shapes
|
|
7
|
+
* from notched-noise data", Hearing Research 47 (1990).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generate ERB-spaced filter bank center frequencies and bandwidths.
|
|
12
|
+
* @param {number} fs - Sample rate (default 44100)
|
|
13
|
+
* @param {object} opts - { fmin: 50, fmax: 16000, density: 1 (bands per ERB) }
|
|
14
|
+
* @returns {Array<{fc: number, erb: number}>}
|
|
15
|
+
*/
|
|
16
|
+
export default function erbBank (fs, opts) {
|
|
17
|
+
if (!fs) fs = 44100
|
|
18
|
+
if (!opts) opts = {}
|
|
19
|
+
let fmin = opts.fmin || 50
|
|
20
|
+
let fmax = opts.fmax || Math.min(16000, fs / 2)
|
|
21
|
+
let density = opts.density || 1
|
|
22
|
+
|
|
23
|
+
let bands = []
|
|
24
|
+
|
|
25
|
+
// ERB scale: ERB(f) = 24.7 * (4.37 * f/1000 + 1)
|
|
26
|
+
// ERB number: E(f) = 21.4 * log10(4.37 * f/1000 + 1)
|
|
27
|
+
let eMin = 21.4 * Math.log10(4.37 * fmin / 1000 + 1)
|
|
28
|
+
let eMax = 21.4 * Math.log10(4.37 * fmax / 1000 + 1)
|
|
29
|
+
let step = 1 / density
|
|
30
|
+
|
|
31
|
+
for (let e = eMin; e <= eMax; e += step) {
|
|
32
|
+
// Inverse ERB number → frequency
|
|
33
|
+
let fc = (Math.pow(10, e / 21.4) - 1) * 1000 / 4.37
|
|
34
|
+
if (fc < fmin || fc > fmax) continue
|
|
35
|
+
let erb = 24.7 * (4.37 * fc / 1000 + 1)
|
|
36
|
+
bands.push({ fc: Math.round(fc * 10) / 10, erb: Math.round(erb * 10) / 10 })
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return bands
|
|
40
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@audio/auditory-erb",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "ERB-spaced filter bank using gammatone filters",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "erb-bank.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./erb-bank.js",
|
|
10
|
+
"./package.json": "./package.json"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"erb-bank.js"
|
|
14
|
+
],
|
|
15
|
+
"keywords": [
|
|
16
|
+
"audio",
|
|
17
|
+
"dsp",
|
|
18
|
+
"auditory",
|
|
19
|
+
"filterbank",
|
|
20
|
+
"erb"
|
|
21
|
+
],
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"author": "Dmitry Iv. <dfcreative@gmail.com>",
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
}
|
|
30
|
+
}
|