@@ -287,19 +287,15 @@ function filterSignal(signal, frequency, order, mode, filterKernel) {
287287
288288 let characteristic = "butterworth" ;
289289
290- // order = mode === "Butterworth" ? Math.min(order, 12) : Math.min(order, 4);
291-
292290 let filterCoeffs = iirCalculator . lowpass ( {
293- order : order , // cascade 3 biquad filters (max: 12)
291+ order : order , // cascade 3 biquad filters
294292 characteristic : characteristic ,
295293 Fs : WEBAUDIO_MAX_SAMPLERATE , // sampling frequency
296294 Fc : frequency , // cutoff frequency / center frequency for bandpass, bandstop, peak
297295 preGain : false // adds one constant multiplication for highpass and lowpass
298296 // k = (1 + cos(omega)) * 0.5 / k = 1 with preGain == false
299297 } ) ;
300298
301- console . log ( filterCoeffs ) ;
302-
303299 let filter = new Fili . IirFilter ( filterCoeffs ) ;
304300
305301 signal . forEach ( ( x , n , y ) => y [ n ] = filter . singleStep ( x ) ) ;
@@ -391,24 +387,86 @@ function renderOriginal(settings, fft, playback) {
391387 normalize ( original , settings . amplitude ) ;
392388}
393389
390+ function getInterpolatedSample ( array , i ) {
391+ if ( i <= 0 ) {
392+ return array [ 0 ] ;
393+ }
394+ if ( i >= array . length - 1 ) {
395+ return array [ array . length - 1 ] ;
396+ }
397+ let lowIndex = Math . floor ( i ) ;
398+ let highIndex = lowIndex + 1 ;
399+
400+ return array [ lowIndex ] * ( highIndex - i ) + array [ highIndex ] * ( i - lowIndex ) ;
401+ }
402+
394403function renderDeltaSigma ( settings , fft , playback ) {
395404 let originalUnfiltered = playback ? settings . buffers . originalUnfiltered . playback : settings . buffers . originalUnfiltered . display ;
396405 let deltaSigma = playback ? settings . buffers . deltaSigma . playback : settings . buffers . deltaSigma . display ;
397406 let reconstructed = playback ? settings . buffers . reconstructed . playback : settings . buffers . reconstructed . display ;
398407
399- let samplePeriod = Math . floor ( settings . downsamplingFactor ) ;
400408 let step = settings . deltaSigmaStep ;
401- let ds_state = 0 ;
402- for ( let i = 0 ; i < originalUnfiltered . length ; i += samplePeriod ) {
403- if ( ds_state > originalUnfiltered [ i ] ) {
404- ds_state -= step ;
405- } else {
406- ds_state += step ;
409+
410+
411+ if ( settings . deltaSigmaSamplingRate <= ( WEBAUDIO_MAX_SAMPLERATE / 2 ) ) {
412+ if ( ! playback && deltaSigma . length !== settings . displaySignalSize ) {
413+ deltaSigma = new Float32Array ( settings . displaySignalSize ) ;
407414 }
408- for ( let j = 0 ; j < samplePeriod ; j += 1 ) {
409- deltaSigma [ i + j ] = ds_state ;
410- reconstructed [ i + j ] = ds_state ;
415+ let samplePeriod = Math . floor ( WEBAUDIO_MAX_SAMPLERATE / settings . deltaSigmaSamplingRate ) ;
416+ let ds_state = 0 ;
417+ for ( let i = 0 ; i < originalUnfiltered . length ; i += samplePeriod ) {
418+ if ( ds_state > originalUnfiltered [ i ] ) {
419+ ds_state -= step ;
420+ } else {
421+ ds_state += step ;
422+ }
423+ for ( let j = 0 ; j < samplePeriod ; j += 1 ) {
424+ deltaSigma [ i + j ] = ds_state ;
425+ reconstructed [ i + j ] = ds_state ;
426+ }
427+ }
428+ } else if ( ! playback ) {
429+ // Simulate a higher sample rate
430+ if ( settings . buffers . deltaSigma . display . length !== settings . displaySignalSize * settings . deltaSigmaSamplingRate / WEBAUDIO_MAX_SAMPLERATE ) {
431+ settings . buffers . deltaSigma . display = new Float32Array ( settings . displaySignalSize * settings . deltaSigmaSamplingRate / WEBAUDIO_MAX_SAMPLERATE ) ;
432+ settings . buffers . reconstructed . display = new Float32Array ( settings . displaySignalSize * settings . deltaSigmaSamplingRate / WEBAUDIO_MAX_SAMPLERATE ) ;
411433 }
434+ let upsampledOutput = new Float32Array ( settings . buffers . deltaSigma . display . length ) ;
435+
436+ let ds_state = 0 ;
437+ let scale = originalUnfiltered . length / settings . buffers . deltaSigma . display . length ;
438+ for ( let i = 0 ; i < settings . buffers . deltaSigma . display . length ; i += 1 ) {
439+
440+ if ( ds_state > getInterpolatedSample ( originalUnfiltered , i * scale ) ) {
441+ ds_state -= step ;
442+ } else {
443+ ds_state += step ;
444+ }
445+ settings . buffers . deltaSigma . display [ i ] = ds_state ;
446+ settings . buffers . reconstructed . display [ i ] = ds_state ;
447+ }
448+
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+ // }
412470 }
413471}
414472
@@ -543,6 +601,7 @@ function downsampleWithQuantization(settings, fft, playback) {
543601}
544602
545603function antiImagingFilter ( settings , fft , playback ) {
604+
546605 let reconstructed = playback ? settings . buffers . reconstructed . playback : settings . buffers . reconstructed . display ;
547606
548607 // render reconstructed wave by low pass filtering the zero stuffed array----
0 commit comments