echogarden 0.0.1 → 0.1.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/README.md +59 -1
- package/data/lexicons/heteronyms.json +674 -0
- package/data/schemas/options.json +1057 -0
- package/data/tables/lcid-table.json +7427 -0
- package/dist/alignment/DTWMfccSequenceAlignment.d.ts +2 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js +26 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignment.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignment.js +99 -0
- package/dist/alignment/DTWSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js +161 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js.map +1 -0
- package/dist/alignment/LevenshteinSequenceAlignment.d.ts +5 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js +102 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js.map +1 -0
- package/dist/alignment/SpeechAlignment.d.ts +27 -0
- package/dist/alignment/SpeechAlignment.js +266 -0
- package/dist/alignment/SpeechAlignment.js.map +1 -0
- package/dist/api/API.d.ts +8 -0
- package/dist/api/API.js +10 -0
- package/dist/api/API.js.map +1 -0
- package/dist/api/APIOptions.d.ts +12 -0
- package/dist/api/APIOptions.js +2 -0
- package/dist/api/APIOptions.js.map +1 -0
- package/dist/api/Alignment.d.ts +32 -0
- package/dist/api/Alignment.js +134 -0
- package/dist/api/Alignment.js.map +1 -0
- package/dist/api/Denoising.d.ts +14 -0
- package/dist/api/Denoising.js +66 -0
- package/dist/api/Denoising.js.map +1 -0
- package/dist/api/Globals.d.ts +1 -0
- package/dist/api/Globals.js +2 -0
- package/dist/api/Globals.js.map +1 -0
- package/dist/api/LanguageDetection.d.ts +49 -0
- package/dist/api/LanguageDetection.js +118 -0
- package/dist/api/LanguageDetection.js.map +1 -0
- package/dist/api/Recognition.d.ts +49 -0
- package/dist/api/Recognition.js +162 -0
- package/dist/api/Recognition.js.map +1 -0
- package/dist/api/Synthesis.d.ts +125 -0
- package/dist/api/Synthesis.js +892 -0
- package/dist/api/Synthesis.js.map +1 -0
- package/dist/api/Translation.d.ts +25 -0
- package/dist/api/Translation.js +69 -0
- package/dist/api/Translation.js.map +1 -0
- package/dist/api/Vad.d.ts +25 -0
- package/dist/api/Vad.js +88 -0
- package/dist/api/Vad.js.map +1 -0
- package/dist/audio/AudioBufferConversion.d.ts +15 -0
- package/dist/audio/AudioBufferConversion.js +228 -0
- package/dist/audio/AudioBufferConversion.js.map +1 -0
- package/dist/audio/AudioPlayer.d.ts +9 -0
- package/dist/audio/AudioPlayer.js +232 -0
- package/dist/audio/AudioPlayer.js.map +1 -0
- package/dist/audio/AudioRecorder.d.ts +3 -0
- package/dist/audio/AudioRecorder.js +68 -0
- package/dist/audio/AudioRecorder.js.map +1 -0
- package/dist/audio/AudioUtilities.d.ts +48 -0
- package/dist/audio/AudioUtilities.js +209 -0
- package/dist/audio/AudioUtilities.js.map +1 -0
- package/dist/audio/SoxPath.d.ts +1 -0
- package/dist/audio/SoxPath.js +19 -0
- package/dist/audio/SoxPath.js.map +1 -0
- package/dist/cli/CLI.d.ts +8 -0
- package/dist/cli/CLI.js +860 -0
- package/dist/cli/CLI.js.map +1 -0
- package/dist/cli/CLIConfigFile.d.ts +3 -0
- package/dist/cli/CLIConfigFile.js +62 -0
- package/dist/cli/CLIConfigFile.js.map +1 -0
- package/dist/cli/CLILauncher.d.ts +2 -0
- package/dist/cli/CLILauncher.js +22 -0
- package/dist/cli/CLILauncher.js.map +1 -0
- package/dist/cli/CLIOptionsSchema.d.ts +5 -0
- package/dist/cli/CLIOptionsSchema.js +36 -0
- package/dist/cli/CLIOptionsSchema.js.map +1 -0
- package/dist/cli/CLIParser.d.ts +6 -0
- package/dist/cli/CLIParser.js +34 -0
- package/dist/cli/CLIParser.js.map +1 -0
- package/dist/cli/CLIStarter.d.ts +1 -0
- package/dist/cli/CLIStarter.js +3 -0
- package/dist/cli/CLIStarter.js.map +1 -0
- package/dist/codecs/FFMpegTranscoder.d.ts +20 -0
- package/dist/codecs/FFMpegTranscoder.js +169 -0
- package/dist/codecs/FFMpegTranscoder.js.map +1 -0
- package/dist/codecs/TIMITCodec.d.ts +9 -0
- package/dist/codecs/TIMITCodec.js +14 -0
- package/dist/codecs/TIMITCodec.js.map +1 -0
- package/dist/codecs/WaveCodec.d.ts +19 -0
- package/dist/codecs/WaveCodec.js +208 -0
- package/dist/codecs/WaveCodec.js.map +1 -0
- package/dist/denoising/RNNoise.d.ts +6 -0
- package/dist/denoising/RNNoise.js +68 -0
- package/dist/denoising/RNNoise.js.map +1 -0
- package/dist/dsp/BiquadFilter.d.ts +26 -0
- package/dist/dsp/BiquadFilter.js +399 -0
- package/dist/dsp/BiquadFilter.js.map +1 -0
- package/dist/dsp/FFT.d.ts +9 -0
- package/dist/dsp/FFT.js +135 -0
- package/dist/dsp/FFT.js.map +1 -0
- package/dist/dsp/MFCC.d.ts +25 -0
- package/dist/dsp/MFCC.js +162 -0
- package/dist/dsp/MFCC.js.map +1 -0
- package/dist/dsp/MelSpectogram.d.ts +19 -0
- package/dist/dsp/MelSpectogram.js +102 -0
- package/dist/dsp/MelSpectogram.js.map +1 -0
- package/dist/dsp/Rubberband.d.ts +52 -0
- package/dist/dsp/Rubberband.js +186 -0
- package/dist/dsp/Rubberband.js.map +1 -0
- package/dist/dsp/Sonic.d.ts +2 -0
- package/dist/dsp/Sonic.js +39 -0
- package/dist/dsp/Sonic.js.map +1 -0
- package/dist/dsp/SpeexResampler.d.ts +3 -0
- package/dist/dsp/SpeexResampler.js +53 -0
- package/dist/dsp/SpeexResampler.js.map +1 -0
- package/dist/math/VectorMath.d.ts +70 -0
- package/dist/math/VectorMath.js +564 -0
- package/dist/math/VectorMath.js.map +1 -0
- package/dist/nlp/ChineseSegmentation.d.ts +1 -0
- package/dist/nlp/ChineseSegmentation.js +53 -0
- package/dist/nlp/ChineseSegmentation.js.map +1 -0
- package/dist/nlp/CompromiseNLP.d.ts +15 -0
- package/dist/nlp/CompromiseNLP.js +66 -0
- package/dist/nlp/CompromiseNLP.js.map +1 -0
- package/dist/nlp/EspeakPhonemizer.d.ts +4 -0
- package/dist/nlp/EspeakPhonemizer.js +133 -0
- package/dist/nlp/EspeakPhonemizer.js.map +1 -0
- package/dist/nlp/IPA.d.ts +19 -0
- package/dist/nlp/IPA.js +113 -0
- package/dist/nlp/IPA.js.map +1 -0
- package/dist/nlp/JapaneseSegmentation.d.ts +1 -0
- package/dist/nlp/JapaneseSegmentation.js +40 -0
- package/dist/nlp/JapaneseSegmentation.js.map +1 -0
- package/dist/nlp/Lexicon.d.ts +17 -0
- package/dist/nlp/Lexicon.js +6 -0
- package/dist/nlp/Lexicon.js.map +1 -0
- package/dist/nlp/PhoneConversion.d.ts +6 -0
- package/dist/nlp/PhoneConversion.js +467 -0
- package/dist/nlp/PhoneConversion.js.map +1 -0
- package/dist/nlp/Segmentation.d.ts +41 -0
- package/dist/nlp/Segmentation.js +158 -0
- package/dist/nlp/Segmentation.js.map +1 -0
- package/dist/nlp/TextNormalizer.d.ts +4 -0
- package/dist/nlp/TextNormalizer.js +69 -0
- package/dist/nlp/TextNormalizer.js.map +1 -0
- package/dist/recognition/AmazonTranscribeSTT.d.ts +6 -0
- package/dist/recognition/AmazonTranscribeSTT.js +79 -0
- package/dist/recognition/AmazonTranscribeSTT.js.map +1 -0
- package/dist/recognition/AzureCognitiveServicesSTT.d.ts +7 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js +51 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -0
- package/dist/recognition/GoogleCloudSTT.d.ts +7 -0
- package/dist/recognition/GoogleCloudSTT.js +66 -0
- package/dist/recognition/GoogleCloudSTT.js.map +1 -0
- package/dist/recognition/SileroSTT.d.ts +9 -0
- package/dist/recognition/SileroSTT.js +125 -0
- package/dist/recognition/SileroSTT.js.map +1 -0
- package/dist/recognition/VoskSTT.d.ts +10 -0
- package/dist/recognition/VoskSTT.js +78 -0
- package/dist/recognition/VoskSTT.js.map +1 -0
- package/dist/recognition/WhisperSTT.d.ts +69 -0
- package/dist/recognition/WhisperSTT.js +977 -0
- package/dist/recognition/WhisperSTT.js.map +1 -0
- package/dist/server/Server.d.ts +1 -0
- package/dist/server/Server.js +18 -0
- package/dist/server/Server.js.map +1 -0
- package/dist/speech-language-detection/SileroLanguageDetection.d.ts +9 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js +47 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -0
- package/dist/subtitles/Subtitles.d.ts +25 -0
- package/dist/subtitles/Subtitles.js +286 -0
- package/dist/subtitles/Subtitles.js.map +1 -0
- package/dist/synthesis/AwsPollyTTS.d.ts +7 -0
- package/dist/synthesis/AwsPollyTTS.js +51 -0
- package/dist/synthesis/AwsPollyTTS.js.map +1 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.d.ts +9 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js +103 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js.map +1 -0
- package/dist/synthesis/CoquiServerTTS.d.ts +6 -0
- package/dist/synthesis/CoquiServerTTS.js +22 -0
- package/dist/synthesis/CoquiServerTTS.js.map +1 -0
- package/dist/synthesis/ElevenLabsTTS.d.ts +8 -0
- package/dist/synthesis/ElevenLabsTTS.js +48 -0
- package/dist/synthesis/ElevenLabsTTS.js.map +1 -0
- package/dist/synthesis/EspeakTTS.d.ts +46 -0
- package/dist/synthesis/EspeakTTS.js +353 -0
- package/dist/synthesis/EspeakTTS.js.map +1 -0
- package/dist/synthesis/FliteTTS.d.ts +17 -0
- package/dist/synthesis/FliteTTS.js +326 -0
- package/dist/synthesis/FliteTTS.js.map +1 -0
- package/dist/synthesis/GoogleCloudTTS.d.ts +16 -0
- package/dist/synthesis/GoogleCloudTTS.js +72 -0
- package/dist/synthesis/GoogleCloudTTS.js.map +1 -0
- package/dist/synthesis/GoogleTranslateTTS.d.ts +13 -0
- package/dist/synthesis/GoogleTranslateTTS.js +177 -0
- package/dist/synthesis/GoogleTranslateTTS.js.map +1 -0
- package/dist/synthesis/MicrosoftEdgeTTS.d.ts +10 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js +216 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -0
- package/dist/synthesis/SamTTS.d.ts +4 -0
- package/dist/synthesis/SamTTS.js +21 -0
- package/dist/synthesis/SamTTS.js.map +1 -0
- package/dist/synthesis/SapiTTS.d.ts +9 -0
- package/dist/synthesis/SapiTTS.js +211 -0
- package/dist/synthesis/SapiTTS.js.map +1 -0
- package/dist/synthesis/StreamlabsPollyTTS.d.ts +12 -0
- package/dist/synthesis/StreamlabsPollyTTS.js +88 -0
- package/dist/synthesis/StreamlabsPollyTTS.js.map +1 -0
- package/dist/synthesis/SvoxPicoTTS.d.ts +11 -0
- package/dist/synthesis/SvoxPicoTTS.js +236 -0
- package/dist/synthesis/SvoxPicoTTS.js.map +1 -0
- package/dist/synthesis/VitsTTS.d.ts +27 -0
- package/dist/synthesis/VitsTTS.js +359 -0
- package/dist/synthesis/VitsTTS.js.map +1 -0
- package/dist/tests/Test.d.ts +1 -0
- package/dist/tests/Test.js +10 -0
- package/dist/tests/Test.js.map +1 -0
- package/dist/text-language-detection/FastTextLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js +38 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js.map +1 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js +12 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js.map +1 -0
- package/dist/utilities/BinaryArrayConversion.d.ts +15 -0
- package/dist/utilities/BinaryArrayConversion.js +115 -0
- package/dist/utilities/BinaryArrayConversion.js.map +1 -0
- package/dist/utilities/Compression.d.ts +4 -0
- package/dist/utilities/Compression.js +67 -0
- package/dist/utilities/Compression.js.map +1 -0
- package/dist/utilities/FileDownloader.d.ts +3 -0
- package/dist/utilities/FileDownloader.js +147 -0
- package/dist/utilities/FileDownloader.js.map +1 -0
- package/dist/utilities/FileSystem.d.ts +30 -0
- package/dist/utilities/FileSystem.js +141 -0
- package/dist/utilities/FileSystem.js.map +1 -0
- package/dist/utilities/Hashing.d.ts +10 -0
- package/dist/utilities/Hashing.js +169 -0
- package/dist/utilities/Hashing.js.map +1 -0
- package/dist/utilities/Locale.d.ts +9 -0
- package/dist/utilities/Locale.js +65 -0
- package/dist/utilities/Locale.js.map +1 -0
- package/dist/utilities/Logger.d.ts +11 -0
- package/dist/utilities/Logger.js +49 -0
- package/dist/utilities/Logger.js.map +1 -0
- package/dist/utilities/NdArrayUtilities.d.ts +3 -0
- package/dist/utilities/NdArrayUtilities.js +22 -0
- package/dist/utilities/NdArrayUtilities.js.map +1 -0
- package/dist/utilities/ObjectUtilities.d.ts +4 -0
- package/dist/utilities/ObjectUtilities.js +132 -0
- package/dist/utilities/ObjectUtilities.js.map +1 -0
- package/dist/utilities/OpenPromise.d.ts +6 -0
- package/dist/utilities/OpenPromise.js +12 -0
- package/dist/utilities/OpenPromise.js.map +1 -0
- package/dist/utilities/PackageManager.d.ts +4 -0
- package/dist/utilities/PackageManager.js +46 -0
- package/dist/utilities/PackageManager.js.map +1 -0
- package/dist/utilities/RandomGenerator.d.ts +35 -0
- package/dist/utilities/RandomGenerator.js +149 -0
- package/dist/utilities/RandomGenerator.js.map +1 -0
- package/dist/utilities/TarballMaker.d.ts +4 -0
- package/dist/utilities/TarballMaker.js +50 -0
- package/dist/utilities/TarballMaker.js.map +1 -0
- package/dist/utilities/Timeline.d.ts +20 -0
- package/dist/utilities/Timeline.js +110 -0
- package/dist/utilities/Timeline.js.map +1 -0
- package/dist/utilities/Timer.d.ts +13 -0
- package/dist/utilities/Timer.js +70 -0
- package/dist/utilities/Timer.js.map +1 -0
- package/dist/utilities/Utilities.d.ts +68 -0
- package/dist/utilities/Utilities.js +305 -0
- package/dist/utilities/Utilities.js.map +1 -0
- package/dist/utilities/WasmMemoryManager.d.ts +142 -0
- package/dist/utilities/WasmMemoryManager.js +407 -0
- package/dist/utilities/WasmMemoryManager.js.map +1 -0
- package/dist/utilities/WebReader.d.ts +1 -0
- package/dist/utilities/WebReader.js +47 -0
- package/dist/utilities/WebReader.js.map +1 -0
- package/dist/utilities/WikipediaReader.d.ts +1 -0
- package/dist/utilities/WikipediaReader.js +31 -0
- package/dist/utilities/WikipediaReader.js.map +1 -0
- package/dist/voice-activity-detection/SileroVAD.d.ts +13 -0
- package/dist/voice-activity-detection/SileroVAD.js +58 -0
- package/dist/voice-activity-detection/SileroVAD.js.map +1 -0
- package/dist/voice-activity-detection/WebRtcVAD.d.ts +3 -0
- package/dist/voice-activity-detection/WebRtcVAD.js +53 -0
- package/dist/voice-activity-detection/WebRtcVAD.js.map +1 -0
- package/docs/CLI.md +234 -0
- package/docs/Development.md +3 -0
- package/docs/Engines.md +80 -0
- package/docs/Licenses.md +37 -0
- package/docs/Options.md +192 -0
- package/docs/Roadmap.md +16 -0
- package/docs/Technical.md +72 -0
- package/package.json +119 -19
- package/cli.js +0 -3
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
// Based on the Chromium WebAudio source code at:
|
|
2
|
+
// https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/web_tests/webaudio/resources/biquad-filters.js
|
|
3
|
+
//
|
|
4
|
+
// A biquad filter has a z-transform of
|
|
5
|
+
// H(z) = (b0 + b1 / z + b2 / z^2) / (1 + a1 / z + a2 / z^2)
|
|
6
|
+
//
|
|
7
|
+
// The formulas for the various filters were taken from:
|
|
8
|
+
// https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html
|
|
9
|
+
//
|
|
10
|
+
// MDN documentation:
|
|
11
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/BiquadFilterNode
|
|
12
|
+
import { clip } from "../utilities/Utilities.js";
|
|
13
|
+
export function lowpassFilter(rawAudio, cutoffFrequency, q = 0.7071) {
|
|
14
|
+
return filter(rawAudio, "lowpass", cutoffFrequency, 0, q);
|
|
15
|
+
}
|
|
16
|
+
export function highpassFilter(rawAudio, cutoffFrequency, q = 0.7071) {
|
|
17
|
+
return filter(rawAudio, "highpass", cutoffFrequency, 0, q);
|
|
18
|
+
}
|
|
19
|
+
export function bandpassFilter(rawAudio, centerFrequency, q = 1) {
|
|
20
|
+
return filter(rawAudio, "bandpass", centerFrequency, 0, q);
|
|
21
|
+
}
|
|
22
|
+
export function lowshelfFilter(rawAudio, midpointFrequency, gain) {
|
|
23
|
+
return filter(rawAudio, "lowshelf", midpointFrequency, gain, 0);
|
|
24
|
+
}
|
|
25
|
+
export function highshelfFilter(rawAudio, midpointFrequency, gain) {
|
|
26
|
+
return filter(rawAudio, "highshelf", midpointFrequency, gain, 0);
|
|
27
|
+
}
|
|
28
|
+
export function peakingFilter(rawAudio, centerFrequency, gain, q = 1) {
|
|
29
|
+
return filter(rawAudio, "peaking", centerFrequency, gain, q);
|
|
30
|
+
}
|
|
31
|
+
export function notchFilter(rawAudio, centerFrequency, q = 1) {
|
|
32
|
+
return filter(rawAudio, "notch", centerFrequency, 0, q);
|
|
33
|
+
}
|
|
34
|
+
export function allpassFilter(rawAudio, centerFrequency, q = 1) {
|
|
35
|
+
return filter(rawAudio, "allpass", centerFrequency, 0, q);
|
|
36
|
+
}
|
|
37
|
+
export function filter(rawAudio, filterType, frequency, gain, q) {
|
|
38
|
+
const sampleRate = rawAudio.sampleRate;
|
|
39
|
+
const filteredAudio = { audioChannels: [], sampleRate };
|
|
40
|
+
const coefficients = createFilter(filterType, sampleRate, frequency, q, gain);
|
|
41
|
+
for (let channelIndex = 0; channelIndex < rawAudio.audioChannels.length; channelIndex++) {
|
|
42
|
+
const channelSamples = rawAudio.audioChannels[channelIndex];
|
|
43
|
+
const filteredSamples = filterUsingCoefficients(channelSamples, coefficients);
|
|
44
|
+
filteredAudio.audioChannels.push(filteredSamples);
|
|
45
|
+
}
|
|
46
|
+
return filteredAudio;
|
|
47
|
+
}
|
|
48
|
+
export function filterUsingCoefficients(samples, filterCoefficients) {
|
|
49
|
+
const sampleCount = samples.length;
|
|
50
|
+
const filteredSamples = new Float32Array(sampleCount);
|
|
51
|
+
if (sampleCount < 2) {
|
|
52
|
+
return filteredSamples;
|
|
53
|
+
}
|
|
54
|
+
const b0 = filterCoefficients.b0;
|
|
55
|
+
const b1 = filterCoefficients.b1;
|
|
56
|
+
const b2 = filterCoefficients.b2;
|
|
57
|
+
const a1 = filterCoefficients.a1;
|
|
58
|
+
const a2 = filterCoefficients.a2;
|
|
59
|
+
// Prime the pump. (Assumes the signal has length >= 2!)
|
|
60
|
+
filteredSamples[0] = b0 * samples[0];
|
|
61
|
+
filteredSamples[1] = (b0 * samples[1]) + (b1 * samples[0]) - (a1 * filteredSamples[0]);
|
|
62
|
+
// Filter
|
|
63
|
+
for (let i = 2; i < sampleCount; i++) {
|
|
64
|
+
filteredSamples[i] =
|
|
65
|
+
(b0 * samples[i]) +
|
|
66
|
+
(b1 * samples[i - 1]) +
|
|
67
|
+
(b2 * samples[i - 2]) -
|
|
68
|
+
(a1 * filteredSamples[i - 1]) -
|
|
69
|
+
(a2 * filteredSamples[i - 2]);
|
|
70
|
+
}
|
|
71
|
+
return filteredSamples;
|
|
72
|
+
}
|
|
73
|
+
export function createFilter(filterType, sampleRate, centerFrequency, q, gain) {
|
|
74
|
+
const nyquistFrequency = sampleRate / 2;
|
|
75
|
+
const freqRatio = clip(centerFrequency / nyquistFrequency, 0, 1);
|
|
76
|
+
return filterCreatorFunction[filterType](freqRatio, q, gain);
|
|
77
|
+
}
|
|
78
|
+
// Lowpass filter.
|
|
79
|
+
export function createLowpassFilter(freqRatio, q, gain) {
|
|
80
|
+
let b0;
|
|
81
|
+
let b1;
|
|
82
|
+
let b2;
|
|
83
|
+
let a0;
|
|
84
|
+
let a1;
|
|
85
|
+
let a2;
|
|
86
|
+
if (freqRatio == 1) {
|
|
87
|
+
// The formula below works, except for roundoff. When freqRatio = 1,
|
|
88
|
+
// the filter is just a wire, so hardwire the coefficients.
|
|
89
|
+
b0 = 1;
|
|
90
|
+
b1 = 0;
|
|
91
|
+
b2 = 0;
|
|
92
|
+
a0 = 1;
|
|
93
|
+
a1 = 0;
|
|
94
|
+
a2 = 0;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const theta = Math.PI * freqRatio;
|
|
98
|
+
const alpha = Math.sin(theta) / (2 * Math.pow(10, q / 20));
|
|
99
|
+
const cosw = Math.cos(theta);
|
|
100
|
+
const beta = (1 - cosw) / 2;
|
|
101
|
+
b0 = beta;
|
|
102
|
+
b1 = 2 * beta;
|
|
103
|
+
b2 = beta;
|
|
104
|
+
a0 = 1 + alpha;
|
|
105
|
+
a1 = -2 * cosw;
|
|
106
|
+
a2 = 1 - alpha;
|
|
107
|
+
}
|
|
108
|
+
return normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
|
|
109
|
+
}
|
|
110
|
+
function createHighpassFilter(freqRatio, q, gain) {
|
|
111
|
+
let b0;
|
|
112
|
+
let b1;
|
|
113
|
+
let b2;
|
|
114
|
+
let a0;
|
|
115
|
+
let a1;
|
|
116
|
+
let a2;
|
|
117
|
+
if (freqRatio == 1) {
|
|
118
|
+
// The filter is 0
|
|
119
|
+
b0 = 0;
|
|
120
|
+
b1 = 0;
|
|
121
|
+
b2 = 0;
|
|
122
|
+
a0 = 1;
|
|
123
|
+
a1 = 0;
|
|
124
|
+
a2 = 0;
|
|
125
|
+
}
|
|
126
|
+
else if (freqRatio == 0) {
|
|
127
|
+
// The filter is 1. Computation of coefficients below is ok, but
|
|
128
|
+
// there's a pole at 1 and a zero at 1, so round-off could make
|
|
129
|
+
// the filter unstable.
|
|
130
|
+
b0 = 1;
|
|
131
|
+
b1 = 0;
|
|
132
|
+
b2 = 0;
|
|
133
|
+
a0 = 1;
|
|
134
|
+
a1 = 0;
|
|
135
|
+
a2 = 0;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const theta = Math.PI * freqRatio;
|
|
139
|
+
const alpha = Math.sin(theta) / (2 * Math.pow(10, q / 20));
|
|
140
|
+
const cosw = Math.cos(theta);
|
|
141
|
+
const beta = (1 + cosw) / 2;
|
|
142
|
+
b0 = beta;
|
|
143
|
+
b1 = -2 * beta;
|
|
144
|
+
b2 = beta;
|
|
145
|
+
a0 = 1 + alpha;
|
|
146
|
+
a1 = -2 * cosw;
|
|
147
|
+
a2 = 1 - alpha;
|
|
148
|
+
}
|
|
149
|
+
return normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
|
|
150
|
+
}
|
|
151
|
+
function createBandpassFilter(freqRatio, q, gain) {
|
|
152
|
+
let b0;
|
|
153
|
+
let b1;
|
|
154
|
+
let b2;
|
|
155
|
+
let a0;
|
|
156
|
+
let a1;
|
|
157
|
+
let a2;
|
|
158
|
+
let coefficients;
|
|
159
|
+
if (freqRatio > 0 && freqRatio < 1) {
|
|
160
|
+
const w0 = Math.PI * freqRatio;
|
|
161
|
+
if (q > 0) {
|
|
162
|
+
const alpha = Math.sin(w0) / (2 * q);
|
|
163
|
+
const k = Math.cos(w0);
|
|
164
|
+
b0 = alpha;
|
|
165
|
+
b1 = 0;
|
|
166
|
+
b2 = -alpha;
|
|
167
|
+
a0 = 1 + alpha;
|
|
168
|
+
a1 = -2 * k;
|
|
169
|
+
a2 = 1 - alpha;
|
|
170
|
+
coefficients = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// q = 0, and frequency ratio is not 0 or 1. The above formula has a
|
|
174
|
+
// divide by zero problem. The limit of the z-transform as q
|
|
175
|
+
// approaches 0 is 1, so set the filter that way.
|
|
176
|
+
coefficients = { b0: 1, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// When freqRatio = 0 or 1, the z-transform is identically 0,
|
|
181
|
+
// independent of q.
|
|
182
|
+
coefficients = { b0: 0, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
183
|
+
}
|
|
184
|
+
return coefficients;
|
|
185
|
+
}
|
|
186
|
+
function createLowShelfFilter(freqRatio, q, gain) {
|
|
187
|
+
// q not used
|
|
188
|
+
let b0;
|
|
189
|
+
let b1;
|
|
190
|
+
let b2;
|
|
191
|
+
let a0;
|
|
192
|
+
let a1;
|
|
193
|
+
let a2;
|
|
194
|
+
let coefficients;
|
|
195
|
+
const S = 1;
|
|
196
|
+
const A = Math.pow(10, gain / 40);
|
|
197
|
+
if (freqRatio == 1) {
|
|
198
|
+
// The filter is just a constant gain
|
|
199
|
+
coefficients = { b0: A * A, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
200
|
+
}
|
|
201
|
+
else if (freqRatio == 0) {
|
|
202
|
+
// The filter is 1
|
|
203
|
+
coefficients = { b0: 1, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const w0 = Math.PI * freqRatio;
|
|
207
|
+
const alpha = 1 / 2 * Math.sin(w0) * Math.sqrt((A + 1 / A) * (1 / S - 1) + 2);
|
|
208
|
+
const k = Math.cos(w0);
|
|
209
|
+
const k2 = 2 * Math.sqrt(A) * alpha;
|
|
210
|
+
const Ap1 = A + 1;
|
|
211
|
+
const Am1 = A - 1;
|
|
212
|
+
b0 = A * (Ap1 - Am1 * k + k2);
|
|
213
|
+
b1 = 2 * A * (Am1 - Ap1 * k);
|
|
214
|
+
b2 = A * (Ap1 - Am1 * k - k2);
|
|
215
|
+
a0 = Ap1 + Am1 * k + k2;
|
|
216
|
+
a1 = -2 * (Am1 + Ap1 * k);
|
|
217
|
+
a2 = Ap1 + Am1 * k - k2;
|
|
218
|
+
coefficients = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
|
|
219
|
+
}
|
|
220
|
+
return coefficients;
|
|
221
|
+
}
|
|
222
|
+
function createHighShelfFilter(freqRatio, q, gain) {
|
|
223
|
+
// q not used
|
|
224
|
+
let b0;
|
|
225
|
+
let b1;
|
|
226
|
+
let b2;
|
|
227
|
+
let a0;
|
|
228
|
+
let a1;
|
|
229
|
+
let a2;
|
|
230
|
+
let coefficients;
|
|
231
|
+
const A = Math.pow(10, gain / 40);
|
|
232
|
+
if (freqRatio == 1) {
|
|
233
|
+
// When freqRatio = 1, the z-transform is 1
|
|
234
|
+
coefficients = { b0: 1, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
235
|
+
}
|
|
236
|
+
else if (freqRatio > 0) {
|
|
237
|
+
const w0 = Math.PI * freqRatio;
|
|
238
|
+
const S = 1;
|
|
239
|
+
const alpha = 0.5 * Math.sin(w0) * Math.sqrt((A + 1 / A) * (1 / S - 1) + 2);
|
|
240
|
+
const k = Math.cos(w0);
|
|
241
|
+
const k2 = 2 * Math.sqrt(A) * alpha;
|
|
242
|
+
const Ap1 = A + 1;
|
|
243
|
+
const Am1 = A - 1;
|
|
244
|
+
b0 = A * (Ap1 + Am1 * k + k2);
|
|
245
|
+
b1 = -2 * A * (Am1 + Ap1 * k);
|
|
246
|
+
b2 = A * (Ap1 + Am1 * k - k2);
|
|
247
|
+
a0 = Ap1 - Am1 * k + k2;
|
|
248
|
+
a1 = 2 * (Am1 - Ap1 * k);
|
|
249
|
+
a2 = Ap1 - Am1 * k - k2;
|
|
250
|
+
coefficients = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// When freqRatio = 0, the filter is just a gain
|
|
254
|
+
coefficients = { b0: A * A, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
255
|
+
}
|
|
256
|
+
return coefficients;
|
|
257
|
+
}
|
|
258
|
+
function createPeakingFilter(freqRatio, q, gain) {
|
|
259
|
+
let b0;
|
|
260
|
+
let b1;
|
|
261
|
+
let b2;
|
|
262
|
+
let a0;
|
|
263
|
+
let a1;
|
|
264
|
+
let a2;
|
|
265
|
+
let coefficients;
|
|
266
|
+
const A = Math.pow(10, gain / 40);
|
|
267
|
+
if (freqRatio > 0 && freqRatio < 1) {
|
|
268
|
+
if (q > 0) {
|
|
269
|
+
const w0 = Math.PI * freqRatio;
|
|
270
|
+
const alpha = Math.sin(w0) / (2 * q);
|
|
271
|
+
const k = Math.cos(w0);
|
|
272
|
+
b0 = 1 + alpha * A;
|
|
273
|
+
b1 = -2 * k;
|
|
274
|
+
b2 = 1 - alpha * A;
|
|
275
|
+
a0 = 1 + alpha / A;
|
|
276
|
+
a1 = -2 * k;
|
|
277
|
+
a2 = 1 - alpha / A;
|
|
278
|
+
coefficients = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
// q = 0, we have a divide by zero problem in the formulas
|
|
282
|
+
// above. But if we look at the z-transform, we see that the
|
|
283
|
+
// limit as q approaches 0 is A^2.
|
|
284
|
+
coefficients = { b0: A * A, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
// freqRatio = 0 or 1, the z-transform is 1
|
|
289
|
+
coefficients = { b0: 1, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
290
|
+
}
|
|
291
|
+
return coefficients;
|
|
292
|
+
}
|
|
293
|
+
function createNotchFilter(freqRatio, q, gain) {
|
|
294
|
+
let b0;
|
|
295
|
+
let b1;
|
|
296
|
+
let b2;
|
|
297
|
+
let a0;
|
|
298
|
+
let a1;
|
|
299
|
+
let a2;
|
|
300
|
+
let coefficients;
|
|
301
|
+
if (freqRatio > 0 && freqRatio < 1) {
|
|
302
|
+
if (q > 0) {
|
|
303
|
+
const w0 = Math.PI * freqRatio;
|
|
304
|
+
const alpha = Math.sin(w0) / (2 * q);
|
|
305
|
+
const k = Math.cos(w0);
|
|
306
|
+
b0 = 1;
|
|
307
|
+
b1 = -2 * k;
|
|
308
|
+
b2 = 1;
|
|
309
|
+
a0 = 1 + alpha;
|
|
310
|
+
a1 = -2 * k;
|
|
311
|
+
a2 = 1 - alpha;
|
|
312
|
+
coefficients = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
// When q = 0, we get a divide by zero above. The limit of the
|
|
316
|
+
// z-transform as q approaches 0 is 0, so set the coefficients
|
|
317
|
+
// appropriately.
|
|
318
|
+
coefficients = { b0: 0, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
// When freqRatio = 0 or 1, the z-transform is 1
|
|
323
|
+
coefficients = { b0: 1, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
324
|
+
}
|
|
325
|
+
return coefficients;
|
|
326
|
+
}
|
|
327
|
+
function createAllpassFilter(freqRatio, q, gain) {
|
|
328
|
+
let b0;
|
|
329
|
+
let b1;
|
|
330
|
+
let b2;
|
|
331
|
+
let a0;
|
|
332
|
+
let a1;
|
|
333
|
+
let a2;
|
|
334
|
+
let coefficients;
|
|
335
|
+
if (freqRatio > 0 && freqRatio < 1) {
|
|
336
|
+
if (q > 0) {
|
|
337
|
+
const w0 = Math.PI * freqRatio;
|
|
338
|
+
const alpha = Math.sin(w0) / (2 * q);
|
|
339
|
+
const k = Math.cos(w0);
|
|
340
|
+
b0 = 1 - alpha;
|
|
341
|
+
b1 = -2 * k;
|
|
342
|
+
b2 = 1 + alpha;
|
|
343
|
+
a0 = 1 + alpha;
|
|
344
|
+
a1 = -2 * k;
|
|
345
|
+
a2 = 1 - alpha;
|
|
346
|
+
coefficients = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
// q = 0
|
|
350
|
+
coefficients = { b0: -1, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
coefficients = { b0: 1, b1: 0, b2: 0, a1: 0, a2: 0 };
|
|
355
|
+
}
|
|
356
|
+
return coefficients;
|
|
357
|
+
}
|
|
358
|
+
function normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2) {
|
|
359
|
+
const scale = 1 / a0;
|
|
360
|
+
return {
|
|
361
|
+
b0: b0 * scale,
|
|
362
|
+
b1: b1 * scale,
|
|
363
|
+
b2: b2 * scale,
|
|
364
|
+
a1: a1 * scale,
|
|
365
|
+
a2: a2 * scale
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
export function bandwidthToQFactor(bandwidth) {
|
|
369
|
+
const twoToBandwidth = 2 ** bandwidth;
|
|
370
|
+
const q = Math.sqrt(twoToBandwidth) / (twoToBandwidth - 1);
|
|
371
|
+
return q;
|
|
372
|
+
}
|
|
373
|
+
export function qFactorToBandwidth(q) {
|
|
374
|
+
const bandwidth = (2 / Math.log(2)) * Math.asinh(1 / (2 * q));
|
|
375
|
+
return bandwidth;
|
|
376
|
+
}
|
|
377
|
+
// Map the filter type name to a function that computes the filter coefficents
|
|
378
|
+
// for the given filter type.
|
|
379
|
+
const filterCreatorFunction = {
|
|
380
|
+
'lowpass': createLowpassFilter,
|
|
381
|
+
'highpass': createHighpassFilter,
|
|
382
|
+
'bandpass': createBandpassFilter,
|
|
383
|
+
'lowshelf': createLowShelfFilter,
|
|
384
|
+
'highshelf': createHighShelfFilter,
|
|
385
|
+
'peaking': createPeakingFilter,
|
|
386
|
+
'notch': createNotchFilter,
|
|
387
|
+
'allpass': createAllpassFilter
|
|
388
|
+
};
|
|
389
|
+
export const filterTypeName = {
|
|
390
|
+
'lowpass': 'Lowpass filter',
|
|
391
|
+
'highpass': 'Highpass filter',
|
|
392
|
+
'bandpass': 'Bandpass filter',
|
|
393
|
+
'lowshelf': 'Lowshelf filter',
|
|
394
|
+
'highshelf': 'Highshelf filter',
|
|
395
|
+
'peaking': 'Peaking filter',
|
|
396
|
+
'notch': 'Notch filter',
|
|
397
|
+
'allpass': 'Allpass filter'
|
|
398
|
+
};
|
|
399
|
+
//# sourceMappingURL=BiquadFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BiquadFilter.js","sourceRoot":"","sources":["../../src/dsp/BiquadFilter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
2
|
+
export declare function stftr(samples: Float32Array, fftOrder: number, windowSize: number, hopLength: number, windowType: WindowType): Promise<Float32Array[]>;
|
|
3
|
+
export declare function stiftr(binsForFrames: Float32Array[], fftOrder: number, windowSize: number, hopSize: number, windowType: WindowType, expectedOutputLength: number): Promise<Float32Array>;
|
|
4
|
+
export declare function getBinFrequencies(binCount: number, maxFrequency: number): Float32Array;
|
|
5
|
+
export declare function fftFramesToPowerSpectogram(fftFrames: Float32Array[]): Float32Array[];
|
|
6
|
+
export declare function fftFrameToPowerSpectrum(fftFrame: Float32Array): Float32Array;
|
|
7
|
+
export declare function getKissFFTInstance(): Promise<any>;
|
|
8
|
+
export declare function testFFT1(rawAudio: RawAudio): Promise<RawAudio>;
|
|
9
|
+
export type WindowType = "hann" | "hamming";
|
package/dist/dsp/FFT.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { concatFloat32Arrays } from "../utilities/Utilities.js";
|
|
2
|
+
import { WasmMemoryManager } from "../utilities/WasmMemoryManager.js";
|
|
3
|
+
let kissFFTInstance;
|
|
4
|
+
export async function stftr(samples, fftOrder, windowSize, hopLength, windowType) {
|
|
5
|
+
if (fftOrder % 2 != 0 || windowSize % 2 != 0) {
|
|
6
|
+
throw new Error("FFT order and window size must multiples of 2");
|
|
7
|
+
}
|
|
8
|
+
if (windowSize > fftOrder) {
|
|
9
|
+
throw new Error("Window size must be lesser or equal to the FFT order");
|
|
10
|
+
}
|
|
11
|
+
const halfWindowSize = windowSize / 2;
|
|
12
|
+
const padding = new Float32Array(halfWindowSize);
|
|
13
|
+
samples = concatFloat32Arrays([padding, samples, padding]);
|
|
14
|
+
const windowWeights = getWindowWeights(windowType, windowSize);
|
|
15
|
+
const m = await getKissFFTInstance();
|
|
16
|
+
const wasmMemory = new WasmMemoryManager(m);
|
|
17
|
+
const statePtr = m._kiss_fftr_alloc(fftOrder, 0, 0, 0);
|
|
18
|
+
wasmMemory.wrapPointer(statePtr);
|
|
19
|
+
const sampleCount = samples.length;
|
|
20
|
+
const frameBufferRef = wasmMemory.allocFloat32Array(fftOrder);
|
|
21
|
+
const binsBufferRef = wasmMemory.allocFloat32Array(fftOrder * 2);
|
|
22
|
+
const frames = [];
|
|
23
|
+
for (let offset = 0; offset < sampleCount; offset += hopLength) {
|
|
24
|
+
const windowSamples = samples.subarray(offset, offset + windowSize);
|
|
25
|
+
frameBufferRef.clear();
|
|
26
|
+
const frameBufferView = frameBufferRef.view;
|
|
27
|
+
for (let i = 0; i < windowSamples.length; i++) {
|
|
28
|
+
frameBufferView[i] = windowSamples[i] * windowWeights[i];
|
|
29
|
+
}
|
|
30
|
+
binsBufferRef.clear();
|
|
31
|
+
m._kiss_fftr(statePtr, frameBufferRef.address, binsBufferRef.address);
|
|
32
|
+
const bins = binsBufferRef.view.slice(0, fftOrder + 2);
|
|
33
|
+
frames.push(bins);
|
|
34
|
+
}
|
|
35
|
+
wasmMemory.freeAll();
|
|
36
|
+
return frames;
|
|
37
|
+
}
|
|
38
|
+
export async function stiftr(binsForFrames, fftOrder, windowSize, hopSize, windowType, expectedOutputLength) {
|
|
39
|
+
if (fftOrder % 2 != 0 || windowSize % 2 != 0) {
|
|
40
|
+
throw new Error("FFT order and window size must multiples of 2");
|
|
41
|
+
}
|
|
42
|
+
if (windowSize > fftOrder) {
|
|
43
|
+
throw new Error("Window size must be lesser or equal to the FFT order");
|
|
44
|
+
}
|
|
45
|
+
const halfWindowSize = windowSize / 2;
|
|
46
|
+
if (hopSize != halfWindowSize) {
|
|
47
|
+
throw new Error("To perform inverse short-time FFT, hop size must be half the window size");
|
|
48
|
+
}
|
|
49
|
+
if (windowType != "hann") {
|
|
50
|
+
throw new Error("Only Hann window is currently supported for inverse short-time FFT");
|
|
51
|
+
}
|
|
52
|
+
const m = await getKissFFTInstance();
|
|
53
|
+
const wasmMemory = new WasmMemoryManager(m);
|
|
54
|
+
const statePtr = m._kiss_fftr_alloc(fftOrder, 1, 0, 0);
|
|
55
|
+
wasmMemory.wrapPointer(statePtr);
|
|
56
|
+
const outSamples = new Float32Array(binsForFrames.length * hopSize);
|
|
57
|
+
const frameBufferRef = wasmMemory.allocFloat32Array(fftOrder);
|
|
58
|
+
const binsRef = wasmMemory.allocFloat32Array(fftOrder * 2);
|
|
59
|
+
for (let frameIndex = 0, writeOffset = 0; frameIndex < binsForFrames.length; frameIndex++, writeOffset += hopSize) {
|
|
60
|
+
const bins = binsForFrames[frameIndex];
|
|
61
|
+
binsRef.clear();
|
|
62
|
+
binsRef.view.set(bins);
|
|
63
|
+
frameBufferRef.clear();
|
|
64
|
+
m._kiss_fftri(statePtr, binsRef.address, frameBufferRef.address);
|
|
65
|
+
const frameSamples = frameBufferRef.view;
|
|
66
|
+
for (let i = 0; i < windowSize; i++) {
|
|
67
|
+
outSamples[writeOffset + i] += frameSamples[i];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
wasmMemory.freeAll();
|
|
71
|
+
return outSamples.subarray(halfWindowSize, halfWindowSize + expectedOutputLength);
|
|
72
|
+
}
|
|
73
|
+
export function getBinFrequencies(binCount, maxFrequency) {
|
|
74
|
+
const binFrequencies = new Float32Array(binCount);
|
|
75
|
+
const frequencyStep = maxFrequency / (binCount - 1);
|
|
76
|
+
for (let i = 0, frequency = 0; i < binFrequencies.length; i++, frequency += frequencyStep) {
|
|
77
|
+
binFrequencies[i] = frequency;
|
|
78
|
+
}
|
|
79
|
+
return binFrequencies;
|
|
80
|
+
}
|
|
81
|
+
export function fftFramesToPowerSpectogram(fftFrames) {
|
|
82
|
+
return fftFrames.map(fftFrame => fftFrameToPowerSpectrum(fftFrame));
|
|
83
|
+
}
|
|
84
|
+
export function fftFrameToPowerSpectrum(fftFrame) {
|
|
85
|
+
const powerSpectrum = new Float32Array(fftFrame.length / 2);
|
|
86
|
+
for (let i = 0; i < powerSpectrum.length; i++) {
|
|
87
|
+
const binOffset = i * 2;
|
|
88
|
+
const fftCoefficientRealPart = fftFrame[binOffset];
|
|
89
|
+
const fftCoefficientImaginaryPart = fftFrame[binOffset + 1];
|
|
90
|
+
const binPower = (fftCoefficientRealPart ** 2) + (fftCoefficientImaginaryPart ** 2);
|
|
91
|
+
powerSpectrum[i] = binPower;
|
|
92
|
+
}
|
|
93
|
+
return powerSpectrum;
|
|
94
|
+
}
|
|
95
|
+
export async function getKissFFTInstance() {
|
|
96
|
+
if (!kissFFTInstance) {
|
|
97
|
+
const { default: initializer } = await import('@echogarden/kissfft-wasm');
|
|
98
|
+
kissFFTInstance = await initializer();
|
|
99
|
+
}
|
|
100
|
+
return kissFFTInstance;
|
|
101
|
+
}
|
|
102
|
+
function getWindowWeights(windowType, windowSize) {
|
|
103
|
+
const weights = new Float32Array(windowSize);
|
|
104
|
+
if (windowType == "hann") {
|
|
105
|
+
//const innerMultiplier = (2 * Math.PI) / (windowSize - 1)
|
|
106
|
+
for (let i = 0; i < windowSize; i++) {
|
|
107
|
+
weights[i] = 0.5 * (1 - Math.cos(2 * Math.PI * (i / (windowSize - 1))));
|
|
108
|
+
//weights[i] = 0.5 * (1 - Math.cos(innerMultiplier * i))
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (windowType == "hamming") {
|
|
112
|
+
for (let i = 0; i < windowSize; i++) {
|
|
113
|
+
weights[i] = 0.54 - (0.46 * Math.cos(2 * Math.PI * (i / (windowSize - 1))));
|
|
114
|
+
//weights[i] = 0.54 - (0.46 * Math.cos(i * innerMultiplier))
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
throw new Error(`Unsupported window function type: ${windowType}`);
|
|
119
|
+
}
|
|
120
|
+
return weights;
|
|
121
|
+
}
|
|
122
|
+
export async function testFFT1(rawAudio) {
|
|
123
|
+
const { resampleAudioSpeex } = await import("./SpeexResampler.js");
|
|
124
|
+
const samples = (await resampleAudioSpeex(rawAudio, 16000)).audioChannels[0];
|
|
125
|
+
const fftOrder = 512;
|
|
126
|
+
const windowSize = 320;
|
|
127
|
+
const hopLength = windowSize / 2;
|
|
128
|
+
const windowType = "hann";
|
|
129
|
+
const bins = await stftr(samples, fftOrder, windowSize, hopLength, windowType);
|
|
130
|
+
const normalizedBins = bins.map(bin => bin.map(x => x / fftOrder));
|
|
131
|
+
const recoveredSamples = await stiftr(normalizedBins, fftOrder, windowSize, hopLength, windowType, samples.length);
|
|
132
|
+
const recoveredRawAudio = { audioChannels: [recoveredSamples], sampleRate: 16000 };
|
|
133
|
+
return recoveredRawAudio;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=FFT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FFT.js","sourceRoot":"","sources":["../../src/dsp/FFT.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
2
|
+
export declare function computeMFCCs(monoAudio: RawAudio, options?: MfccOptions): Promise<number[][]>;
|
|
3
|
+
export declare function melSpectogramToMFCCs(melSpectogram: Float32Array[], mfccFeatureCount: number): Float32Array[];
|
|
4
|
+
export declare function melSpectrumToMFCC(melSpectrum: Float32Array, mfccFeatureCount: number, dctMatrix: Float32Array[], normalization?: "none" | "orthonormal"): Float32Array;
|
|
5
|
+
export declare function createDCTType2CoefficientMatrix(mfccFeatureCount: number, melBandCount: number): Float32Array[];
|
|
6
|
+
export declare function mfccBufferToVectors(mfccBuffer: Float64Array, mfccFeatureCount: number): number[][];
|
|
7
|
+
export declare function applyEmphasis(samples: Float32Array, emphasisFactor?: number, initialState?: number): Float32Array;
|
|
8
|
+
export declare function applyLiftering(mfccs: number[][], lifteringFactor: number): number[][];
|
|
9
|
+
export type MfccOptions = {
|
|
10
|
+
filterbankCount?: number;
|
|
11
|
+
featureCount?: number;
|
|
12
|
+
fftOrder?: number;
|
|
13
|
+
lowerFreq?: number;
|
|
14
|
+
upperFreq?: number;
|
|
15
|
+
windowDuration?: number;
|
|
16
|
+
hopDuration?: number;
|
|
17
|
+
emphasisFactor?: number;
|
|
18
|
+
analysisSampleRate?: number;
|
|
19
|
+
lifteringFactor?: number;
|
|
20
|
+
normalize?: boolean;
|
|
21
|
+
zeroFirstCoefficient?: boolean;
|
|
22
|
+
method?: "default" | "cmfcc";
|
|
23
|
+
};
|
|
24
|
+
export declare const defaultMfccOptions: MfccOptions;
|
|
25
|
+
export declare function extendDefaultMfccOptions(options: MfccOptions): any;
|