dsp-collection
Version:
A collection of JavaScript modules for digital signal processing (written in TypeScript)
99 lines • 3.77 kB
JavaScript
import ComplexArray from "../math/ComplexArray.js";
import * as Fft from "../signal/Fft.js";
function smoothingFunction(x) {
return (Math.sin(x * Math.PI / 2) + 1) / 2;
}
export function getFilterCurveFunction(filterType, filterFreq1, filterFreq2, smoothingWidth) {
switch (filterType) {
case "LP": {
return (freq) => {
if (freq < filterFreq1 - smoothingWidth) {
return 1;
}
else if (freq < filterFreq1 + smoothingWidth) {
return smoothingFunction((filterFreq1 - freq) / smoothingWidth);
}
else {
return 0;
}
};
}
case "HP": {
return (freq) => {
if (freq < filterFreq1 - smoothingWidth) {
return 0;
}
else if (freq < filterFreq1 + smoothingWidth) {
return smoothingFunction((freq - filterFreq1) / smoothingWidth);
}
else {
return 1;
}
};
}
case "BP": {
return (freq) => {
if (freq < filterFreq1 - smoothingWidth) {
return 0;
}
else if (freq < filterFreq1 + smoothingWidth) {
return smoothingFunction((freq - filterFreq1) / smoothingWidth);
}
else if (freq < filterFreq2 - smoothingWidth) {
return 1;
}
else if (freq < filterFreq2 + smoothingWidth) {
return smoothingFunction((filterFreq2 - freq) / smoothingWidth);
}
else {
return 0;
}
};
}
case "BS": {
return (freq) => {
if (freq < filterFreq1 - smoothingWidth) {
return 1;
}
else if (freq < filterFreq1 + smoothingWidth) {
return smoothingFunction((filterFreq1 - freq) / smoothingWidth);
}
else if (freq < filterFreq2 - smoothingWidth) {
return 0;
}
else if (freq < filterFreq2 + smoothingWidth) {
return smoothingFunction((freq - filterFreq2) / smoothingWidth);
}
else {
return 1;
}
};
}
default: {
throw new Error("Unsupported filter type.");
}
}
}
export function applyFilterCurveFunction(inAmplitudes, scalingFactor, filterCurveFunction) {
const n = inAmplitudes.length;
const outAmplitudes = new Float64Array(n);
for (let p = 0; p < n; p++) {
const frequency = p / scalingFactor;
const filterFactor = filterCurveFunction(frequency);
outAmplitudes[p] = filterFactor * inAmplitudes[p];
}
return outAmplitudes;
}
export function filterSignal(inSamples, sampleRate, filterType, filterFreq1, filterFreq2, smoothingWidth) {
const n = inSamples.length;
const inSpectrum = Fft.fftRealSpectrum(inSamples);
const inAmplitudes = inSpectrum.getAbsArray();
const inPhases = inSpectrum.getArgArray();
const filterCurveFunction = getFilterCurveFunction(filterType, filterFreq1, filterFreq2, smoothingWidth);
const outAmplitudes = applyFilterCurveFunction(inAmplitudes, n / sampleRate, filterCurveFunction);
const outPhases = inPhases;
const outSpectrum = ComplexArray.fromPolar(outAmplitudes, outPhases);
const outSignal = Fft.iFftRealHalf(outSpectrum, n);
return outSignal;
}
//# sourceMappingURL=SpecFilt.js.map