point_spectrum — ONED signal op

• 데이터 종류: positions → table

• 호출: import fullseye as fs; fs.ledger.point_spectrum(positions, extent=None, n_freq=2048, f_max=None, method='direct', weights=None, bins_per_period=8)(구현을 직접 호출하려면 import dsp; dsp.point_spectrum(positions, extent=None, n_freq=2048, f_max=None, method='direct', weights=None, bins_per_period=8), 원장에서 가져오려면 ops1d.get("point_spectrum"))

사용법

> 이 연산자의 설명은 아직 번역이 없습니다. 원문을 그대로 싣습니다.

Periodogram of event positions — defects, impacts, counts, arrivals.

spectrum needs an evenly sampled signal, but a great deal of industrial data arrives as a *list of positions*: where each defect was on the web, when each particle was counted, at what angle each dent sits. The usual workaround is to histogram the positions and FFT the histogram, which works but hides two choices — bin width and record length — that decide the answer. This operator makes both explicit and returns them.

*method* picks the estimator:

"direct"

the point-process (Bartlett) periodogram

|sum_j w_j exp(-2 pi i f x_j) - rate * integral|^2 / sum_j w_j,

evaluated at each requested frequency. No binning at all, so no bin

width to choose and no aliasing from one. The subtracted term is the

contribution a *uniform* process of the same rate would make; without it

every spectrum peaks at f -> 0 simply because events exist.

"binned"

histogram the positions, then rfft, with the bin width set so the

finest frequency asked for still gets bins_per_period samples per

cycle. Cheaper for very many events, and the result is what a

histogram-and-FFT pipeline would have produced.

The frequency resolution is a property of the record, not of the method. Two periods closer than 1/extent apart cannot be told apart by either estimator, and the returned dict says so in resolution: read it before reading a peak, not after.

A periodic train of events is a comb, not a line. Its harmonics at k/period are as tall as the fundamental, so argmax of this spectrum routinely returns period/k rather than the period. Measured on 93 events (43 spaced 471.24 apart with 1.5 of jitter, plus 50 uniformly random) over a record of 20000: the global maximum lands on 58.90 with direct (the 8th harmonic) and 52.35 with binned (the 9th), while the fundamental is present and prominent in both — direct puts 0.947 of the maximum power at 1/471.24, binned 0.379. Take the lowest frequency whose first few harmonics *all* stand, rather than the tallest line — see examples/poc_web_roll_periodicity.py, which is what this operator was added for.

Returns a dict: freq (cycles per unit of *positions*), power, resolution (1/extent), extent, n_events, method, and bin_width (None for "direct").

Fail-closed: fewer than two events raises ValueError — a periodogram of one point is not a weak measurement, it is not a measurement.

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

• poc_web_roll_periodicity — py -3.11 examples/poc_web_roll_periodicity.py

타입이 이어지는 다음 연산자(table 를 입력으로 받는 것)

—

같은 카테고리(signal)

lowpass · highpass · bandpass · envelope · rms · local_std · quantize · companding_mu_law


*Provenance: dsp.py — ONED 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.