@@ -16,14 +16,14 @@ export interface InterpolationStrategyRegistration {
1616 readonly id : string ;
1717 readonly baseStrategy ?: BuiltInInterpolationStrategy ;
1818 readonly kernel ?: InterpolationKernel ;
19- readonly defaultParams ?: Record < string , number > ;
19+ readonly defaultParams ?: Record < string , number | boolean > ;
2020 readonly normalizeParams ?: (
21- params : Partial < Record < string , number > > | undefined ,
22- defaults : Record < string , number > ,
23- ) => Record < string , number > ;
21+ params : Partial < Record < string , number | boolean > > | undefined ,
22+ defaults : Record < string , number | boolean > ,
23+ ) => Record < string , number | boolean > ;
2424 readonly applyParams ?: (
2525 state : unknown ,
26- params : Record < string , number > ,
26+ params : Record < string , number | boolean > ,
2727 ) => void ;
2828}
2929
@@ -39,7 +39,6 @@ interface BlackmanKernelState {
3939 params : BlackmanStrategyParams ;
4040}
4141
42-
4342/**
4443 * Parameters for the Blackman interpolation strategy.
4544 *
@@ -49,12 +48,15 @@ interface BlackmanKernelState {
4948 * @property beta Blackman window beta coefficient (default: 0.5)
5049 * @property gamma Blackman window gamma coefficient (default: 0.08)
5150 */
52- export interface BlackmanStrategyParams extends Record < string , number | boolean > {
51+ export interface BlackmanStrategyParams extends Record <
52+ string ,
53+ number | boolean
54+ > {
5355 zeroCrossings : number ;
54- normalize ? : boolean ;
55- alpha ? : number ;
56- beta ? : number ;
57- gamma ? : number ;
56+ normalize : boolean ;
57+ alpha : number ;
58+ beta : number ;
59+ gamma : number ;
5860}
5961
6062const BLACKMAN_DEFAULT_PARAMS : BlackmanStrategyParams = {
@@ -75,7 +77,12 @@ function normalizeBlackmanParams(
7577 } ;
7678 const zeroCrossings = Math . max (
7779 2 ,
78- Math . min ( 8 , Math . round ( Number ( merged [ 'zeroCrossings' ] ?? defaults [ 'zeroCrossings' ] ?? 4 ) ) ) ,
80+ Math . min (
81+ 8 ,
82+ Math . round (
83+ Number ( merged [ 'zeroCrossings' ] ?? defaults [ 'zeroCrossings' ] ?? 4 ) ,
84+ ) ,
85+ ) ,
7986 ) ;
8087 const normalize = Boolean ( merged [ 'normalize' ] ) ;
8188 const alpha = Number ( merged [ 'alpha' ] ?? 0.42 ) ;
@@ -93,7 +100,10 @@ function applyBlackmanParams(
93100 }
94101 const record = state as BlackmanKernelState ;
95102 record . params = {
96- zeroCrossings : Math . max ( 2 , Math . round ( Number ( params [ 'zeroCrossings' ] ?? 4 ) ) ) ,
103+ zeroCrossings : Math . max (
104+ 2 ,
105+ Math . round ( Number ( params [ 'zeroCrossings' ] ?? 4 ) ) ,
106+ ) ,
97107 normalize : Boolean ( params [ 'normalize' ] ) ,
98108 alpha : Number ( params [ 'alpha' ] ?? 0.42 ) ,
99109 beta : Number ( params [ 'beta' ] ?? 0.5 ) ,
@@ -129,7 +139,13 @@ function normalizedSinc(x: number): number {
129139 return Math . sin ( value ) / value ;
130140}
131141
132- function blackmanWindow ( distance : number , radius : number , alpha : number , beta : number , gamma : number ) : number {
142+ function blackmanWindow (
143+ distance : number ,
144+ radius : number ,
145+ alpha : number ,
146+ beta : number ,
147+ gamma : number ,
148+ ) : number {
133149 const absDistance = Math . abs ( distance ) ;
134150 if ( absDistance >= radius ) {
135151 return 0 ;
@@ -142,11 +158,19 @@ function blackmanWindow(distance: number, radius: number, alpha: number, beta: n
142158 ) ;
143159}
144160
145- function blackmanWeight ( distance : number , radius : number , alpha : number , beta : number , gamma : number ) : number {
146- return normalizedSinc ( distance ) * blackmanWindow ( distance , radius , alpha , beta , gamma ) ;
161+ function blackmanWeight (
162+ distance : number ,
163+ radius : number ,
164+ alpha : number ,
165+ beta : number ,
166+ gamma : number ,
167+ ) : number {
168+ return (
169+ normalizedSinc ( distance ) *
170+ blackmanWindow ( distance , radius , alpha , beta , gamma )
171+ ) ;
147172}
148173
149-
150174export const blackmanKernel : InterpolationKernel = (
151175 src ,
152176 srcOffset ,
@@ -158,9 +182,16 @@ export const blackmanKernel: InterpolationKernel = (
158182 const kernelState = state as BlackmanKernelState ;
159183 const radius = kernelState . params . zeroCrossings ;
160184 const normalize = Boolean ( kernelState . params . normalize ) ;
161- const alpha = typeof kernelState . params . alpha === 'number' ? kernelState . params . alpha : 0.42 ;
162- const beta = typeof kernelState . params . beta === 'number' ? kernelState . params . beta : 0.5 ;
163- const gamma = typeof kernelState . params . gamma === 'number' ? kernelState . params . gamma : 0.08 ;
185+ const alpha =
186+ typeof kernelState . params . alpha === 'number'
187+ ? kernelState . params . alpha
188+ : 0.42 ;
189+ const beta =
190+ typeof kernelState . params . beta === 'number' ? kernelState . params . beta : 0.5 ;
191+ const gamma =
192+ typeof kernelState . params . gamma === 'number'
193+ ? kernelState . params . gamma
194+ : 0.08 ;
164195 const center = Math . floor ( position ) ;
165196 const start = center - ( radius - 1 ) ;
166197 const end = center + radius ;
0 commit comments