import { FAMILY_LABELS, type FilterFamily, type FilterSpec } from '../model/filters' export interface ControlsProps { sigma: number setSigma: (v: number) => void sampleRateHz: number setSampleRateHz: (v: number) => void spec: FilterSpec setSpec: (v: FilterSpec) => void dither: boolean setDither: (v: boolean) => void } function formatHz(hz: number): string { return hz >= 1000 ? `${(hz / 1000).toFixed(hz >= 10000 ? 0 : 1)} kHz` : `${Math.round(hz)} Hz` } /** A slider that is linear in log10 of its value. */ function LogSlider(props: { label: string value: number min: number max: number display: string onChange: (v: number) => void }) { const lo = Math.log10(props.min) const hi = Math.log10(props.max) return (
props.onChange(10 ** Number(e.target.value))} />
) } export default function Controls(p: ControlsProps) { const { spec } = p const nyquist = p.sampleRateHz / 2 const sinc = spec.family === 'lowpass' || spec.family === 'bandpass' return (
p.setSigma(Number(v.toPrecision(3)))} />
{spec.family === 'bandpass' && ( p.setSpec({ ...spec, lowHz: Math.round(v) })} /> )} {sinc && ( p.setSpec({ ...spec, highHz: Math.round(v) })} /> )} {sinc && (
p.setSpec({ ...spec, taps: Number(e.target.value) })} />
)} {spec.family === 'movingAverage' && (
p.setSpec({ ...spec, width: Number(e.target.value) })} />
)}
p.setDither(e.target.checked)} />
) }