@@ -1673,12 +1673,12 @@ impl Periodogram {
1673
1673
) ) ;
1674
1674
}
1675
1675
let step_candidate = freqs_f64[ 1 ] - freqs_f64[ 0 ] ;
1676
- // Check if representable as a linear grid
1677
- let freq_grid_f64 = if freqs_f64. iter ( ) . tuple_windows ( ) . all ( |( x1, x2) | {
1676
+ let is_linear = freqs_f64. iter ( ) . tuple_windows ( ) . all ( |( x1, x2) | {
1678
1677
let dx = x2 - x1;
1679
1678
let rel_diff = f64:: abs ( dx / step_candidate - 1.0 ) ;
1680
1679
rel_diff < STEP_SIZE_TOLLERANCE
1681
- } ) {
1680
+ } ) ;
1681
+ let freq_grid_f64 = if is_linear {
1682
1682
if first_zero && len_is_pow2_p1 {
1683
1683
let log2_size_m1 = ( size - 1 ) . ilog2 ( ) ;
1684
1684
FreqGrid :: zero_based_pow2 ( step_candidate, log2_size_m1)
@@ -1726,6 +1726,23 @@ impl Periodogram {
1726
1726
Ok ( ( eval_f32, eval_f64) )
1727
1727
}
1728
1728
1729
+ fn power_impl < ' py , T > (
1730
+ eval : & lcf:: Periodogram < T , lcf:: Feature < T > > ,
1731
+ py : Python < ' py > ,
1732
+ t : Arr < T > ,
1733
+ m : Arr < T > ,
1734
+ ) -> Res < Bound < ' py , PyUntypedArray > >
1735
+ where
1736
+ T : Float + numpy:: Element ,
1737
+ {
1738
+ let t: DataSample < _ > = t. as_array ( ) . into ( ) ;
1739
+ let m: DataSample < _ > = m. as_array ( ) . into ( ) ;
1740
+ let mut ts = TimeSeries :: new_without_weight ( t, m) ;
1741
+ let power = eval. power ( & mut ts) . map_err ( lcf:: EvaluatorError :: from) ?;
1742
+ let power = PyArray1 :: from_vec ( py, power) ;
1743
+ Ok ( power. as_untyped ( ) . clone ( ) )
1744
+ }
1745
+
1729
1746
fn freq_power_impl < ' py , T > (
1730
1747
eval : & lcf:: Periodogram < T , lcf:: Feature < T > > ,
1731
1748
py : Python < ' py > ,
@@ -1798,6 +1815,24 @@ impl Periodogram {
1798
1815
) )
1799
1816
}
1800
1817
1818
+ /// Periodogram values
1819
+ #[ pyo3( signature = ( t, m, * , cast=false ) ) ]
1820
+ fn power < ' py > (
1821
+ & self ,
1822
+ py : Python < ' py > ,
1823
+ t : Bound < PyAny > ,
1824
+ m : Bound < PyAny > ,
1825
+ cast : bool ,
1826
+ ) -> Res < Bound < ' py , PyUntypedArray > > {
1827
+ dtype_dispatch ! (
1828
+ |t, m| Self :: power_impl( & self . eval_f32, py, t, m) ,
1829
+ |t, m| Self :: power_impl( & self . eval_f64, py, t, m) ,
1830
+ t,
1831
+ =m;
1832
+ cast=cast
1833
+ )
1834
+ }
1835
+
1801
1836
/// Angular frequencies and periodogram values
1802
1837
#[ pyo3( signature = ( t, m, * , cast=false ) ) ]
1803
1838
fn freq_power < ' py > (
@@ -1859,7 +1894,7 @@ transform : None, optional
1859
1894
1860
1895
{common}
1861
1896
freq_power(t, m, *, cast=False)
1862
- Get periodogram
1897
+ Get periodogram as a pair of frequencies and power values
1863
1898
1864
1899
Parameters
1865
1900
----------
@@ -1877,6 +1912,23 @@ freq_power(t, m, *, cast=False)
1877
1912
power : np.ndarray of np.float32 or np.float64
1878
1913
Periodogram power
1879
1914
1915
+ power(t, m, *, cast=False)
1916
+ Get periodogram power
1917
+
1918
+ Parameters
1919
+ ----------
1920
+ t : np.ndarray of np.float32 or np.float64
1921
+ Time array
1922
+ m : np.ndarray of np.float32 or np.float64
1923
+ Magnitude (flux) array
1924
+ cast : bool, optional
1925
+ Cast inputs to np.ndarray objects of the same dtype
1926
+
1927
+ Returns
1928
+ -------
1929
+ power : np.ndarray of np.float32 or np.float64
1930
+ Periodogram power
1931
+
1880
1932
Examples
1881
1933
--------
1882
1934
>>> import numpy as np
0 commit comments