@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,43 @@
|
|
|
1
|
+
import { concatenateReceivers } from "../radio/sample_receiver";
|
|
2
|
+
export class SampleClickEvent extends Event {
|
|
3
|
+
constructor() {
|
|
4
|
+
super("sample-click");
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class SampleCounter extends EventTarget {
|
|
8
|
+
sampleRate;
|
|
9
|
+
clicksPerSecond;
|
|
10
|
+
constructor(sampleRate, clicksPerSecond) {
|
|
11
|
+
super();
|
|
12
|
+
this.sampleRate = sampleRate;
|
|
13
|
+
this.clicksPerSecond = clicksPerSecond;
|
|
14
|
+
this.samplesPerClick = this.getSamplesPerClick();
|
|
15
|
+
this.countedSamples = 0;
|
|
16
|
+
}
|
|
17
|
+
samplesPerClick;
|
|
18
|
+
countedSamples;
|
|
19
|
+
getSamplesPerClick() {
|
|
20
|
+
return this.clicksPerSecond === undefined
|
|
21
|
+
? undefined
|
|
22
|
+
: Math.floor(this.sampleRate / this.clicksPerSecond);
|
|
23
|
+
}
|
|
24
|
+
setSampleRate(sampleRate) {
|
|
25
|
+
this.sampleRate = sampleRate;
|
|
26
|
+
this.samplesPerClick = this.getSamplesPerClick();
|
|
27
|
+
}
|
|
28
|
+
receiveSamples(I, Q) {
|
|
29
|
+
this.countedSamples += I.length;
|
|
30
|
+
if (this.samplesPerClick === undefined ||
|
|
31
|
+
this.samplesPerClick > this.countedSamples)
|
|
32
|
+
return;
|
|
33
|
+
this.countedSamples %= this.samplesPerClick;
|
|
34
|
+
this.dispatchEvent(new SampleClickEvent());
|
|
35
|
+
}
|
|
36
|
+
andThen(next) {
|
|
37
|
+
return concatenateReceivers(this, next);
|
|
38
|
+
}
|
|
39
|
+
addEventListener(type, callback, options) {
|
|
40
|
+
super.addEventListener(type, callback, options);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=sample-counter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sample-counter.js","sourceRoot":"","sources":["../../src/demod/sample-counter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAkB,MAAM,0BAA0B,CAAC;AAEhF,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;QACE,KAAK,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,WAAW;IAElC;IACA;IAFV,YACU,UAAkB,EAClB,eAAwB;QAEhC,KAAK,EAAE,CAAC;QAHA,eAAU,GAAV,UAAU,CAAQ;QAClB,oBAAe,GAAf,eAAe,CAAS;QAGhC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACjD,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IAC1B,CAAC;IAEO,eAAe,CAAU;IACzB,cAAc,CAAS;IAEvB,kBAAkB;QACxB,OAAO,IAAI,CAAC,eAAe,KAAK,SAAS;YACvC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IACzD,CAAC;IAED,aAAa,CAAC,UAAkB;QAC9B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACnD,CAAC;IAED,cAAc,CAAC,CAAe,EAAE,CAAe;QAC7C,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,MAAM,CAAC;QAChC,IACE,IAAI,CAAC,eAAe,KAAK,SAAS;YAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc;YAE1C,OAAO;QACT,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,IAAoB;QAC1B,OAAO,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAYD,gBAAgB,CACd,IAAY,EACZ,QAAa,EACb,OAAuD;QAEvD,KAAK,CAAC,gBAAgB,CACpB,IAAI,EACJ,QAAqD,EACrD,OAAO,CACR,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Demodulated, Mode, ModulationScheme } from "./scheme";
|
|
2
|
+
/** A demodulator for amplitude modulated signals. */
|
|
3
|
+
export declare class SchemeAM implements ModulationScheme {
|
|
4
|
+
private outRate;
|
|
5
|
+
private mode;
|
|
6
|
+
/**
|
|
7
|
+
* @param inRate The sample rate of the input samples.
|
|
8
|
+
* @param outRate The sample rate of the output audio.
|
|
9
|
+
* @param bandwidth The bandwidth of the input signal.
|
|
10
|
+
*/
|
|
11
|
+
constructor(inRate: number, outRate: number, mode: Mode & {
|
|
12
|
+
scheme: "AM";
|
|
13
|
+
});
|
|
14
|
+
private shifter;
|
|
15
|
+
private downsampler;
|
|
16
|
+
private filterI;
|
|
17
|
+
private filterQ;
|
|
18
|
+
private demodulator;
|
|
19
|
+
getMode(): Mode;
|
|
20
|
+
setMode(mode: Mode & {
|
|
21
|
+
scheme: "AM";
|
|
22
|
+
}): void;
|
|
23
|
+
/**
|
|
24
|
+
* Demodulates the signal.
|
|
25
|
+
* @param samplesI The I components of the samples.
|
|
26
|
+
* @param samplesQ The Q components of the samples.
|
|
27
|
+
* @param freqOffset The offset of the signal in the samples.
|
|
28
|
+
* @returns The demodulated audio signal.
|
|
29
|
+
*/
|
|
30
|
+
demodulate(samplesI: Float32Array, samplesQ: Float32Array, freqOffset: number): Demodulated;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=scheme-am.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-am.d.ts","sourceRoot":"","sources":["../../src/demod/scheme-am.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE/D,qDAAqD;AACrD,qBAAa,QAAS,YAAW,gBAAgB;IAQ7C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IARd;;;;OAIG;gBAED,MAAM,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,IAAI,CAAA;KAAE;IAUvC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAgB;IAEnC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,IAAI,CAAA;KAAE;IAOrC;;;;;;OAMG;IACH,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,WAAW;CAef"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Copyright 2014 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 { AMDemodulator } from "../dsp/demodulators";
|
|
16
|
+
import { FrequencyShifter, FIRFilter } from "../dsp/filters";
|
|
17
|
+
import { getPower } from "../dsp/power";
|
|
18
|
+
import { ComplexDownsampler } from "../dsp/resamplers";
|
|
19
|
+
/** A demodulator for amplitude modulated signals. */
|
|
20
|
+
export class SchemeAM {
|
|
21
|
+
outRate;
|
|
22
|
+
mode;
|
|
23
|
+
/**
|
|
24
|
+
* @param inRate The sample rate of the input samples.
|
|
25
|
+
* @param outRate The sample rate of the output audio.
|
|
26
|
+
* @param bandwidth The bandwidth of the input signal.
|
|
27
|
+
*/
|
|
28
|
+
constructor(inRate, outRate, mode) {
|
|
29
|
+
this.outRate = outRate;
|
|
30
|
+
this.mode = mode;
|
|
31
|
+
this.shifter = new FrequencyShifter(inRate);
|
|
32
|
+
this.downsampler = new ComplexDownsampler(inRate, outRate, 151);
|
|
33
|
+
const kernel = makeLowPassKernel(outRate, this.mode.bandwidth / 2, 151);
|
|
34
|
+
this.filterI = new FIRFilter(kernel);
|
|
35
|
+
this.filterQ = new FIRFilter(kernel);
|
|
36
|
+
this.demodulator = new AMDemodulator(outRate);
|
|
37
|
+
}
|
|
38
|
+
shifter;
|
|
39
|
+
downsampler;
|
|
40
|
+
filterI;
|
|
41
|
+
filterQ;
|
|
42
|
+
demodulator;
|
|
43
|
+
getMode() {
|
|
44
|
+
return this.mode;
|
|
45
|
+
}
|
|
46
|
+
setMode(mode) {
|
|
47
|
+
this.mode = mode;
|
|
48
|
+
const kernel = makeLowPassKernel(this.outRate, mode.bandwidth / 2, 151);
|
|
49
|
+
this.filterI.setCoefficients(kernel);
|
|
50
|
+
this.filterQ.setCoefficients(kernel);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Demodulates the signal.
|
|
54
|
+
* @param samplesI The I components of the samples.
|
|
55
|
+
* @param samplesQ The Q components of the samples.
|
|
56
|
+
* @param freqOffset The offset of the signal in the samples.
|
|
57
|
+
* @returns The demodulated audio signal.
|
|
58
|
+
*/
|
|
59
|
+
demodulate(samplesI, samplesQ, freqOffset) {
|
|
60
|
+
this.shifter.inPlace(samplesI, samplesQ, -freqOffset);
|
|
61
|
+
const [I, Q] = this.downsampler.downsample(samplesI, samplesQ);
|
|
62
|
+
let allPower = getPower(I, Q);
|
|
63
|
+
this.filterI.inPlace(I);
|
|
64
|
+
this.filterQ.inPlace(Q);
|
|
65
|
+
let signalPower = (getPower(I, Q) * this.outRate) / this.mode.bandwidth;
|
|
66
|
+
this.demodulator.demodulate(I, Q, I);
|
|
67
|
+
return {
|
|
68
|
+
left: I,
|
|
69
|
+
right: new Float32Array(I),
|
|
70
|
+
stereo: false,
|
|
71
|
+
snr: signalPower / allPower,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=scheme-am.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-am.js","sourceRoot":"","sources":["../../src/demod/scheme-am.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Demodulated, Mode, ModulationScheme } from "./scheme";
|
|
2
|
+
/** A demodulator for continuous wave signals. */
|
|
3
|
+
export declare class SchemeCW implements ModulationScheme {
|
|
4
|
+
private outRate;
|
|
5
|
+
private mode;
|
|
6
|
+
constructor(inRate: number, outRate: number, mode: Mode & {
|
|
7
|
+
scheme: "CW";
|
|
8
|
+
});
|
|
9
|
+
private shifter;
|
|
10
|
+
private downsampler;
|
|
11
|
+
private filterI;
|
|
12
|
+
private filterQ;
|
|
13
|
+
private toneShifter;
|
|
14
|
+
private agc;
|
|
15
|
+
getMode(): Mode;
|
|
16
|
+
setMode(mode: Mode & {
|
|
17
|
+
scheme: "CW";
|
|
18
|
+
}): void;
|
|
19
|
+
/** Demodulates the given I/Q samples into the real output. */
|
|
20
|
+
demodulate(samplesI: Float32Array, samplesQ: Float32Array, freqOffset: number): Demodulated;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=scheme-cw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-cw.d.ts","sourceRoot":"","sources":["../../src/demod/scheme-cw.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAK/D,iDAAiD;AACjD,qBAAa,QAAS,YAAW,gBAAgB;IAG7C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;gBAFZ,MAAM,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,IAAI,CAAA;KAAE;IAWvC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,IAAI,CAAA;KAAE;IAOrC,8DAA8D;IAC9D,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,WAAW;CAgBf"}
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
import { makeLowPassKernel } from "../dsp/coefficients";
|
|
15
|
+
import { AGC, FIRFilter, FrequencyShifter } from "../dsp/filters";
|
|
16
|
+
import { getPower } from "../dsp/power";
|
|
17
|
+
import { ComplexDownsampler } from "../dsp/resamplers";
|
|
18
|
+
/** Output frequency of the zero-beat CW signals. */
|
|
19
|
+
const ToneFrequency = 600;
|
|
20
|
+
/** A demodulator for continuous wave signals. */
|
|
21
|
+
export class SchemeCW {
|
|
22
|
+
outRate;
|
|
23
|
+
mode;
|
|
24
|
+
constructor(inRate, outRate, mode) {
|
|
25
|
+
this.outRate = outRate;
|
|
26
|
+
this.mode = mode;
|
|
27
|
+
this.shifter = new FrequencyShifter(inRate);
|
|
28
|
+
this.downsampler = new ComplexDownsampler(inRate, outRate, 151);
|
|
29
|
+
const kernel = makeLowPassKernel(outRate, mode.bandwidth / 2, 351);
|
|
30
|
+
this.filterI = new FIRFilter(kernel);
|
|
31
|
+
this.filterQ = new FIRFilter(kernel);
|
|
32
|
+
this.toneShifter = new FrequencyShifter(outRate);
|
|
33
|
+
this.agc = new AGC(outRate, 10);
|
|
34
|
+
}
|
|
35
|
+
shifter;
|
|
36
|
+
downsampler;
|
|
37
|
+
filterI;
|
|
38
|
+
filterQ;
|
|
39
|
+
toneShifter;
|
|
40
|
+
agc;
|
|
41
|
+
getMode() {
|
|
42
|
+
return this.mode;
|
|
43
|
+
}
|
|
44
|
+
setMode(mode) {
|
|
45
|
+
this.mode = mode;
|
|
46
|
+
const kernel = makeLowPassKernel(this.outRate, mode.bandwidth / 2, 151);
|
|
47
|
+
this.filterI.setCoefficients(kernel);
|
|
48
|
+
this.filterQ.setCoefficients(kernel);
|
|
49
|
+
}
|
|
50
|
+
/** Demodulates the given I/Q samples into the real output. */
|
|
51
|
+
demodulate(samplesI, samplesQ, freqOffset) {
|
|
52
|
+
this.shifter.inPlace(samplesI, samplesQ, -freqOffset);
|
|
53
|
+
const [I, Q] = this.downsampler.downsample(samplesI, samplesQ);
|
|
54
|
+
let allPower = getPower(I, Q);
|
|
55
|
+
this.filterI.inPlace(I);
|
|
56
|
+
this.filterQ.inPlace(Q);
|
|
57
|
+
let signalPower = (getPower(I, Q) * this.outRate) / this.mode.bandwidth;
|
|
58
|
+
this.toneShifter.inPlace(I, Q, ToneFrequency);
|
|
59
|
+
this.agc.inPlace(I);
|
|
60
|
+
return {
|
|
61
|
+
left: I,
|
|
62
|
+
right: new Float32Array(I),
|
|
63
|
+
stereo: false,
|
|
64
|
+
snr: signalPower / allPower,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=scheme-cw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-cw.js","sourceRoot":"","sources":["../../src/demod/scheme-cw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Demodulated, Mode, ModulationScheme } from "./scheme";
|
|
2
|
+
/** A demodulator for narrowband FM signals. */
|
|
3
|
+
export declare class SchemeNBFM implements ModulationScheme {
|
|
4
|
+
private outRate;
|
|
5
|
+
private mode;
|
|
6
|
+
/**
|
|
7
|
+
* @param inRate The sample rate of the input samples.
|
|
8
|
+
* @param outRate The sample rate of the output audio.
|
|
9
|
+
* @param maxF The frequency shift for maximum amplitude.
|
|
10
|
+
*/
|
|
11
|
+
constructor(inRate: number, outRate: number, mode: Mode & {
|
|
12
|
+
scheme: "NBFM";
|
|
13
|
+
});
|
|
14
|
+
private shifter;
|
|
15
|
+
private downsampler;
|
|
16
|
+
private filterI;
|
|
17
|
+
private filterQ;
|
|
18
|
+
private demodulator;
|
|
19
|
+
getMode(): Mode;
|
|
20
|
+
setMode(mode: Mode & {
|
|
21
|
+
scheme: "NBFM";
|
|
22
|
+
}): void;
|
|
23
|
+
/**
|
|
24
|
+
* Demodulates the signal.
|
|
25
|
+
* @param samplesI The I components of the samples.
|
|
26
|
+
* @param samplesQ The Q components of the samples.
|
|
27
|
+
* @param freqOffset The offset of the signal in the samples.
|
|
28
|
+
* @returns The demodulated audio signal.
|
|
29
|
+
*/
|
|
30
|
+
demodulate(samplesI: Float32Array, samplesQ: Float32Array, freqOffset: number): Demodulated;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=scheme-nbfm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-nbfm.d.ts","sourceRoot":"","sources":["../../src/demod/scheme-nbfm.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE/D,+CAA+C;AAC/C,qBAAa,UAAW,YAAW,gBAAgB;IAQ/C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IARd;;;;OAIG;gBAED,MAAM,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAUzC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAgB;IAEnC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAQvC;;;;;;OAMG;IACH,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,WAAW;CAef"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Copyright 2014 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 } from "../dsp/demodulators";
|
|
16
|
+
import { FIRFilter, FrequencyShifter } from "../dsp/filters";
|
|
17
|
+
import { getPower } from "../dsp/power";
|
|
18
|
+
import { ComplexDownsampler } from "../dsp/resamplers";
|
|
19
|
+
/** A demodulator for narrowband FM signals. */
|
|
20
|
+
export class SchemeNBFM {
|
|
21
|
+
outRate;
|
|
22
|
+
mode;
|
|
23
|
+
/**
|
|
24
|
+
* @param inRate The sample rate of the input samples.
|
|
25
|
+
* @param outRate The sample rate of the output audio.
|
|
26
|
+
* @param maxF The frequency shift for maximum amplitude.
|
|
27
|
+
*/
|
|
28
|
+
constructor(inRate, outRate, mode) {
|
|
29
|
+
this.outRate = outRate;
|
|
30
|
+
this.mode = mode;
|
|
31
|
+
this.shifter = new FrequencyShifter(inRate);
|
|
32
|
+
this.downsampler = new ComplexDownsampler(inRate, outRate, 151);
|
|
33
|
+
const kernel = makeLowPassKernel(outRate, mode.maxF, 151);
|
|
34
|
+
this.filterI = new FIRFilter(kernel);
|
|
35
|
+
this.filterQ = new FIRFilter(kernel);
|
|
36
|
+
this.demodulator = new FMDemodulator(mode.maxF / outRate);
|
|
37
|
+
}
|
|
38
|
+
shifter;
|
|
39
|
+
downsampler;
|
|
40
|
+
filterI;
|
|
41
|
+
filterQ;
|
|
42
|
+
demodulator;
|
|
43
|
+
getMode() {
|
|
44
|
+
return this.mode;
|
|
45
|
+
}
|
|
46
|
+
setMode(mode) {
|
|
47
|
+
this.mode = mode;
|
|
48
|
+
const kernel = makeLowPassKernel(this.outRate, mode.maxF, 151);
|
|
49
|
+
this.filterI.setCoefficients(kernel);
|
|
50
|
+
this.filterQ.setCoefficients(kernel);
|
|
51
|
+
this.demodulator.setMaxDeviation(mode.maxF / this.outRate);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Demodulates the signal.
|
|
55
|
+
* @param samplesI The I components of the samples.
|
|
56
|
+
* @param samplesQ The Q components of the samples.
|
|
57
|
+
* @param freqOffset The offset of the signal in the samples.
|
|
58
|
+
* @returns The demodulated audio signal.
|
|
59
|
+
*/
|
|
60
|
+
demodulate(samplesI, samplesQ, freqOffset) {
|
|
61
|
+
this.shifter.inPlace(samplesI, samplesQ, -freqOffset);
|
|
62
|
+
const [I, Q] = this.downsampler.downsample(samplesI, samplesQ);
|
|
63
|
+
let allPower = getPower(I, Q);
|
|
64
|
+
this.filterI.inPlace(I);
|
|
65
|
+
this.filterQ.inPlace(Q);
|
|
66
|
+
let signalPower = (getPower(I, Q) * this.outRate) / (this.mode.maxF * 2);
|
|
67
|
+
this.demodulator.demodulate(I, Q, I);
|
|
68
|
+
return {
|
|
69
|
+
left: I,
|
|
70
|
+
right: new Float32Array(I),
|
|
71
|
+
stereo: false,
|
|
72
|
+
snr: signalPower / allPower,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=scheme-nbfm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-nbfm.js","sourceRoot":"","sources":["../../src/demod/scheme-nbfm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Demodulated, Mode, ModulationScheme } from "./scheme";
|
|
2
|
+
/** A demodulator for single-sideband modulated signals. */
|
|
3
|
+
export declare class SchemeSSB implements ModulationScheme {
|
|
4
|
+
private outRate;
|
|
5
|
+
private mode;
|
|
6
|
+
/**
|
|
7
|
+
* @param inRate The sample rate of the input samples.
|
|
8
|
+
* @param outRate The sample rate of the output audio.
|
|
9
|
+
* @param bandwidth The bandwidth of the input signal.
|
|
10
|
+
* @param upper Whether to demodulate the upper sideband (lower otherwise).
|
|
11
|
+
*/
|
|
12
|
+
constructor(inRate: number, outRate: number, mode: Mode & {
|
|
13
|
+
scheme: "USB" | "LSB";
|
|
14
|
+
});
|
|
15
|
+
private shifter;
|
|
16
|
+
private downsampler;
|
|
17
|
+
private filter;
|
|
18
|
+
private demodulator;
|
|
19
|
+
private agc;
|
|
20
|
+
getMode(): Mode;
|
|
21
|
+
setMode(mode: Mode & {
|
|
22
|
+
scheme: "USB" | "LSB";
|
|
23
|
+
}): void;
|
|
24
|
+
/**
|
|
25
|
+
* Demodulates the signal.
|
|
26
|
+
* @param samplesI The I components of the samples.
|
|
27
|
+
* @param samplesQ The Q components of the samples.
|
|
28
|
+
* @param freqOffset The offset of the signal in the samples.
|
|
29
|
+
* @returns The demodulated audio signal.
|
|
30
|
+
*/
|
|
31
|
+
demodulate(samplesI: Float32Array, samplesQ: Float32Array, freqOffset: number): Demodulated;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=scheme-ssb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-ssb.d.ts","sourceRoot":"","sources":["../../src/demod/scheme-ssb.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE/D,2DAA2D;AAC3D,qBAAa,SAAU,YAAW,gBAAgB;IAS9C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IATd;;;;;OAKG;gBAED,MAAM,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,KAAK,GAAG,KAAK,CAAA;KAAE;IAYhD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,KAAK,GAAG,KAAK,CAAA;KAAE;IAM9C;;;;;;OAMG;IACH,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,WAAW;CAgBf"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Copyright 2014 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 { Sideband, SSBDemodulator } from "../dsp/demodulators";
|
|
16
|
+
import { FrequencyShifter, AGC, FIRFilter } from "../dsp/filters";
|
|
17
|
+
import { getPower } from "../dsp/power";
|
|
18
|
+
import { ComplexDownsampler } from "../dsp/resamplers";
|
|
19
|
+
/** A demodulator for single-sideband modulated signals. */
|
|
20
|
+
export class SchemeSSB {
|
|
21
|
+
outRate;
|
|
22
|
+
mode;
|
|
23
|
+
/**
|
|
24
|
+
* @param inRate The sample rate of the input samples.
|
|
25
|
+
* @param outRate The sample rate of the output audio.
|
|
26
|
+
* @param bandwidth The bandwidth of the input signal.
|
|
27
|
+
* @param upper Whether to demodulate the upper sideband (lower otherwise).
|
|
28
|
+
*/
|
|
29
|
+
constructor(inRate, outRate, mode) {
|
|
30
|
+
this.outRate = outRate;
|
|
31
|
+
this.mode = mode;
|
|
32
|
+
this.shifter = new FrequencyShifter(inRate);
|
|
33
|
+
this.downsampler = new ComplexDownsampler(inRate, outRate, 151);
|
|
34
|
+
const kernel = makeLowPassKernel(this.outRate, mode.bandwidth / 2, 151);
|
|
35
|
+
this.filter = new FIRFilter(kernel);
|
|
36
|
+
this.demodulator = new SSBDemodulator(mode.scheme == "USB" ? Sideband.Upper : Sideband.Lower);
|
|
37
|
+
this.agc = new AGC(outRate, 3);
|
|
38
|
+
}
|
|
39
|
+
shifter;
|
|
40
|
+
downsampler;
|
|
41
|
+
filter;
|
|
42
|
+
demodulator;
|
|
43
|
+
agc;
|
|
44
|
+
getMode() {
|
|
45
|
+
return this.mode;
|
|
46
|
+
}
|
|
47
|
+
setMode(mode) {
|
|
48
|
+
this.mode = mode;
|
|
49
|
+
const kernel = makeLowPassKernel(this.outRate, mode.bandwidth / 2, 151);
|
|
50
|
+
this.filter.setCoefficients(kernel);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Demodulates the signal.
|
|
54
|
+
* @param samplesI The I components of the samples.
|
|
55
|
+
* @param samplesQ The Q components of the samples.
|
|
56
|
+
* @param freqOffset The offset of the signal in the samples.
|
|
57
|
+
* @returns The demodulated audio signal.
|
|
58
|
+
*/
|
|
59
|
+
demodulate(samplesI, samplesQ, freqOffset) {
|
|
60
|
+
this.shifter.inPlace(samplesI, samplesQ, -freqOffset);
|
|
61
|
+
const [I, Q] = this.downsampler.downsample(samplesI, samplesQ);
|
|
62
|
+
let allPower = getPower(I, Q);
|
|
63
|
+
this.demodulator.demodulate(I, Q, I);
|
|
64
|
+
this.filter.inPlace(I);
|
|
65
|
+
let signalPower = (getPower(I, I) * this.outRate) / (this.mode.bandwidth * 2);
|
|
66
|
+
this.agc.inPlace(I);
|
|
67
|
+
return {
|
|
68
|
+
left: I,
|
|
69
|
+
right: new Float32Array(I),
|
|
70
|
+
stereo: false,
|
|
71
|
+
snr: signalPower / allPower,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=scheme-ssb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-ssb.js","sourceRoot":"","sources":["../../src/demod/scheme-ssb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Demodulated, Mode, ModulationScheme } from "./scheme";
|
|
2
|
+
/** A demodulator for wideband FM signals. */
|
|
3
|
+
export declare class SchemeWBFM implements ModulationScheme {
|
|
4
|
+
private mode;
|
|
5
|
+
/**
|
|
6
|
+
* @param inRate The sample rate of the input samples.
|
|
7
|
+
* @param outRate The sample rate of the output audio.
|
|
8
|
+
* @param stereo Whether to try to demodulate a stereo signal, if present.
|
|
9
|
+
*/
|
|
10
|
+
constructor(inRate: number, outRate: number, mode: Mode & {
|
|
11
|
+
scheme: "WBFM";
|
|
12
|
+
});
|
|
13
|
+
private interRate;
|
|
14
|
+
private shifter;
|
|
15
|
+
private downsampler?;
|
|
16
|
+
private filterI;
|
|
17
|
+
private filterQ;
|
|
18
|
+
private demodulator;
|
|
19
|
+
private monoSampler;
|
|
20
|
+
private stereoSampler;
|
|
21
|
+
private stereoSeparator;
|
|
22
|
+
private leftDeemph;
|
|
23
|
+
private rightDeemph;
|
|
24
|
+
getMode(): Mode;
|
|
25
|
+
setMode(mode: Mode & {
|
|
26
|
+
scheme: "WBFM";
|
|
27
|
+
}): void;
|
|
28
|
+
/**
|
|
29
|
+
* Demodulates the signal.
|
|
30
|
+
* @param samplesI The I components of the samples.
|
|
31
|
+
* @param samplesQ The Q components of the samples.
|
|
32
|
+
* @param freqOffset The offset of the signal in the samples.
|
|
33
|
+
* @param inStereo Whether to try decoding the stereo signal.
|
|
34
|
+
* @returns The demodulated audio signal.
|
|
35
|
+
*/
|
|
36
|
+
demodulate(samplesI: Float32Array, samplesQ: Float32Array, freqOffset: number): Demodulated;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=scheme-wbfm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheme-wbfm.d.ts","sourceRoot":"","sources":["../../src/demod/scheme-wbfm.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE/D,6CAA6C;AAC7C,qBAAa,UAAW,YAAW,gBAAgB;IAS/C,OAAO,CAAC,IAAI;IARd;;;;OAIG;gBAED,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACP,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAqBzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAC,CAAqB;IACzC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAe;IACjC,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAIvC;;;;;;;OAOG;IACH,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,WAAW;CAmCf"}
|