///|
fn sinc(x : Double) -> Double {
if x == 0.0 {
1.0
} else {
let px = @math.PI * x
@math.sin(px) / px
}
}
///|
pub fn resample_linear(
signal : ArrayView[Double],
target_length : Int,
) -> Array[Double] raise SpectrumError {
let n = signal.length()
if n == 0 {
raise EmptySignal
}
if target_length <= 0 {
raise InvalidArgument(message="target_length must be positive")
}
if target_length == 1 {
return [signal[0]]
}
if n == 1 {
return Array::make(target_length, signal[0])
}
let out = Array::make(target_length, 0.0)
let ratio = Double::from_int(n - 1) / Double::from_int(target_length - 1)
for i in 0.. Array[Double] raise SpectrumError {
let n = signal.length()
if n == 0 {
raise EmptySignal
}
if target_length <= 0 {
raise InvalidArgument(message="target_length must be positive")
}
if target_length == 1 {
return [signal[0]]
}
if n == 1 {
return Array::make(target_length, signal[0])
}
let out = Array::make(target_length, 0.0)
let ratio = Double::from_int(n - 1) / Double::from_int(target_length - 1)
for i in 0..