UNPKG

dsp-collection

Version:

A collection of JavaScript modules for digital signal processing (written in TypeScript)

99 lines 3.77 kB
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