12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879# 1 "src/owl/signal/owl_signal.ml"(*
* OWL - OCaml Scientific Computing
* Copyright (c) 2016-2022 Liang Wang <liang@ocaml.xyz>
*)(** Signal processing helpers *)openOwl_denselethammingm=letopenNdarrayinletrange=(D.sequential[|m|]|>D.mul_scalar)(Owl_const.pi*.2.0/.Int.to_float(m-1))inletinter=D.cosrangeinletmulv=D.mul_scalarinter(-0.46)inD.add_scalarmulv0.54lethannm=letopenNdarrayinletrange=(D.sequential[|m|]|>D.mul_scalar)(Owl_const.pi*.2.0/.Int.to_float(m-1))inletinter=D.cosrangeinletmulv=D.mul_scalarinter(-0.5)inD.add_scalarmulv0.5letblackmanm=letopenNdarrayinletpi=Owl_const.piinlettpi=2.0*.piinletfpi=4.0*.piinletrange1=D.linspace0.tpiminletrange2=D.linspace0.fpiminletinter1=D.cosrange1inletinter2=D.cosrange2inletmulv1=D.mul_scalarinter1(-0.5)inletmulv2=D.mul_scalarinter20.08inletmulvf=D.addmulv1mulv2inletans=D.add_scalarmulvf0.42inansletresizerx=(*zero pad the array to 2*x length*)letopenNdarrayinletz=Array.make((2*x)-Array.lengthr)0.inlety=Array.appendrzinD.of_arrayy[|2*x|]|>Generic.cast_d2zletdtftrx=(*dtft for upper unit circle (i.e whole if false)*)letopenNdarrayinleta=resizerxinletb=Owl_fft.D.fftainZ.get_slice[[0;x-1]]bletdtftwrx=(*dtft for full circle (i.e whole is true)*)leta=resizerxinOwl_fft.D.fftaletfreqz?(n=512)?(whole=false)ba=(*b represents numerator array while a represent denominator array*)ifwholethen(letx=dtftwaninlety=dtftwbninNdarray.D.linspace(-1.0*.Owl_const.pi)Owl_const.pi(n+1),Ndarray.Z.divyx)else(letx=dtftaninlety=dtftbninNdarray.D.linspace0.Owl_const.pi(n+1),Ndarray.Z.divyx)