@@ -242,7 +242,7 @@ function normalize(arr, targetAmplitude) {
242242 arr . forEach ( ( x , n , y ) => y [ n ] = targetAmplitude * x / amp ) ;
243243}
244244
245- function filterSignal ( signal , frequency , order , mode , filterKernel ) {
245+ function filterSignal ( signal , frequency , order , mode , filterKernel , fs = WEBAUDIO_MAX_SAMPLERATE ) {
246246 // specify the filter parameters; Fs = sampling rate, Fc = cutoff frequency
247247
248248 // The cutoff for the antialiasing filter is set to the Nyquist frequency
@@ -256,7 +256,7 @@ function filterSignal(signal, frequency, order, mode, filterKernel) {
256256 let filterCoeffs = firCalculator . lowpass (
257257 {
258258 order : order
259- , Fs : WEBAUDIO_MAX_SAMPLERATE
259+ , Fs : fs
260260 , Fc : frequency
261261 } ) ;
262262
@@ -290,7 +290,7 @@ function filterSignal(signal, frequency, order, mode, filterKernel) {
290290 let filterCoeffs = iirCalculator . lowpass ( {
291291 order : order , // cascade 3 biquad filters
292292 characteristic : characteristic ,
293- Fs : WEBAUDIO_MAX_SAMPLERATE , // sampling frequency
293+ Fs : fs , // sampling frequency
294294 Fc : frequency , // cutoff frequency / center frequency for bandpass, bandstop, peak
295295 preGain : false // adds one constant multiplication for highpass and lowpass
296296 // k = (1 + cos(omega)) * 0.5 / k = 1 with preGain == false
@@ -385,6 +385,8 @@ function renderOriginal(settings, fft, playback) {
385385 getSamples ( settings , original ) ;
386386
387387 normalize ( original , settings . amplitude ) ;
388+
389+ settings . reconstructionFilterFrequency = ( settings . sampleRate / settings . downsamplingFactor ) / 2 ;
388390}
389391
390392function getInterpolatedSample ( array , i ) {
@@ -445,28 +447,30 @@ function renderDeltaSigma(settings, fft, playback) {
445447 settings . buffers . deltaSigma . display [ i ] = ds_state ;
446448 settings . buffers . reconstructed . display [ i ] = ds_state ;
447449 }
450+ } else {
451+ // playback at higher sample rate
452+ let fullBuffer = new Float32Array ( Math . floor ( originalUnfiltered . length * settings . deltaSigmaSamplingRate / WEBAUDIO_MAX_SAMPLERATE ) ) ;
453+
454+ let ds_state = 0 ;
455+ let scale = originalUnfiltered . length / fullBuffer . length ;
456+ for ( let i = 0 ; i < fullBuffer . length ; i += 1 ) {
457+
458+ if ( ds_state > getInterpolatedSample ( originalUnfiltered , i * scale ) ) {
459+ ds_state -= step ;
460+ } else {
461+ ds_state += step ;
462+ }
463+ fullBuffer [ i ] = ds_state ;
464+ }
465+
466+ filterSignal ( fullBuffer , WEBAUDIO_MAX_SAMPLERATE / 2 , 200 , 'FIR' , undefined , settings . deltaSigmaSamplingRate ) ;
448467
449- // let iirCalculator = new Fili.CalcCascades();
450- //
451- // let characteristic = "butterworth";
452- //
453- // let filterCoeffs = iirCalculator.lowpass({
454- // order: 6, // cascade 3 biquad filters
455- // characteristic: characteristic,
456- // Fs: settings.deltaSigmaSamplingRate, // sampling frequency
457- // Fc: 20000, // cutoff frequency / center frequency for bandpass, bandstop, peak
458- // preGain: false // adds one constant multiplication for highpass and lowpass
459- // });
460- //
461- // let filter = new Fili.IirFilter(filterCoeffs);
462- //
463- // upsampledOutput.forEach((x, n, y) => y[n] = filter.singleStep(x));
464- //
465- // const decimationRatio = settings.deltaSigmaSamplingRate / WEBAUDIO_MAX_SAMPLERATE;
466- // console.log(decimationRatio);
467- // for (let i = 0; i < reconstructed.length; ++i) {
468- // reconstructed[i] = upsampledOutput[Math.min(Math.floor(i * decimationRatio), upsampledOutput.length - 1)];
469- // }
468+ scale = 1 / scale ;
469+ for ( let i = 0 ; i < reconstructed . length ; i += 1 ) {
470+ let s = getInterpolatedSample ( fullBuffer , i * scale ) ;
471+ reconstructed [ i ] = s ;
472+ deltaSigma [ i ] = s ;
473+ }
470474 }
471475}
472476
0 commit comments