@jtarrio/signals 0.9.5 → 0.9.6
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/dist/demod/demod-am.d.ts.map +1 -1
- package/dist/demod/demod-am.js +4 -2
- package/dist/demod/demod-am.js.map +1 -1
- package/dist/demod/demod-cw.d.ts.map +1 -1
- package/dist/demod/demod-cw.js +4 -2
- package/dist/demod/demod-cw.js.map +1 -1
- package/dist/demod/demod-nbfm.d.ts.map +1 -1
- package/dist/demod/demod-nbfm.js +4 -2
- package/dist/demod/demod-nbfm.js.map +1 -1
- package/dist/demod/demod-ssb.d.ts.map +1 -1
- package/dist/demod/demod-ssb.js +1 -1
- package/dist/demod/demod-ssb.js.map +1 -1
- package/dist/demod/demod-wbfm.d.ts.map +1 -1
- package/dist/demod/demod-wbfm.js +4 -2
- package/dist/demod/demod-wbfm.js.map +1 -1
- package/dist/dsp/buffers.d.ts +41 -0
- package/dist/dsp/buffers.d.ts.map +1 -1
- package/dist/dsp/buffers.js +73 -0
- package/dist/dsp/buffers.js.map +1 -1
- package/dist/dsp/coefficients.js +1 -1
- package/dist/dsp/coefficients.js.map +1 -1
- package/dist/dsp/fft.d.ts +27 -0
- package/dist/dsp/fft.d.ts.map +1 -1
- package/dist/dsp/fft.js +105 -2
- package/dist/dsp/fft.js.map +1 -1
- package/dist/dsp/filters.d.ts +39 -6
- package/dist/dsp/filters.d.ts.map +1 -1
- package/dist/dsp/filters.js +177 -23
- package/dist/dsp/filters.js.map +1 -1
- package/dist/dsp/resamplers.d.ts +0 -4
- package/dist/dsp/resamplers.d.ts.map +1 -1
- package/dist/dsp/resamplers.js +5 -2
- package/dist/dsp/resamplers.js.map +1 -1
- package/package.json +1 -1
package/dist/dsp/fft.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
|
-
import { IqPool } from "./buffers.js";
|
|
14
|
+
import { Float32Pool, IqPool } from "./buffers.js";
|
|
15
15
|
/** Fast Fourier Transform implementation. */
|
|
16
16
|
/**
|
|
17
17
|
* Returns the length of the FFT for a given array length.
|
|
@@ -193,6 +193,109 @@ function doFastTransform(length, reverse, coefs, real, imag) {
|
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
|
+
/** Fast Fourier Transform and reverse transform for real signals. */
|
|
197
|
+
export class RealFFT {
|
|
198
|
+
length;
|
|
199
|
+
static ofLength(minimumLength) {
|
|
200
|
+
return new RealFFT(actualLength(minimumLength));
|
|
201
|
+
}
|
|
202
|
+
constructor(length) {
|
|
203
|
+
this.length = length;
|
|
204
|
+
this.halfFft = FFT.ofLength(length / 2);
|
|
205
|
+
this.out = new IqPool(4, length);
|
|
206
|
+
this.outReal = new Float32Pool(4, length);
|
|
207
|
+
this.coefReal = new Float32Array(length / 2 + 1);
|
|
208
|
+
this.coefImag = new Float32Array(length / 2 + 1);
|
|
209
|
+
for (let k = 0; k <= length / 2; ++k) {
|
|
210
|
+
const angle = (-2 * Math.PI * k) / length;
|
|
211
|
+
this.coefReal[k] = Math.cos(angle);
|
|
212
|
+
this.coefImag[k] = Math.sin(angle);
|
|
213
|
+
}
|
|
214
|
+
this.copyEven = new Float32Array(length / 2);
|
|
215
|
+
this.copyOdd = new Float32Array(length / 2);
|
|
216
|
+
}
|
|
217
|
+
halfFft;
|
|
218
|
+
out;
|
|
219
|
+
outReal;
|
|
220
|
+
coefReal;
|
|
221
|
+
coefImag;
|
|
222
|
+
copyEven;
|
|
223
|
+
copyOdd;
|
|
224
|
+
/**
|
|
225
|
+
* Transforms the given real time-domain input.
|
|
226
|
+
* @param real An array of real numbers.
|
|
227
|
+
* @return The output of the transform.
|
|
228
|
+
*/
|
|
229
|
+
transform(real) {
|
|
230
|
+
const coefReal = this.coefReal;
|
|
231
|
+
const coefImag = this.coefImag;
|
|
232
|
+
const even = this.copyEven;
|
|
233
|
+
const odd = this.copyOdd;
|
|
234
|
+
const len = this.length;
|
|
235
|
+
const hlen = this.length / 2;
|
|
236
|
+
for (let i = 0; i < hlen; ++i) {
|
|
237
|
+
even[i] = real[2 * i];
|
|
238
|
+
odd[i] = real[2 * i + 1];
|
|
239
|
+
}
|
|
240
|
+
const [fftReal, fftImag] = this.halfFft.transform(even, odd);
|
|
241
|
+
const out = this.out.get(len);
|
|
242
|
+
const outReal = out[0];
|
|
243
|
+
const outImag = out[1];
|
|
244
|
+
outReal[0] = (fftReal[0] + fftImag[0]) * 0.5;
|
|
245
|
+
outImag[0] = 0;
|
|
246
|
+
outReal[hlen] = (fftReal[0] - fftImag[0]) * 0.5;
|
|
247
|
+
outImag[hlen] = 0;
|
|
248
|
+
for (let i = 1; i < hlen; ++i) {
|
|
249
|
+
const cr = coefReal[i];
|
|
250
|
+
const ci = coefImag[i];
|
|
251
|
+
const sr = fftReal[i] + fftReal[hlen - i];
|
|
252
|
+
const si = fftImag[i] - fftImag[hlen - i];
|
|
253
|
+
const dr = fftReal[i] - fftReal[hlen - i];
|
|
254
|
+
const di = fftImag[i] + fftImag[hlen - i];
|
|
255
|
+
const xr = (sr + cr * di + ci * dr) * 0.25;
|
|
256
|
+
const xi = (si - cr * dr + ci * di) * 0.25;
|
|
257
|
+
outReal[i] = xr;
|
|
258
|
+
outImag[i] = xi;
|
|
259
|
+
outReal[len - i] = xr;
|
|
260
|
+
outImag[len - i] = -xi;
|
|
261
|
+
}
|
|
262
|
+
return out;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Does a reverse transform of the given frequency-domain input.
|
|
266
|
+
* The input and output arrays must be at least half the FFT's length.
|
|
267
|
+
* @param real An array of real parts.
|
|
268
|
+
* @param imag An array of imaginary parts.
|
|
269
|
+
* @return The real output of the reverse transform.
|
|
270
|
+
*/
|
|
271
|
+
reverse(real, imag) {
|
|
272
|
+
const coefReal = this.coefReal;
|
|
273
|
+
const coefImag = this.coefImag;
|
|
274
|
+
const fftReal = this.copyEven;
|
|
275
|
+
const fftImag = this.copyOdd;
|
|
276
|
+
const len = this.length;
|
|
277
|
+
const hlen = len / 2;
|
|
278
|
+
fftReal[0] = real[0] + real[hlen];
|
|
279
|
+
fftImag[0] = real[0] - real[hlen];
|
|
280
|
+
for (let i = 1; i < hlen; ++i) {
|
|
281
|
+
const cr = coefReal[i];
|
|
282
|
+
const ci = coefImag[i];
|
|
283
|
+
const sr = real[i] + real[hlen - i];
|
|
284
|
+
const si = imag[i] - imag[hlen - i];
|
|
285
|
+
const dr = real[i] - real[hlen - i];
|
|
286
|
+
const di = imag[i] + imag[hlen - i];
|
|
287
|
+
fftReal[i] = sr - cr * di + ci * dr;
|
|
288
|
+
fftImag[i] = si + cr * dr + ci * di;
|
|
289
|
+
}
|
|
290
|
+
const [outEven, outOdd] = this.halfFft.reverse(fftReal, fftImag);
|
|
291
|
+
const out = this.outReal.get(len);
|
|
292
|
+
for (let i = 0; i < hlen; ++i) {
|
|
293
|
+
out[2 * i] = outEven[i];
|
|
294
|
+
out[2 * i + 1] = outOdd[i];
|
|
295
|
+
}
|
|
296
|
+
return out;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
196
299
|
/** Builds a triangle of direct and reverse FFT coefficients for the given length. */
|
|
197
300
|
function makeFftCoefficients(length) {
|
|
198
301
|
let numBits = getNumBits(length);
|
|
@@ -203,7 +306,7 @@ function makeFftCoefficients(length) {
|
|
|
203
306
|
imag: new Float32Array(halfSize),
|
|
204
307
|
});
|
|
205
308
|
for (let i = 0; i < halfSize; ++i) {
|
|
206
|
-
const fwdAngle = (-
|
|
309
|
+
const fwdAngle = (-Math.PI * i) / halfSize;
|
|
207
310
|
coefs[bin].real[i] = Math.cos(fwdAngle);
|
|
208
311
|
coefs[bin].imag[i] = Math.sin(fwdAngle);
|
|
209
312
|
}
|
package/dist/dsp/fft.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fft.js","sourceRoot":"","sources":["../../src/dsp/fft.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fft.js","sourceRoot":"","sources":["../../src/dsp/fft.ts"],"names":[],"mappings":"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"}
|
package/dist/dsp/filters.d.ts
CHANGED
|
@@ -26,12 +26,19 @@ export declare class FIRFilter implements Filter {
|
|
|
26
26
|
loadSamples(samples: Float32Array): void;
|
|
27
27
|
/**
|
|
28
28
|
* Returns a filtered sample.
|
|
29
|
-
* Be very careful when you modify this function. About 85% of the total execution
|
|
30
|
-
* time is spent here, so performance is critical.
|
|
31
29
|
* @param index The index of the sample to return, corresponding
|
|
32
30
|
* to the same index in the latest sample block loaded via loadSamples().
|
|
33
31
|
*/
|
|
34
|
-
get(index: number)
|
|
32
|
+
get: (index: number) => number;
|
|
33
|
+
/**
|
|
34
|
+
* Version of get() for non-symmetrical coefficients.
|
|
35
|
+
* Be very careful when you modify this function. About 85% of the total execution
|
|
36
|
+
* time is spent here, so performance is critical.
|
|
37
|
+
*/
|
|
38
|
+
private getNS;
|
|
39
|
+
/** Version of get() for symmetric coefficients. */
|
|
40
|
+
private getS;
|
|
41
|
+
private isSymmetric;
|
|
35
42
|
}
|
|
36
43
|
/**
|
|
37
44
|
* A class that applies a FIR filter using successive Fourier transforms (overlap-save.)
|
|
@@ -56,20 +63,46 @@ export declare class FFTFilter implements Filter {
|
|
|
56
63
|
getDelay(): number;
|
|
57
64
|
inPlace(samples: Float32Array): void;
|
|
58
65
|
}
|
|
66
|
+
export interface IqFilter {
|
|
67
|
+
/** Returns a newly initialized clone of this filter. */
|
|
68
|
+
clone(): IqFilter;
|
|
69
|
+
/** Returns this filter's delay, in samples. */
|
|
70
|
+
getDelay(): number;
|
|
71
|
+
/** Applies the filter to the input samples, in place. */
|
|
72
|
+
inPlace(I: Float32Array, Q: Float32Array): void;
|
|
73
|
+
}
|
|
59
74
|
/** A filter that works on an IQ signal. */
|
|
60
|
-
export declare class
|
|
61
|
-
constructor(
|
|
75
|
+
export declare class IqFIRFilter {
|
|
76
|
+
constructor(coefs: Float32Array);
|
|
62
77
|
private filterI;
|
|
63
78
|
private filterQ;
|
|
64
79
|
/** Changes the filters' coefficients. */
|
|
65
80
|
setCoefficients(coefs: Float32Array): void;
|
|
66
81
|
/** Returns a newly initialized clone of this filter. */
|
|
67
|
-
clone():
|
|
82
|
+
clone(): IqFIRFilter;
|
|
68
83
|
/** Returns this filter's delay, in samples. */
|
|
69
84
|
getDelay(): number;
|
|
70
85
|
/** Applies the filter to the input samples, in place. */
|
|
71
86
|
inPlace(I: Float32Array, Q: Float32Array): void;
|
|
72
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* A class that applies a FIR filter using successive Fourier transforms (overlap-save.)
|
|
90
|
+
*/
|
|
91
|
+
export declare class IqFFTFilter implements IqFilter {
|
|
92
|
+
constructor(coefs: Float32Array);
|
|
93
|
+
private fft;
|
|
94
|
+
private kernel;
|
|
95
|
+
private overlap;
|
|
96
|
+
private input;
|
|
97
|
+
private workI;
|
|
98
|
+
private workQ;
|
|
99
|
+
private output;
|
|
100
|
+
private computeKernel;
|
|
101
|
+
setCoefficients(coefs: Float32Array): void;
|
|
102
|
+
clone(): IqFFTFilter;
|
|
103
|
+
getDelay(): number;
|
|
104
|
+
inPlace(real: Float32Array, imag: Float32Array): void;
|
|
105
|
+
}
|
|
73
106
|
/** A class to apply a delay to a sequence of samples. */
|
|
74
107
|
export declare class DelayFilter implements Filter {
|
|
75
108
|
/** @param delay The number of samples to delay the signal by */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/dsp/filters.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/dsp/filters.ts"],"names":[],"mappings":"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"}
|
package/dist/dsp/filters.js
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
13
|
// See the License for the specific language governing permissions and
|
|
14
14
|
// limitations under the License.
|
|
15
|
-
import { Float32Pool, Float32RingBuffer, IqPool } from "./buffers.js";
|
|
16
|
-
import { actualLength, FFT } from "./fft.js";
|
|
15
|
+
import { Float32Pool, Float32RingBuffer, IqPool, IqRingBuffer, } from "./buffers.js";
|
|
16
|
+
import { actualLength, FFT, RealFFT } from "./fft.js";
|
|
17
17
|
import { atan2 } from "./math.js";
|
|
18
18
|
/** A class to apply a FIR filter to a sequence of samples. */
|
|
19
19
|
export class FIRFilter {
|
|
@@ -25,6 +25,7 @@ export class FIRFilter {
|
|
|
25
25
|
this.center = Math.floor(this.coefs.length / 2);
|
|
26
26
|
this.pool = new Float32Pool(2, 2 * this.offset);
|
|
27
27
|
this.curSamples = this.pool.get(this.offset);
|
|
28
|
+
this.get = this.isSymmetric() ? this.getS : this.getNS;
|
|
28
29
|
}
|
|
29
30
|
offset;
|
|
30
31
|
center;
|
|
@@ -36,6 +37,7 @@ export class FIRFilter {
|
|
|
36
37
|
this.offset = this.coefs.length - 1;
|
|
37
38
|
this.center = Math.floor(this.coefs.length / 2);
|
|
38
39
|
this.curSamples = this.pool.get(this.offset);
|
|
40
|
+
this.get = this.isSymmetric() ? this.getS : this.getNS;
|
|
39
41
|
this.loadSamples(oldSamples);
|
|
40
42
|
}
|
|
41
43
|
clone() {
|
|
@@ -68,12 +70,16 @@ export class FIRFilter {
|
|
|
68
70
|
}
|
|
69
71
|
/**
|
|
70
72
|
* Returns a filtered sample.
|
|
71
|
-
* Be very careful when you modify this function. About 85% of the total execution
|
|
72
|
-
* time is spent here, so performance is critical.
|
|
73
73
|
* @param index The index of the sample to return, corresponding
|
|
74
74
|
* to the same index in the latest sample block loaded via loadSamples().
|
|
75
75
|
*/
|
|
76
|
-
get
|
|
76
|
+
get = this.getNS;
|
|
77
|
+
/**
|
|
78
|
+
* Version of get() for non-symmetrical coefficients.
|
|
79
|
+
* Be very careful when you modify this function. About 85% of the total execution
|
|
80
|
+
* time is spent here, so performance is critical.
|
|
81
|
+
*/
|
|
82
|
+
getNS(index) {
|
|
77
83
|
let i = 0;
|
|
78
84
|
let out = 0;
|
|
79
85
|
let len = this.coefs.length;
|
|
@@ -96,6 +102,55 @@ export class FIRFilter {
|
|
|
96
102
|
}
|
|
97
103
|
return out;
|
|
98
104
|
}
|
|
105
|
+
/** Version of get() for symmetric coefficients. */
|
|
106
|
+
getS(index) {
|
|
107
|
+
let i = 0;
|
|
108
|
+
let out = 0;
|
|
109
|
+
let hlen = this.coefs.length / 2;
|
|
110
|
+
let fhlen = Math.floor(this.coefs.length / 2);
|
|
111
|
+
let lo = index;
|
|
112
|
+
let hi = index + this.coefs.length - 1;
|
|
113
|
+
let hlen4 = 4 * Math.floor(hlen / 4);
|
|
114
|
+
while (i < hlen4) {
|
|
115
|
+
out +=
|
|
116
|
+
this.coefs[i + 0] *
|
|
117
|
+
(this.curSamples[lo + 0] + this.curSamples[hi - 0]) +
|
|
118
|
+
this.coefs[i + 1] *
|
|
119
|
+
(this.curSamples[lo + 1] + this.curSamples[hi - 1]) +
|
|
120
|
+
this.coefs[i + 2] *
|
|
121
|
+
(this.curSamples[lo + 2] + this.curSamples[hi - 2]) +
|
|
122
|
+
this.coefs[i + 3] * (this.curSamples[lo + 3] + this.curSamples[hi - 3]);
|
|
123
|
+
i += 4;
|
|
124
|
+
lo += 4;
|
|
125
|
+
hi -= 4;
|
|
126
|
+
}
|
|
127
|
+
let hlen2 = 2 * Math.floor(hlen / 2);
|
|
128
|
+
while (i < hlen2) {
|
|
129
|
+
out +=
|
|
130
|
+
this.coefs[i + 0] *
|
|
131
|
+
(this.curSamples[lo + 0] + this.curSamples[hi - 0]) +
|
|
132
|
+
this.coefs[i + 1] * (this.curSamples[lo + 1] + this.curSamples[hi - 1]);
|
|
133
|
+
i += 2;
|
|
134
|
+
lo += 2;
|
|
135
|
+
hi -= 2;
|
|
136
|
+
}
|
|
137
|
+
while (i < fhlen) {
|
|
138
|
+
out += this.coefs[i++] * (this.curSamples[lo++] + this.curSamples[hi--]);
|
|
139
|
+
}
|
|
140
|
+
if (fhlen != hlen) {
|
|
141
|
+
out += this.coefs[i++] * this.curSamples[lo++];
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
isSymmetric() {
|
|
146
|
+
const len = this.coefs.length - 1;
|
|
147
|
+
const hlen = Math.floor(this.coefs.length / 2);
|
|
148
|
+
for (let i = 0; i < hlen; ++i) {
|
|
149
|
+
if (this.coefs[i] !== this.coefs[len - i])
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
99
154
|
}
|
|
100
155
|
/**
|
|
101
156
|
* A class that applies a FIR filter using successive Fourier transforms (overlap-save.)
|
|
@@ -108,7 +163,7 @@ export class FIRFilter {
|
|
|
108
163
|
*/
|
|
109
164
|
export class FFTFilter {
|
|
110
165
|
constructor(coefs) {
|
|
111
|
-
this.fft =
|
|
166
|
+
this.fft = RealFFT.ofLength(coefs.length * 2);
|
|
112
167
|
this.kernel = this.computeKernel(coefs);
|
|
113
168
|
this.overlap = coefs.length - 1;
|
|
114
169
|
this.input = new Float32RingBuffer(this.fft.length);
|
|
@@ -124,25 +179,25 @@ export class FFTFilter {
|
|
|
124
179
|
work;
|
|
125
180
|
output;
|
|
126
181
|
computeKernel(coefs) {
|
|
127
|
-
let
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
I[i] *= I.length;
|
|
182
|
+
let copy = new Float32Array(this.fft.length);
|
|
183
|
+
copy.set(coefs);
|
|
184
|
+
copy.subarray(0, coefs.length).reverse();
|
|
185
|
+
for (let i = 0; i < copy.length; ++i) {
|
|
186
|
+
copy[i] *= copy.length;
|
|
133
187
|
}
|
|
134
|
-
let kernel = this.fft.transform(
|
|
188
|
+
let kernel = this.fft.transform(copy);
|
|
135
189
|
return [new Float32Array(kernel[0]), new Float32Array(kernel[1])];
|
|
136
190
|
}
|
|
137
191
|
setCoefficients(coefs) {
|
|
138
192
|
let fftLength = actualLength(coefs.length * 2);
|
|
139
193
|
let newOverlap = coefs.length - 1;
|
|
140
|
-
this.kernel = this.computeKernel(coefs);
|
|
141
194
|
if (fftLength == this.fft.length && newOverlap == this.overlap) {
|
|
195
|
+
this.kernel = this.computeKernel(coefs);
|
|
142
196
|
return;
|
|
143
197
|
}
|
|
144
|
-
this.fft =
|
|
198
|
+
this.fft = RealFFT.ofLength(fftLength);
|
|
145
199
|
this.overlap = newOverlap;
|
|
200
|
+
this.kernel = this.computeKernel(coefs);
|
|
146
201
|
let oldInput = new Float32Array(this.input.available);
|
|
147
202
|
this.input.moveTo(oldInput);
|
|
148
203
|
this.input = new Float32RingBuffer(this.fft.length);
|
|
@@ -184,7 +239,7 @@ export class FFTFilter {
|
|
|
184
239
|
fd[1][i] = sQ * kI + sI * kQ;
|
|
185
240
|
}
|
|
186
241
|
let td = this.fft.reverse(fd[0], fd[1]);
|
|
187
|
-
this.output.store(td
|
|
242
|
+
this.output.store(td.subarray(this.overlap));
|
|
188
243
|
}
|
|
189
244
|
if (writePos < samples.length) {
|
|
190
245
|
let moved = this.output.moveTo(samples.subarray(writePos, readPos));
|
|
@@ -194,10 +249,10 @@ export class FFTFilter {
|
|
|
194
249
|
}
|
|
195
250
|
}
|
|
196
251
|
/** A filter that works on an IQ signal. */
|
|
197
|
-
export class
|
|
198
|
-
constructor(
|
|
199
|
-
this.filterI =
|
|
200
|
-
this.filterQ =
|
|
252
|
+
export class IqFIRFilter {
|
|
253
|
+
constructor(coefs) {
|
|
254
|
+
this.filterI = new FIRFilter(coefs);
|
|
255
|
+
this.filterQ = this.filterI.clone();
|
|
201
256
|
}
|
|
202
257
|
filterI;
|
|
203
258
|
filterQ;
|
|
@@ -208,7 +263,10 @@ export class IqFilter {
|
|
|
208
263
|
}
|
|
209
264
|
/** Returns a newly initialized clone of this filter. */
|
|
210
265
|
clone() {
|
|
211
|
-
|
|
266
|
+
let out = new IqFIRFilter(new Float32Array(3));
|
|
267
|
+
out.filterI = this.filterI.clone();
|
|
268
|
+
out.filterQ = this.filterQ.clone();
|
|
269
|
+
return out;
|
|
212
270
|
}
|
|
213
271
|
/** Returns this filter's delay, in samples. */
|
|
214
272
|
getDelay() {
|
|
@@ -220,6 +278,101 @@ export class IqFilter {
|
|
|
220
278
|
this.filterQ.inPlace(Q);
|
|
221
279
|
}
|
|
222
280
|
}
|
|
281
|
+
/**
|
|
282
|
+
* A class that applies a FIR filter using successive Fourier transforms (overlap-save.)
|
|
283
|
+
*/
|
|
284
|
+
export class IqFFTFilter {
|
|
285
|
+
constructor(coefs) {
|
|
286
|
+
this.fft = FFT.ofLength(coefs.length * 2);
|
|
287
|
+
this.kernel = this.computeKernel(coefs);
|
|
288
|
+
this.overlap = coefs.length - 1;
|
|
289
|
+
this.input = new IqRingBuffer(this.fft.length);
|
|
290
|
+
this.input.fill(0, 0, this.overlap);
|
|
291
|
+
this.workI = new Float32Array(this.fft.length);
|
|
292
|
+
this.workQ = new Float32Array(this.fft.length);
|
|
293
|
+
this.output = new IqRingBuffer((this.fft.length - this.overlap) * 2);
|
|
294
|
+
this.output.fill(0, 0, this.fft.length - this.overlap);
|
|
295
|
+
}
|
|
296
|
+
fft;
|
|
297
|
+
kernel;
|
|
298
|
+
overlap;
|
|
299
|
+
input;
|
|
300
|
+
workI;
|
|
301
|
+
workQ;
|
|
302
|
+
output;
|
|
303
|
+
computeKernel(coefs) {
|
|
304
|
+
let copy = new Float32Array(this.fft.length);
|
|
305
|
+
copy.set(coefs);
|
|
306
|
+
copy.subarray(0, coefs.length).reverse();
|
|
307
|
+
for (let i = 0; i < copy.length; ++i) {
|
|
308
|
+
copy[i] *= copy.length;
|
|
309
|
+
}
|
|
310
|
+
let kernel = RealFFT.ofLength(this.fft.length).transform(copy);
|
|
311
|
+
return [new Float32Array(kernel[0]), new Float32Array(kernel[1])];
|
|
312
|
+
}
|
|
313
|
+
setCoefficients(coefs) {
|
|
314
|
+
let fftLength = actualLength(coefs.length * 2);
|
|
315
|
+
let newOverlap = coefs.length - 1;
|
|
316
|
+
if (fftLength == this.fft.length && newOverlap == this.overlap) {
|
|
317
|
+
this.kernel = this.computeKernel(coefs);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
this.fft = FFT.ofLength(fftLength);
|
|
321
|
+
this.overlap = newOverlap;
|
|
322
|
+
this.kernel = this.computeKernel(coefs);
|
|
323
|
+
let oldInputI = new Float32Array(this.input.available);
|
|
324
|
+
let oldInputQ = new Float32Array(this.input.available);
|
|
325
|
+
this.input.moveTo(oldInputI, oldInputQ);
|
|
326
|
+
this.input = new IqRingBuffer(this.fft.length);
|
|
327
|
+
if (newOverlap > oldInputI.length) {
|
|
328
|
+
this.input.fill(0, 0, newOverlap - oldInputI.length);
|
|
329
|
+
}
|
|
330
|
+
this.input.store(oldInputI, oldInputQ);
|
|
331
|
+
this.workI = new Float32Array(this.fft.length);
|
|
332
|
+
this.workQ = new Float32Array(this.fft.length);
|
|
333
|
+
this.output = new IqRingBuffer((this.fft.length - this.overlap) * 2);
|
|
334
|
+
this.output.fill(0, 0, this.fft.length - this.overlap);
|
|
335
|
+
}
|
|
336
|
+
clone() {
|
|
337
|
+
let newFilter = new IqFFTFilter(new Float32Array(this.overlap + 1));
|
|
338
|
+
newFilter.kernel = this.kernel;
|
|
339
|
+
return newFilter;
|
|
340
|
+
}
|
|
341
|
+
getDelay() {
|
|
342
|
+
return this.fft.length - this.overlap / 2;
|
|
343
|
+
}
|
|
344
|
+
inPlace(real, imag) {
|
|
345
|
+
const length = Math.min(real.length, imag.length);
|
|
346
|
+
let readPos = 0;
|
|
347
|
+
let writePos = 0;
|
|
348
|
+
while (length - readPos > 0) {
|
|
349
|
+
if (this.input.available < this.input.capacity) {
|
|
350
|
+
let toCopy = Math.min(length - readPos, this.input.capacity - this.input.available);
|
|
351
|
+
this.input.store(real.subarray(readPos, readPos + toCopy), imag.subarray(readPos, readPos + toCopy));
|
|
352
|
+
readPos += toCopy;
|
|
353
|
+
}
|
|
354
|
+
if (this.input.available == this.input.capacity) {
|
|
355
|
+
this.input.copyTo(this.workI, this.workQ);
|
|
356
|
+
this.input.consume(this.input.capacity - this.overlap);
|
|
357
|
+
let fd = this.fft.transform(this.workI, this.workQ);
|
|
358
|
+
for (let i = 0; i < fd[0].length; ++i) {
|
|
359
|
+
let sI = fd[0][i];
|
|
360
|
+
let sQ = fd[1][i];
|
|
361
|
+
let kI = this.kernel[0][i];
|
|
362
|
+
let kQ = this.kernel[1][i];
|
|
363
|
+
fd[0][i] = sI * kI - sQ * kQ;
|
|
364
|
+
fd[1][i] = sQ * kI + sI * kQ;
|
|
365
|
+
}
|
|
366
|
+
let td = this.fft.reverse(fd[0], fd[1]);
|
|
367
|
+
this.output.store(td[0].subarray(this.overlap), td[1].subarray(this.overlap));
|
|
368
|
+
}
|
|
369
|
+
if (writePos < length) {
|
|
370
|
+
let moved = this.output.moveTo(real.subarray(writePos, readPos), imag.subarray(writePos, readPos));
|
|
371
|
+
writePos += moved;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
223
376
|
/** A class to apply a delay to a sequence of samples. */
|
|
224
377
|
export class DelayFilter {
|
|
225
378
|
/** @param delay The number of samples to delay the signal by */
|
|
@@ -508,8 +661,9 @@ export class FrequencyShifter {
|
|
|
508
661
|
cosine = cosine * deltaCos - sine * deltaSin;
|
|
509
662
|
sine = newSine;
|
|
510
663
|
}
|
|
511
|
-
|
|
512
|
-
this.
|
|
664
|
+
const m = Math.hypot(cosine, sine);
|
|
665
|
+
this.cosine = cosine / m;
|
|
666
|
+
this.sine = sine / m;
|
|
513
667
|
}
|
|
514
668
|
}
|
|
515
669
|
/** Detects a pilot tone and returns its cosine and sine as an IQ signal. */
|