@jtarrio/webrtlsdr 0.0.1
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/LICENSE +203 -0
- package/README.md +69 -0
- package/dist/audio/player.d.ts +24 -0
- package/dist/audio/player.d.ts.map +1 -0
- package/dist/audio/player.js +68 -0
- package/dist/audio/player.js.map +1 -0
- package/dist/demod/demodulator.d.ts +59 -0
- package/dist/demod/demodulator.d.ts.map +1 -0
- package/dist/demod/demodulator.js +150 -0
- package/dist/demod/demodulator.js.map +1 -0
- package/dist/demod/sample-counter.d.ts +18 -0
- package/dist/demod/sample-counter.d.ts.map +1 -0
- package/dist/demod/sample-counter.js +43 -0
- package/dist/demod/sample-counter.js.map +1 -0
- package/dist/demod/scheme-am.d.ts +32 -0
- package/dist/demod/scheme-am.d.ts.map +1 -0
- package/dist/demod/scheme-am.js +75 -0
- package/dist/demod/scheme-am.js.map +1 -0
- package/dist/demod/scheme-cw.d.ts +22 -0
- package/dist/demod/scheme-cw.d.ts.map +1 -0
- package/dist/demod/scheme-cw.js +68 -0
- package/dist/demod/scheme-cw.js.map +1 -0
- package/dist/demod/scheme-nbfm.d.ts +32 -0
- package/dist/demod/scheme-nbfm.d.ts.map +1 -0
- package/dist/demod/scheme-nbfm.js +76 -0
- package/dist/demod/scheme-nbfm.js.map +1 -0
- package/dist/demod/scheme-ssb.d.ts +33 -0
- package/dist/demod/scheme-ssb.d.ts.map +1 -0
- package/dist/demod/scheme-ssb.js +75 -0
- package/dist/demod/scheme-ssb.js.map +1 -0
- package/dist/demod/scheme-wbfm.d.ts +38 -0
- package/dist/demod/scheme-wbfm.d.ts.map +1 -0
- package/dist/demod/scheme-wbfm.js +106 -0
- package/dist/demod/scheme-wbfm.js.map +1 -0
- package/dist/demod/scheme.d.ts +78 -0
- package/dist/demod/scheme.d.ts.map +1 -0
- package/dist/demod/scheme.js +96 -0
- package/dist/demod/scheme.js.map +1 -0
- package/dist/demod/spectrum.d.ts +18 -0
- package/dist/demod/spectrum.d.ts.map +1 -0
- package/dist/demod/spectrum.js +76 -0
- package/dist/demod/spectrum.js.map +1 -0
- package/dist/dsp/buffers.d.ts +72 -0
- package/dist/dsp/buffers.d.ts.map +1 -0
- package/dist/dsp/buffers.js +109 -0
- package/dist/dsp/buffers.js.map +1 -0
- package/dist/dsp/coefficients.d.ts +22 -0
- package/dist/dsp/coefficients.d.ts.map +1 -0
- package/dist/dsp/coefficients.js +77 -0
- package/dist/dsp/coefficients.js.map +1 -0
- package/dist/dsp/converters.d.ts +15 -0
- package/dist/dsp/converters.d.ts.map +1 -0
- package/dist/dsp/converters.js +43 -0
- package/dist/dsp/converters.js.map +1 -0
- package/dist/dsp/demodulators.d.ts +72 -0
- package/dist/dsp/demodulators.d.ts.map +1 -0
- package/dist/dsp/demodulators.js +245 -0
- package/dist/dsp/demodulators.js.map +1 -0
- package/dist/dsp/fft.d.ts +53 -0
- package/dist/dsp/fft.d.ts.map +1 -0
- package/dist/dsp/fft.js +175 -0
- package/dist/dsp/fft.js.map +1 -0
- package/dist/dsp/filters.d.ts +91 -0
- package/dist/dsp/filters.d.ts.map +1 -0
- package/dist/dsp/filters.js +250 -0
- package/dist/dsp/filters.js.map +1 -0
- package/dist/dsp/power.d.ts +2 -0
- package/dist/dsp/power.d.ts.map +1 -0
- package/dist/dsp/power.js +10 -0
- package/dist/dsp/power.js.map +1 -0
- package/dist/dsp/resamplers.d.ts +33 -0
- package/dist/dsp/resamplers.d.ts.map +1 -0
- package/dist/dsp/resamplers.js +91 -0
- package/dist/dsp/resamplers.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/radio/msgqueue.d.ts +23 -0
- package/dist/radio/msgqueue.d.ts.map +1 -0
- package/dist/radio/msgqueue.js +52 -0
- package/dist/radio/msgqueue.js.map +1 -0
- package/dist/radio/radio.d.ts +81 -0
- package/dist/radio/radio.d.ts.map +1 -0
- package/dist/radio/radio.js +305 -0
- package/dist/radio/radio.js.map +1 -0
- package/dist/radio/sample_receiver.d.ts +11 -0
- package/dist/radio/sample_receiver.d.ts.map +1 -0
- package/dist/radio/sample_receiver.js +49 -0
- package/dist/radio/sample_receiver.js.map +1 -0
- package/dist/rtlsdr/r820t.d.ts +18 -0
- package/dist/rtlsdr/r820t.d.ts.map +1 -0
- package/dist/rtlsdr/r820t.js +39 -0
- package/dist/rtlsdr/r820t.js.map +1 -0
- package/dist/rtlsdr/r828d.d.ts +28 -0
- package/dist/rtlsdr/r828d.d.ts.map +1 -0
- package/dist/rtlsdr/r828d.js +120 -0
- package/dist/rtlsdr/r828d.js.map +1 -0
- package/dist/rtlsdr/r8xx.d.ts +90 -0
- package/dist/rtlsdr/r8xx.d.ts.map +1 -0
- package/dist/rtlsdr/r8xx.js +468 -0
- package/dist/rtlsdr/r8xx.js.map +1 -0
- package/dist/rtlsdr/rtl2832u.d.ts +74 -0
- package/dist/rtlsdr/rtl2832u.d.ts.map +1 -0
- package/dist/rtlsdr/rtl2832u.js +342 -0
- package/dist/rtlsdr/rtl2832u.js.map +1 -0
- package/dist/rtlsdr/rtlcom.d.ts +144 -0
- package/dist/rtlsdr/rtlcom.d.ts.map +1 -0
- package/dist/rtlsdr/rtlcom.js +299 -0
- package/dist/rtlsdr/rtlcom.js.map +1 -0
- package/dist/rtlsdr/rtldevice.d.ts +53 -0
- package/dist/rtlsdr/rtldevice.d.ts.map +1 -0
- package/dist/rtlsdr/rtldevice.js +24 -0
- package/dist/rtlsdr/rtldevice.js.map +1 -0
- package/dist/rtlsdr/tuner.d.ts +20 -0
- package/dist/rtlsdr/tuner.d.ts.map +1 -0
- package/dist/rtlsdr/tuner.js +15 -0
- package/dist/rtlsdr/tuner.js.map +1 -0
- package/package.json +20 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// Copyright 2013 Google Inc. All rights reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
import { makeLowPassKernel } from "../dsp/coefficients";
|
|
15
|
+
import { FMDemodulator, StereoSeparator } from "../dsp/demodulators";
|
|
16
|
+
import { FrequencyShifter, Deemphasizer, FIRFilter } from "../dsp/filters";
|
|
17
|
+
import { getPower } from "../dsp/power";
|
|
18
|
+
import { ComplexDownsampler, RealDownsampler } from "../dsp/resamplers";
|
|
19
|
+
/** A demodulator for wideband FM signals. */
|
|
20
|
+
export class SchemeWBFM {
|
|
21
|
+
mode;
|
|
22
|
+
/**
|
|
23
|
+
* @param inRate The sample rate of the input samples.
|
|
24
|
+
* @param outRate The sample rate of the output audio.
|
|
25
|
+
* @param stereo Whether to try to demodulate a stereo signal, if present.
|
|
26
|
+
*/
|
|
27
|
+
constructor(inRate, outRate, mode) {
|
|
28
|
+
this.mode = mode;
|
|
29
|
+
const maxF = 75000;
|
|
30
|
+
const pilotF = 19000;
|
|
31
|
+
const deemphTc = 50;
|
|
32
|
+
this.interRate = Math.min(inRate, 336000);
|
|
33
|
+
this.shifter = new FrequencyShifter(inRate);
|
|
34
|
+
if (this.interRate != inRate) {
|
|
35
|
+
this.downsampler = new ComplexDownsampler(inRate, this.interRate, 151);
|
|
36
|
+
}
|
|
37
|
+
const kernel = makeLowPassKernel(this.interRate, maxF, 151);
|
|
38
|
+
this.filterI = new FIRFilter(kernel);
|
|
39
|
+
this.filterQ = new FIRFilter(kernel);
|
|
40
|
+
this.demodulator = new FMDemodulator(maxF / this.interRate);
|
|
41
|
+
this.monoSampler = new RealDownsampler(this.interRate, outRate, 41);
|
|
42
|
+
this.stereoSampler = new RealDownsampler(this.interRate, outRate, 41);
|
|
43
|
+
this.stereoSeparator = new StereoSeparator(this.interRate, pilotF);
|
|
44
|
+
this.leftDeemph = new Deemphasizer(outRate, deemphTc);
|
|
45
|
+
this.rightDeemph = new Deemphasizer(outRate, deemphTc);
|
|
46
|
+
}
|
|
47
|
+
interRate;
|
|
48
|
+
shifter;
|
|
49
|
+
downsampler;
|
|
50
|
+
filterI;
|
|
51
|
+
filterQ;
|
|
52
|
+
demodulator;
|
|
53
|
+
monoSampler;
|
|
54
|
+
stereoSampler;
|
|
55
|
+
stereoSeparator;
|
|
56
|
+
leftDeemph;
|
|
57
|
+
rightDeemph;
|
|
58
|
+
getMode() {
|
|
59
|
+
return this.mode;
|
|
60
|
+
}
|
|
61
|
+
setMode(mode) {
|
|
62
|
+
this.mode = mode;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Demodulates the signal.
|
|
66
|
+
* @param samplesI The I components of the samples.
|
|
67
|
+
* @param samplesQ The Q components of the samples.
|
|
68
|
+
* @param freqOffset The offset of the signal in the samples.
|
|
69
|
+
* @param inStereo Whether to try decoding the stereo signal.
|
|
70
|
+
* @returns The demodulated audio signal.
|
|
71
|
+
*/
|
|
72
|
+
demodulate(samplesI, samplesQ, freqOffset) {
|
|
73
|
+
this.shifter.inPlace(samplesI, samplesQ, -freqOffset);
|
|
74
|
+
let [I, Q] = this.downsampler
|
|
75
|
+
? this.downsampler.downsample(samplesI, samplesQ)
|
|
76
|
+
: [samplesI, samplesQ];
|
|
77
|
+
let allPower = getPower(I, Q);
|
|
78
|
+
this.filterI.inPlace(I);
|
|
79
|
+
this.filterQ.inPlace(Q);
|
|
80
|
+
let signalPower = (getPower(I, Q) * this.interRate) / 150000;
|
|
81
|
+
this.demodulator.demodulate(I, Q, I);
|
|
82
|
+
const leftAudio = this.monoSampler.downsample(I);
|
|
83
|
+
const rightAudio = new Float32Array(leftAudio);
|
|
84
|
+
let stereoOut = false;
|
|
85
|
+
if (this.mode.stereo) {
|
|
86
|
+
const stereo = this.stereoSeparator.separate(I);
|
|
87
|
+
if (stereo.found) {
|
|
88
|
+
stereoOut = true;
|
|
89
|
+
const diffAudio = this.stereoSampler.downsample(stereo.diff);
|
|
90
|
+
for (let i = 0; i < diffAudio.length; ++i) {
|
|
91
|
+
rightAudio[i] -= diffAudio[i];
|
|
92
|
+
leftAudio[i] += diffAudio[i];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
this.leftDeemph.inPlace(leftAudio);
|
|
97
|
+
this.rightDeemph.inPlace(rightAudio);
|
|
98
|
+
return {
|
|
99
|
+
left: leftAudio,
|
|
100
|
+
right: rightAudio,
|
|
101
|
+
stereo: stereoOut,
|
|
102
|
+
snr: signalPower / allPower,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=scheme-wbfm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-wbfm.js","sourceRoot":"","sources":["../../src/demod/scheme-wbfm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/** Interface for classes that demodulate IQ radio streams. */
|
|
2
|
+
export interface ModulationScheme {
|
|
3
|
+
/** Returns the current mode parameters. */
|
|
4
|
+
getMode(): Mode;
|
|
5
|
+
/** Changes the mode parameters for the current scheme. */
|
|
6
|
+
setMode(mode: Mode): void;
|
|
7
|
+
/**
|
|
8
|
+
* Demodulates the signal.
|
|
9
|
+
* @param samplesI The I components of the samples.
|
|
10
|
+
* @param samplesQ The Q components of the samples.
|
|
11
|
+
* @param freqOffset The offset of the signal in the samples.
|
|
12
|
+
* @returns The demodulated audio signal.
|
|
13
|
+
*/
|
|
14
|
+
demodulate(I: Float32Array, Q: Float32Array, freqOffset: number): Demodulated;
|
|
15
|
+
}
|
|
16
|
+
/** Demodulator output. */
|
|
17
|
+
export type Demodulated = {
|
|
18
|
+
/** Left speaker. */
|
|
19
|
+
left: Float32Array;
|
|
20
|
+
/** Right speaker. */
|
|
21
|
+
right: Float32Array;
|
|
22
|
+
/** The signal is in stereo. */
|
|
23
|
+
stereo: boolean;
|
|
24
|
+
/** Estimated signal to noise ratio (in units, not dB). */
|
|
25
|
+
snr: number;
|
|
26
|
+
};
|
|
27
|
+
/** Modulation parameters. */
|
|
28
|
+
export type Mode =
|
|
29
|
+
/** Wideband frequency modulation. */
|
|
30
|
+
{
|
|
31
|
+
scheme: "WBFM";
|
|
32
|
+
stereo: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Narrowband frequency modulation. */
|
|
35
|
+
| {
|
|
36
|
+
scheme: "NBFM";
|
|
37
|
+
maxF: number;
|
|
38
|
+
squelch: number;
|
|
39
|
+
}
|
|
40
|
+
/** Amplitude modulation. */
|
|
41
|
+
| {
|
|
42
|
+
scheme: "AM";
|
|
43
|
+
bandwidth: number;
|
|
44
|
+
squelch: number;
|
|
45
|
+
}
|
|
46
|
+
/** Upper sideband modulation. */
|
|
47
|
+
| {
|
|
48
|
+
scheme: "USB";
|
|
49
|
+
bandwidth: number;
|
|
50
|
+
squelch: number;
|
|
51
|
+
}
|
|
52
|
+
/** Lower sideband modulation. */
|
|
53
|
+
| {
|
|
54
|
+
scheme: "LSB";
|
|
55
|
+
bandwidth: number;
|
|
56
|
+
squelch: number;
|
|
57
|
+
}
|
|
58
|
+
/** Continuous wave. */
|
|
59
|
+
| {
|
|
60
|
+
scheme: "CW";
|
|
61
|
+
bandwidth: number;
|
|
62
|
+
};
|
|
63
|
+
/** String representing one of the known schemes. */
|
|
64
|
+
export type Scheme = Mode["scheme"];
|
|
65
|
+
/** Returns the list of known schemes. */
|
|
66
|
+
export declare function getSchemes(): Array<Scheme>;
|
|
67
|
+
/** Returns the default mode for the given scheme. */
|
|
68
|
+
export declare function getMode(scheme: Scheme): Mode;
|
|
69
|
+
export declare function hasStereo(mode: Mode | Scheme): boolean;
|
|
70
|
+
export declare function getStereo(mode: Mode): boolean;
|
|
71
|
+
export declare function withStereo(stereo: boolean, mode: Mode): Mode;
|
|
72
|
+
export declare function hasBandwidth(mode: Mode | Scheme): boolean;
|
|
73
|
+
export declare function getBandwidth(mode: Mode): number;
|
|
74
|
+
export declare function withBandwidth(bandwidth: number, mode: Mode): Mode;
|
|
75
|
+
export declare function hasSquelch(mode: Mode | Scheme): boolean;
|
|
76
|
+
export declare function getSquelch(mode: Mode): number;
|
|
77
|
+
export declare function withSquelch(squelch: number, mode: Mode): Mode;
|
|
78
|
+
//# sourceMappingURL=scheme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme.d.ts","sourceRoot":"","sources":["../../src/demod/scheme.ts"],"names":[],"mappings":"AAcA,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,OAAO,IAAI,IAAI,CAAC;IAChB,0DAA0D;IAC1D,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B;;;;;;OAMG;IACH,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAAC;CAC/E;AAED,0BAA0B;AAC1B,MAAM,MAAM,WAAW,GAAG;IACxB,oBAAoB;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,qBAAqB;IACrB,KAAK,EAAE,YAAY,CAAC;IACpB,+BAA+B;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,6BAA6B;AAC7B,MAAM,MAAM,IAAI;AACd,qCAAqC;AACnC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE;AACrC,uCAAuC;GACrC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACnD,4BAA4B;GAC1B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACtD,iCAAiC;GAC/B;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACvD,iCAAiC;GAC/B;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACvD,uBAAuB;GACrB;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,oDAAoD;AACpD,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;AAEpC,yCAAyC;AACzC,wBAAgB,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC,CAE1C;AAED,qDAAqD;AACrD,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAe5C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,WAE5C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,WAEnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAI5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,WAE/C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,UAStC;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAoBjE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,WAG7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAG7C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAK7D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Copyright 2024 Jacobo Tarrio Barreiro. All rights reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
/** Returns the list of known schemes. */
|
|
15
|
+
export function getSchemes() {
|
|
16
|
+
return ["WBFM", "NBFM", "AM", "USB", "LSB", "CW"];
|
|
17
|
+
}
|
|
18
|
+
/** Returns the default mode for the given scheme. */
|
|
19
|
+
export function getMode(scheme) {
|
|
20
|
+
switch (scheme) {
|
|
21
|
+
case "WBFM":
|
|
22
|
+
return { scheme: "WBFM", stereo: true };
|
|
23
|
+
case "NBFM":
|
|
24
|
+
return { scheme: "NBFM", maxF: 5000, squelch: 0 };
|
|
25
|
+
case "AM":
|
|
26
|
+
return { scheme: "AM", bandwidth: 15000, squelch: 0 };
|
|
27
|
+
case "USB":
|
|
28
|
+
return { scheme: "USB", bandwidth: 2800, squelch: 0 };
|
|
29
|
+
case "LSB":
|
|
30
|
+
return { scheme: "LSB", bandwidth: 2800, squelch: 0 };
|
|
31
|
+
case "CW":
|
|
32
|
+
return { scheme: "CW", bandwidth: 50 };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function hasStereo(mode) {
|
|
36
|
+
return (typeof mode === "string" ? mode : mode.scheme) == "WBFM";
|
|
37
|
+
}
|
|
38
|
+
export function getStereo(mode) {
|
|
39
|
+
return mode.scheme == "WBFM" && mode.stereo;
|
|
40
|
+
}
|
|
41
|
+
export function withStereo(stereo, mode) {
|
|
42
|
+
mode = { ...mode };
|
|
43
|
+
if (mode.scheme == "WBFM")
|
|
44
|
+
mode.stereo = stereo;
|
|
45
|
+
return mode;
|
|
46
|
+
}
|
|
47
|
+
export function hasBandwidth(mode) {
|
|
48
|
+
return (typeof mode === "string" ? mode : mode.scheme) != "WBFM";
|
|
49
|
+
}
|
|
50
|
+
export function getBandwidth(mode) {
|
|
51
|
+
switch (mode.scheme) {
|
|
52
|
+
case "WBFM":
|
|
53
|
+
return 150000;
|
|
54
|
+
case "NBFM":
|
|
55
|
+
return mode.maxF * 2;
|
|
56
|
+
default:
|
|
57
|
+
return mode.bandwidth;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function withBandwidth(bandwidth, mode) {
|
|
61
|
+
mode = { ...mode };
|
|
62
|
+
switch (mode.scheme) {
|
|
63
|
+
case "WBFM":
|
|
64
|
+
break;
|
|
65
|
+
case "NBFM":
|
|
66
|
+
mode.maxF = Math.max(125, Math.min(bandwidth / 2, 15000));
|
|
67
|
+
break;
|
|
68
|
+
case "AM":
|
|
69
|
+
mode.bandwidth = Math.max(250, Math.min(bandwidth, 30000));
|
|
70
|
+
break;
|
|
71
|
+
case "USB":
|
|
72
|
+
case "LSB":
|
|
73
|
+
mode.bandwidth = Math.max(10, Math.min(bandwidth, 15000));
|
|
74
|
+
break;
|
|
75
|
+
case "CW":
|
|
76
|
+
mode.bandwidth = Math.max(5, Math.min(bandwidth, 1000));
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
return mode;
|
|
80
|
+
}
|
|
81
|
+
export function hasSquelch(mode) {
|
|
82
|
+
const scheme = typeof mode === "string" ? mode : mode.scheme;
|
|
83
|
+
return scheme != "WBFM" && scheme != "CW";
|
|
84
|
+
}
|
|
85
|
+
export function getSquelch(mode) {
|
|
86
|
+
if (mode.scheme == "WBFM" || mode.scheme == "CW")
|
|
87
|
+
return 0;
|
|
88
|
+
return mode.squelch;
|
|
89
|
+
}
|
|
90
|
+
export function withSquelch(squelch, mode) {
|
|
91
|
+
mode = { ...mode };
|
|
92
|
+
if (mode.scheme != "WBFM" && mode.scheme != "CW")
|
|
93
|
+
mode.squelch = Math.max(0, Math.min(squelch, 6));
|
|
94
|
+
return mode;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=scheme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme.js","sourceRoot":"","sources":["../../src/demod/scheme.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SampleReceiver } from "../radio/sample_receiver";
|
|
2
|
+
export declare class Spectrum implements SampleReceiver {
|
|
3
|
+
constructor(fftSize?: number);
|
|
4
|
+
private I;
|
|
5
|
+
private Q;
|
|
6
|
+
private lastFrequency;
|
|
7
|
+
private fft;
|
|
8
|
+
private lastOutput;
|
|
9
|
+
private dirty;
|
|
10
|
+
set size(newSize: number);
|
|
11
|
+
get size(): number;
|
|
12
|
+
setSampleRate(_: number): void;
|
|
13
|
+
receiveSamples(I: Float32Array, Q: Float32Array, frequency: number): void;
|
|
14
|
+
andThen(next: SampleReceiver): SampleReceiver;
|
|
15
|
+
frequency(): number | undefined;
|
|
16
|
+
getSpectrum(spectrum: Float32Array): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=spectrum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spectrum.d.ts","sourceRoot":"","sources":["../../src/demod/spectrum.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAwB,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEhF,qBAAa,QAAS,YAAW,cAAc;gBACjC,OAAO,CAAC,EAAE,MAAM;IAc5B,OAAO,CAAC,CAAC,CAAoB;IAC7B,OAAO,CAAC,CAAC,CAAoB;IAC7B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,UAAU,CAAe;IACjC,OAAO,CAAC,KAAK,CAAU;IAEvB,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAKvB;IAED,IAAI,IAAI,IAPU,MAAM,CASvB;IAED,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAE9B,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAOzE,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc;IAI7C,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B,WAAW,CAAC,QAAQ,EAAE,YAAY;CAanC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Copyright 2024 Jacobo Tarrio Barreiro. All rights reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
// Continuous spectrum analyzer.
|
|
15
|
+
import { Float32RingBuffer } from "../dsp/buffers";
|
|
16
|
+
import { makeBlackmanWindow } from "../dsp/coefficients";
|
|
17
|
+
import { FFT } from "../dsp/fft";
|
|
18
|
+
import { concatenateReceivers } from "../radio/sample_receiver";
|
|
19
|
+
export class Spectrum {
|
|
20
|
+
constructor(fftSize) {
|
|
21
|
+
if (fftSize === undefined) {
|
|
22
|
+
fftSize = 2048;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
fftSize = Math.max(32, Math.min(131072, fftSize));
|
|
26
|
+
}
|
|
27
|
+
this.I = new Float32RingBuffer(131072);
|
|
28
|
+
this.Q = new Float32RingBuffer(131072);
|
|
29
|
+
this.fft = FFT.ofLength(fftSize);
|
|
30
|
+
this.fft.setWindow(makeBlackmanWindow(this.fft.length));
|
|
31
|
+
this.lastOutput = new Float32Array(this.fft.length);
|
|
32
|
+
this.dirty = true;
|
|
33
|
+
}
|
|
34
|
+
I;
|
|
35
|
+
Q;
|
|
36
|
+
lastFrequency;
|
|
37
|
+
fft;
|
|
38
|
+
lastOutput;
|
|
39
|
+
dirty;
|
|
40
|
+
set size(newSize) {
|
|
41
|
+
this.fft = FFT.ofLength(newSize);
|
|
42
|
+
this.fft.setWindow(makeBlackmanWindow(this.fft.length));
|
|
43
|
+
this.lastOutput = new Float32Array(this.fft.length);
|
|
44
|
+
this.dirty = true;
|
|
45
|
+
}
|
|
46
|
+
get size() {
|
|
47
|
+
return this.fft.length;
|
|
48
|
+
}
|
|
49
|
+
setSampleRate(_) { }
|
|
50
|
+
receiveSamples(I, Q, frequency) {
|
|
51
|
+
this.I.store(I);
|
|
52
|
+
this.Q.store(Q);
|
|
53
|
+
this.lastFrequency = frequency;
|
|
54
|
+
this.dirty = true;
|
|
55
|
+
}
|
|
56
|
+
andThen(next) {
|
|
57
|
+
return concatenateReceivers(this, next);
|
|
58
|
+
}
|
|
59
|
+
frequency() {
|
|
60
|
+
return this.lastFrequency;
|
|
61
|
+
}
|
|
62
|
+
getSpectrum(spectrum) {
|
|
63
|
+
if (this.dirty) {
|
|
64
|
+
let fft = this.fft.transformCircularBuffers(this.I, this.Q);
|
|
65
|
+
this.lastOutput.fill(-Infinity);
|
|
66
|
+
for (let i = 0; i < this.lastOutput.length; ++i) {
|
|
67
|
+
this.lastOutput[i] =
|
|
68
|
+
10 *
|
|
69
|
+
Math.log10(fft.real[i] * fft.real[i] + fft.imag[i] * fft.imag[i]);
|
|
70
|
+
}
|
|
71
|
+
this.dirty = false;
|
|
72
|
+
}
|
|
73
|
+
spectrum.set(this.lastOutput.subarray(0, spectrum.length));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=spectrum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spectrum.js","sourceRoot":"","sources":["../../src/demod/spectrum.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A source of pre-allocated arrays of a given size.
|
|
3
|
+
*/
|
|
4
|
+
declare class Buffer<T extends ArrayLike<number>> {
|
|
5
|
+
private make;
|
|
6
|
+
/**
|
|
7
|
+
* @param make A function that returns an array of the given length.
|
|
8
|
+
* @param count The number of buffers to keep around. Having more than 1 lets you modify one buffer while you use another.
|
|
9
|
+
* @param length An optional initial length for the arrays.
|
|
10
|
+
*/
|
|
11
|
+
constructor(make: (length: number) => T, count: number, length?: number);
|
|
12
|
+
private buffers;
|
|
13
|
+
private current;
|
|
14
|
+
/** Returns an array of the given size. You may need to clear it manually. */
|
|
15
|
+
get(length: number): T;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A source of pre-allocated Uint8Array buffers of a given size.
|
|
19
|
+
*/
|
|
20
|
+
export declare class U8Buffer extends Buffer<Uint8Array> {
|
|
21
|
+
/**
|
|
22
|
+
* @param count The number of buffers to keep around. Having more than 1 lets you modify one buffer while you use another.
|
|
23
|
+
* @param length An optional initial size for the buffers.
|
|
24
|
+
*/
|
|
25
|
+
constructor(count: number, length?: number);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A source of pre-allocated Float32Array buffers of a given size.
|
|
29
|
+
*/
|
|
30
|
+
export declare class Float32Buffer extends Buffer<Float32Array> {
|
|
31
|
+
/**
|
|
32
|
+
* @param count The number of buffers to keep around. Having more than 1 lets you modify one buffer while you use another.
|
|
33
|
+
* @param length An optional initial size for the buffers.
|
|
34
|
+
*/
|
|
35
|
+
constructor(count: number, length?: number);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A source of pre-allocated [Float32Array, Float32Array] buffers of a given size.
|
|
39
|
+
*/
|
|
40
|
+
export declare class IqBuffer {
|
|
41
|
+
/**
|
|
42
|
+
* @param count The number of buffers to keep around. Having more than 1 lets you modify one buffer while you use another.
|
|
43
|
+
* @param length An optional initial size for the buffers.
|
|
44
|
+
*/
|
|
45
|
+
constructor(count: number, length?: number);
|
|
46
|
+
private buffers;
|
|
47
|
+
/** Returns a pair of arrays of the given size. You may need to clear them manually. */
|
|
48
|
+
get(length: number): [Float32Array, Float32Array];
|
|
49
|
+
}
|
|
50
|
+
interface TypedArray<T> extends ArrayLike<number> {
|
|
51
|
+
set(array: ArrayLike<number>, offset?: number): void;
|
|
52
|
+
subarray(begin?: number, end?: number): T;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A ring buffer, where you can store data and then copy out the latest N values.
|
|
56
|
+
*/
|
|
57
|
+
declare class RingBuffer<T extends TypedArray<T>> {
|
|
58
|
+
private buffer;
|
|
59
|
+
constructor(buffer: T);
|
|
60
|
+
private position;
|
|
61
|
+
store(data: T): void;
|
|
62
|
+
copyTo(data: T): void;
|
|
63
|
+
private doCopy;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* A Float32 ring buffer, where you can store data and then copy out the latest N values.
|
|
67
|
+
*/
|
|
68
|
+
export declare class Float32RingBuffer extends RingBuffer<Float32Array> {
|
|
69
|
+
constructor(size: number);
|
|
70
|
+
}
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=buffers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffers.d.ts","sourceRoot":"","sources":["../../src/dsp/buffers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAM,MAAM,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC;IAOpC,OAAO,CAAC,IAAI;IANd;;;;OAIG;gBAEO,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM;IAMjB,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,OAAO,CAAS;IAExB,6EAA6E;IAC7E,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;CASvB;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,MAAM,CAAC,UAAU,CAAC;IAC9C;;;OAGG;gBACS,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAG3C;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,MAAM,CAAC,YAAY,CAAC;IACrD;;;OAGG;gBACS,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAG3C;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB;;;OAGG;gBACS,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAI1C,OAAO,CAAC,OAAO,CAAgB;IAE/B,uFAAuF;IACvF,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC;CAGlD;AAED,UAAU,UAAU,CAAC,CAAC,CAAE,SAAQ,SAAS,CAAC,MAAM,CAAC;IAC/C,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,cAAM,UAAU,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC;IAC1B,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,CAAC;IAI7B,OAAO,CAAC,QAAQ,CAAS;IAEzB,KAAK,CAAC,IAAI,EAAE,CAAC;IAMb,MAAM,CAAC,IAAI,EAAE,CAAC;IAOd,OAAO,CAAC,MAAM;CAoBf;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,YAAY,CAAC;gBACjD,IAAI,EAAE,MAAM;CAGzB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A source of pre-allocated arrays of a given size.
|
|
3
|
+
*/
|
|
4
|
+
class Buffer {
|
|
5
|
+
make;
|
|
6
|
+
/**
|
|
7
|
+
* @param make A function that returns an array of the given length.
|
|
8
|
+
* @param count The number of buffers to keep around. Having more than 1 lets you modify one buffer while you use another.
|
|
9
|
+
* @param length An optional initial length for the arrays.
|
|
10
|
+
*/
|
|
11
|
+
constructor(make, count, length) {
|
|
12
|
+
this.make = make;
|
|
13
|
+
this.buffers = [...Array(count).keys()].map(() => make(length || 0));
|
|
14
|
+
this.current = 0;
|
|
15
|
+
}
|
|
16
|
+
buffers;
|
|
17
|
+
current;
|
|
18
|
+
/** Returns an array of the given size. You may need to clear it manually. */
|
|
19
|
+
get(length) {
|
|
20
|
+
let out = this.buffers[this.current];
|
|
21
|
+
if (out.length != length) {
|
|
22
|
+
out = this.make(length);
|
|
23
|
+
this.buffers[this.current] = out;
|
|
24
|
+
}
|
|
25
|
+
this.current = (this.current + 1) % this.buffers.length;
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A source of pre-allocated Uint8Array buffers of a given size.
|
|
31
|
+
*/
|
|
32
|
+
export class U8Buffer extends Buffer {
|
|
33
|
+
/**
|
|
34
|
+
* @param count The number of buffers to keep around. Having more than 1 lets you modify one buffer while you use another.
|
|
35
|
+
* @param length An optional initial size for the buffers.
|
|
36
|
+
*/
|
|
37
|
+
constructor(count, length) {
|
|
38
|
+
super((l) => new Uint8Array(l), count, length);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A source of pre-allocated Float32Array buffers of a given size.
|
|
43
|
+
*/
|
|
44
|
+
export class Float32Buffer extends Buffer {
|
|
45
|
+
/**
|
|
46
|
+
* @param count The number of buffers to keep around. Having more than 1 lets you modify one buffer while you use another.
|
|
47
|
+
* @param length An optional initial size for the buffers.
|
|
48
|
+
*/
|
|
49
|
+
constructor(count, length) {
|
|
50
|
+
super((l) => new Float32Array(l), count, length);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A source of pre-allocated [Float32Array, Float32Array] buffers of a given size.
|
|
55
|
+
*/
|
|
56
|
+
export class IqBuffer {
|
|
57
|
+
/**
|
|
58
|
+
* @param count The number of buffers to keep around. Having more than 1 lets you modify one buffer while you use another.
|
|
59
|
+
* @param length An optional initial size for the buffers.
|
|
60
|
+
*/
|
|
61
|
+
constructor(count, length) {
|
|
62
|
+
this.buffers = new Float32Buffer(count * 2, length);
|
|
63
|
+
}
|
|
64
|
+
buffers;
|
|
65
|
+
/** Returns a pair of arrays of the given size. You may need to clear them manually. */
|
|
66
|
+
get(length) {
|
|
67
|
+
return [this.buffers.get(length), this.buffers.get(length)];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A ring buffer, where you can store data and then copy out the latest N values.
|
|
72
|
+
*/
|
|
73
|
+
class RingBuffer {
|
|
74
|
+
buffer;
|
|
75
|
+
constructor(buffer) {
|
|
76
|
+
this.buffer = buffer;
|
|
77
|
+
this.position = 0;
|
|
78
|
+
}
|
|
79
|
+
position;
|
|
80
|
+
store(data) {
|
|
81
|
+
let count = Math.min(data.length, data.length, this.buffer.length);
|
|
82
|
+
let { dstOffset } = this.doCopy(count, data, 0, this.buffer, this.position);
|
|
83
|
+
this.position = dstOffset;
|
|
84
|
+
}
|
|
85
|
+
copyTo(data) {
|
|
86
|
+
let count = Math.min(data.length, this.buffer.length, data.length);
|
|
87
|
+
let srcOffset = (this.position + this.buffer.length - count) % this.buffer.length;
|
|
88
|
+
this.doCopy(count, this.buffer, srcOffset, data, 0);
|
|
89
|
+
}
|
|
90
|
+
doCopy(count, src, srcOffset, dst, dstOffset) {
|
|
91
|
+
while (count > 0) {
|
|
92
|
+
const copyCount = Math.min(count, src.length - srcOffset, dst.length - dstOffset);
|
|
93
|
+
dst.set(src.subarray(srcOffset, srcOffset + copyCount), dstOffset);
|
|
94
|
+
srcOffset = (srcOffset + copyCount) % src.length;
|
|
95
|
+
dstOffset = (dstOffset + copyCount) % dst.length;
|
|
96
|
+
count -= copyCount;
|
|
97
|
+
}
|
|
98
|
+
return { srcOffset, dstOffset };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* A Float32 ring buffer, where you can store data and then copy out the latest N values.
|
|
103
|
+
*/
|
|
104
|
+
export class Float32RingBuffer extends RingBuffer {
|
|
105
|
+
constructor(size) {
|
|
106
|
+
super(new Float32Array(size));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=buffers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffers.js","sourceRoot":"","sources":["../../src/dsp/buffers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates coefficients for a FIR low-pass filter with the given
|
|
3
|
+
* corner frequency and kernel length at the given sample rate.
|
|
4
|
+
* @param sampleRate The signal's sample rate.
|
|
5
|
+
* @param cornerFreq The -3dB frequency in Hz.
|
|
6
|
+
* @param length The filter kernel's length. Should be an odd number.
|
|
7
|
+
* @returns The FIR coefficients for the filter.
|
|
8
|
+
*/
|
|
9
|
+
export declare function makeLowPassKernel(sampleRate: number, cornerFreq: number, length: number): Float32Array;
|
|
10
|
+
/**
|
|
11
|
+
* Returns coefficients for a Hilbert transform.
|
|
12
|
+
* @param length The length of the kernel.
|
|
13
|
+
* @returns The kernel coefficients.
|
|
14
|
+
*/
|
|
15
|
+
export declare function makeHilbertKernel(length: number): Float32Array;
|
|
16
|
+
/**
|
|
17
|
+
* Returns coefficients for a Blackman window.
|
|
18
|
+
* @param length The length of the kernel.
|
|
19
|
+
* @returns The kernel coefficients.
|
|
20
|
+
*/
|
|
21
|
+
export declare function makeBlackmanWindow(length: number): Float32Array;
|
|
22
|
+
//# sourceMappingURL=coefficients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coefficients.d.ts","sourceRoot":"","sources":["../../src/dsp/coefficients.ts"],"names":[],"mappings":"AAeA;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,YAAY,CAqBd;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAU9D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAS/D"}
|