| { |
| "op": "ai.onnx.STFT", |
| "fixtureArrays": { |
| "onnx_backend_arange128_cos_window16_input_window": [1, 0.961939766, 0.853553391, 0.691341716, 0.5, 0.308658284, 0.146446609, 0.038060234, 0, 0.038060234, 0.146446609, 0.308658284, 0.5, 0.691341716, 0.853553391, 0.961939766], |
| "ort_complex_input_batched_twosided_frame_length_input_signal": [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 99, 0, 99, 0, 99, 0, 99, 0, 99, 0, 99, 0, 99, 0, 99, 0] |
| }, |
| "cases": [ |
| { |
| "name": "dispatch_cliff_rank3_over_8m_elements", |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { "dtype": "float32", "shape": [1, 2200000, 1] }, |
| "window": { "dtype": "float32", "shape": [6], "data": { "kind": "constant", "value": 1.0 } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 2199995, 4, 2], "tolerance": 0.001 } }, |
| "args": { "frameStep": 1 } |
| }, |
| { |
| "name": "many_frames_fft_twiddle_table_win64", |
| "provenance": { |
| "notes": "Exercises the shared twiddle-table FFT selected for thousands of independent transforms without making correctness coverage depend on the much larger dispatch-cliff benchmark allocation." |
| }, |
| "inputs": { |
| "signal": { "dtype": "float32", "shape": [1, 4159, 1] }, |
| "window": { "dtype": "float32", "shape": [64] } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 4096, 33, 2], "tolerance": 0.0001 } }, |
| "args": { "frameStep": 1 } |
| }, |
| { |
| "name": "many_frames_fft_twiddle_table_win64_twosided", |
| "provenance": { |
| "notes": "Twosided sibling of the twiddle-table selector above. The packed real-FFT kernel that otherwise wins at this transform count requires onesided != 0, so a full-spectrum output is what leaves the shared twiddle-table FFT as the selected route." |
| }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 4159, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.029, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [64], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.013, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 4096, 64, 2], "tolerance": 0.001, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 1 } |
| }, |
| { |
| "name": "many_frames_packed_rfft_win512_radix4", |
| "provenance": { |
| "notes": "Selector and correctness lock for the packed real N=512 path. The 4097 transforms cross the twiddle-table threshold and leave one partial four-transform workgroup on capable devices." |
| }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 4608, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.029, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [512], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.013, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 4097, 257, 2], "tolerance": 0.01, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 1 } |
| }, |
| { |
| "name": "real_window_onesided", |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 6, 1], |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } |
| }, |
| "window": { "dtype": "float32", "shape": [4], "data": { "kind": "values", "values": [0.5, 1.0, 1.0, 0.5] } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 2, 3, 2], "tolerance": 0.00002 } }, |
| "args": { "frameStep": 2 } |
| }, |
| { |
| "name": "real_subnormal_impulse_window_onesided_gpu_gap", |
| "skipGpu": { |
| "category": "permanent", |
| "reason": "Portable WGSL floating-point semantics do not guarantee preservation of the subnormal values required by this fixture. Backend evidence: Metal FTZ: subnormal 1e-40 impulse flushes to zero on GPU, every one-sided bin reads 0 instead of the subnormal value (tolerance 0)." |
| }, |
| "provenance": { |
| "source": "onnxruntime/test/providers/cpu/signal/signal_ops_test.cc", |
| "test": "SignalOpsTest.STFTFloat", |
| "notes": "Focused amplitude edge: a one-frame rectangular STFT of a subnormal impulse should preserve that value in every real one-sided bin." |
| }, |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 4, 1], |
| "data": { "kind": "values", "values": [1e-40, 0.0, 0.0, 0.0] } |
| }, |
| "window": { "dtype": "float32", "shape": [4], "data": { "kind": "values", "values": [1.0, 1.0, 1.0, 1.0] } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 1, 3, 2], "tolerance": 0 } }, |
| "args": { "frameStep": 1 } |
| }, |
| { |
| "name": "complex_twosided", |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 4, 2], |
| "data": { "kind": "values", "values": [1.0, 0.0, 2.0, 1.0, 3.0, -1.0, 4.0, 0.0] } |
| }, |
| "window": { "dtype": "float32", "shape": [2], "data": { "kind": "values", "values": [1.0, 0.5] } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 2, 2, 2], "tolerance": 0.00002 } }, |
| "args": { "frameStep": 2 } |
| }, |
| { |
| "name": "real_three_frames_window", |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 5, 1], |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0] } |
| }, |
| "window": { "dtype": "float32", "shape": [3], "data": { "kind": "values", "values": [0.25, 1.0, 0.25] } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 3, 2, 2], "tolerance": 0.00002 } }, |
| "args": { "frameStep": 1 } |
| }, |
| { |
| "name": "ort_scalar_frame_step_windowed", |
| "provenance": { |
| "source": "onnxruntime/test/providers/cpu/signal/signal_ops_test.cc", |
| "test": "SignalOpsTest.STFTFloat", |
| "notes": "Compact scalar-frame-step projection of ORT's windowed STFT test." |
| }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 6, 1], |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } |
| }, |
| "window": { "dtype": "float32", "shape": [4], "data": { "kind": "values", "values": [1.0, 1.0, 1.0, 1.0] } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 2, 3, 2], "tolerance": 0.00002 } }, |
| "args": { "frameStep": 2 } |
| }, |
| { |
| "name": "real_twosided_window", |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 6, 1], |
| "data": { "kind": "values", "values": [0.0, 1.0, 0.0, -1.0, 0.0, 1.0] } |
| }, |
| "window": { "dtype": "float32", "shape": [4], "data": { "kind": "values", "values": [1.0, 0.5, 0.5, 1.0] } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 2, 4, 2], "tolerance": 0.00002 } }, |
| "args": { "frameStep": 2 } |
| }, |
| { |
| "name": "batch2_onesided_stride2_window3", |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [2, 5, 1], |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, -1.0, 0.0, 1.0, 0.0, -1.0] } |
| }, |
| "window": { "dtype": "float32", "shape": [3], "data": { "kind": "values", "values": [0.5, 1.0, 0.25] } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [2, 2, 2, 2], "tolerance": 0.00002 } }, |
| "args": { "frameStep": 2 } |
| }, |
| { |
| "name": "single_frame_full_length_onesided", |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 4, 1], |
| "data": { "kind": "values", "values": [1.0, 0.0, -1.0, 0.0] } |
| }, |
| "window": { "dtype": "float32", "shape": [4], "data": { "kind": "constant", "value": 1.0 } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 1, 3, 2], "tolerance": 0.00002 } }, |
| "args": { "frameStep": 4 } |
| }, |
| { |
| "name": "ort_constant_64_window16", |
| "provenance": { |
| "source": "onnxruntime/test/providers/cpu/signal/signal_ops_test.cc", |
| "test": "SignalOpsTest.STFTFloat" |
| }, |
| "inputs": { |
| "signal": { "dtype": "float32", "shape": [1, 64, 1], "data": { "kind": "constant", "value": 1.0 } }, |
| "window": { "dtype": "float32", "shape": [16], "data": { "kind": "constant", "value": 1.0 } } |
| }, |
| "outputs": { |
| "output": { |
| "dtype": "float32", |
| "shape": [1, 7, 9, 2], |
| "tolerance": 0.00002, |
| "data": { |
| "kind": "values", |
| "values": [16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] |
| } |
| } |
| }, |
| "args": { "frameStep": 8 } |
| }, |
| { |
| "name": "onnx_backend_arange128_cos_window16", |
| "provenance": { "source": "cmake/external/onnx/onnx/backend/test/data/node/test_stft_with_window" }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 128, 1], |
| "data": { "kind": "linspace", "start": 0.0, "end": 127.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [16], |
| "data": { |
| "kind": "values", |
| "values": { "$ref": "#/fixtureArrays/onnx_backend_arange128_cos_window16_input_window" } |
| } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 15, 9, 2], "tolerance": 0.00025 } }, |
| "args": { "frameStep": 8 } |
| }, |
| { |
| "name": "real_batch2_twosided_stride2", |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [2, 5, 1], |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, -1.0, 0.0, 1.0, 0.0, -1.0] } |
| }, |
| "window": { "dtype": "float32", "shape": [3], "data": { "kind": "values", "values": [1.0, 0.5, 0.25] } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [2, 2, 3, 2], "tolerance": 0.00002 } }, |
| "args": { "frameStep": 2 } |
| }, |
| { |
| "name": "onnx_backend_stft_rectangular_window", |
| "provenance": { |
| "source": "cmake/external/onnx/onnx/backend/test/data/node/test_stft", |
| "notes": "Official rectangular-window fixture: window is omitted and frame_length supplies the DFT size." |
| }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 128, 1], |
| "data": { |
| "kind": "values", |
| "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0, 64.0, 65.0, 66.0, 67.0, 68.0, 69.0, 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0, 100.0, 101.0, 102.0, 103.0, 104.0, 105.0, 106.0, 107.0, 108.0, 109.0, 110.0, 111.0, 112.0, 113.0, 114.0, 115.0, 116.0, 117.0, 118.0, 119.0, 120.0, 121.0, 122.0, 123.0, 124.0, 125.0, 126.0, 127.0] |
| } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 15, 9, 2], "tolerance": 0.00025 } }, |
| "args": { "frameStep": 8, "frameLength": 16 } |
| }, |
| { |
| "name": "ort_constant_64_window16_twosided", |
| "provenance": { |
| "source": "onnxruntime/test/providers/cpu/signal/signal_ops_test.cc", |
| "test": "SignalOpsTest.STFTFloat", |
| "notes": "Two-sided projection of ORT's constant-window STFT setup; validates the full spectrum instead of the default one-sided bins." |
| }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { "dtype": "float32", "shape": [1, 64, 1], "data": { "kind": "constant", "value": 1.0 } }, |
| "window": { "dtype": "float32", "shape": [16], "data": { "kind": "constant", "value": 1.0 } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 7, 16, 2], "tolerance": 0.00025 } }, |
| "args": { "frameStep": 8 } |
| }, |
| { |
| "name": "ort_frame_length_without_window", |
| "provenance": { |
| "source": "onnxruntime/test/providers/cpu/signal/signal_ops_test.cc", |
| "test": "SignalOpsTest.STFTFloat", |
| "notes": "Covers the ONNX optional-input form where frame_length is provided and the window input is omitted." |
| }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 6, 1], |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } |
| } |
| }, |
| "outputs": { |
| "output": { |
| "dtype": "float32", |
| "shape": [1, 2, 3, 2], |
| "tolerance": 0.00002, |
| "data": { "kind": "values", "values": [10.0, 0.0, -2.0, 2.0, -2.0, 0.0, 18.0, 0.0, -2.0, 2.0, -2.0, 0.0] } |
| } |
| }, |
| "args": { "frameStep": 2, "frameLength": 4 } |
| }, |
| { |
| "name": "ort_complex_input_batched_twosided_frame_length", |
| "provenance": { |
| "source": "onnxruntime/test/providers/cpu/signal/signal_ops_test.cc", |
| "test": "SignalOpsTest.STFTFloatComplexInputBatched", |
| "notes": "Compact optional-window projection of ORT's batched complex-input STFT regression." |
| }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [2, 8, 2], |
| "data": { |
| "kind": "values", |
| "values": { "$ref": "#/fixtureArrays/ort_complex_input_batched_twosided_frame_length_input_signal" } |
| } |
| } |
| }, |
| "outputs": { |
| "output": { |
| "dtype": "float32", |
| "shape": [2, 3, 4, 2], |
| "tolerance": 0.00002, |
| "data": { |
| "kind": "values", |
| "values": [4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 396.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 396.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 396.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] |
| } |
| } |
| }, |
| "args": { "frameStep": 2, "frameLength": 4 } |
| }, |
| { |
| "name": "fft_window256_signal1024_batch2_onesided", |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [2, 1024, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.029, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.011, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [2, 4, 129, 2], "tolerance": 0.001, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 256 } |
| }, |
| { |
| "name": "fft_window512_complex_twosided_step256", |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 2048, 2], |
| "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.023, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [512], |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.007, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 7, 512, 2], "tolerance": 0.01, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 256 } |
| }, |
| { |
| "name": "ort_complex_batched_no_window_frame_length", |
| "provenance": { |
| "source": "onnxruntime/test/providers/cpu/signal/signal_ops_test.cc", |
| "test": "SignalOpsTest.STFTFloatComplexInputBatched", |
| "notes": "ORT's optional-window path uses frame_length as the rectangular-window length. This case locks the optimized no-window FFT route for batched complex input." |
| }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [2, 8, 2], |
| "data": { |
| "kind": "values", |
| "values": { "$ref": "#/fixtureArrays/ort_complex_input_batched_twosided_frame_length_input_signal" } |
| } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [2, 3, 4, 2], "tolerance": 0.00005 } }, |
| "args": { "frameStep": 2, "frameLength": 4 } |
| }, |
| { |
| "name": "ort_complex_batched_frame_offsets_twosided", |
| "provenance": { |
| "source": "onnxruntime/test/providers/cpu/signal/signal_ops_test.cc", |
| "test": "SignalOpsTest.STFTFloatComplexInputBatched", |
| "notes": "Compact projection of ORT's batched complex-input frame-offset regression." |
| }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [2, 8, 2], |
| "data": { |
| "kind": "values", |
| "values": { "$ref": "#/fixtureArrays/ort_complex_input_batched_twosided_frame_length_input_signal" } |
| } |
| }, |
| "window": { "dtype": "float32", "shape": [4], "data": { "kind": "constant", "value": 1.0 } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [2, 3, 4, 2], "tolerance": 0.00005 } }, |
| "args": { "frameStep": 2 } |
| }, |
| { |
| "name": "fft_window512_real_twosided_step256", |
| "provenance": { |
| "notes": "Real/full-spectrum coverage for the power-of-two FFT path; complements complex/twosided N=512 and real/onesided N=1024 fixtures." |
| }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 1024, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.031, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [512], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.013, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 3, 512, 2], "tolerance": 0.01, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 256 } |
| }, |
| { |
| "name": "fft_window1024_onesided_step512", |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 4096, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.027, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [1024], |
| "data": { "kind": "fillFloat32", "sinStep": 0.005, "cosStep": 0.003, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 7, 513, 2], "tolerance": 0.004, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 512 } |
| }, |
| { |
| "name": "fft_window4096_radix2_dit_onesided", |
| "provenance": { |
| "notes": "Locks the capability-selected 4096-point radix-2 DIT routes: workgroup-resident on devices with 32 KiB of shared storage, and globally staged/storage-backed on lower-limit devices." |
| }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 4096, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.027, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [4096], |
| "data": { "kind": "fillFloat32", "sinStep": 0.005, "cosStep": 0.003, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 1, 2049, 2], "tolerance": 0.04, "relTolerance": 0.0002 } |
| }, |
| "args": { "frameStep": 4096 } |
| }, |
| { |
| "name": "fft_window2048_radix2_dit_onesided_min_storage", |
| "provenance": { |
| "notes": "The in-place radix-2 rung is selected inside a BAND — rank3WindowInplaceFftFits wants window*16 > maxComputeWorkgroupStorageSize (the two-buffer form does not fit) and window*8 <= it (the in-place one does) — so the band moves with the device and no single window covers every tier. window 4096 is the band at 32768 (the adapter here); 2048 is the band at the 16384 WebGPU guaranteed minimum, which is what the min-limits tier reports. Without this sibling the rung is rendered on every low-storage tier and executed on none of them. Deliberately no requires.limits: outside its band the case is still valid, it just selects the staged rung." |
| }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 2048, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.027, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [2048], |
| "data": { "kind": "fillFloat32", "sinStep": 0.005, "cosStep": 0.003, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 1, 1025, 2], "tolerance": 0.04, "relTolerance": 0.0002 } |
| }, |
| "args": { "frameStep": 2048 } |
| }, |
| { |
| "name": "fft_window4096_radix2_dit_complex_twosided", |
| "provenance": { |
| "notes": "Exercises the complex load and full-spectrum store arms shared by the capability-selected 4096-point DIT routes." |
| }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 4096, 2], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.027, "scale": 0.2 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [4096], |
| "data": { "kind": "fillFloat32", "sinStep": 0.005, "cosStep": 0.003, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 1, 4096, 2], "tolerance": 0.05, "relTolerance": 0.0003 } |
| }, |
| "args": { "frameStep": 4096 } |
| }, |
| { |
| "name": "empty_zero_dim", |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { "dtype": "float32", "shape": [0, 6, 1], "data": { "kind": "values", "values": [] } }, |
| "window": { "dtype": "float32", "shape": [4], "data": { "kind": "values", "values": [0.5, 1.0, 1.0, 0.5] } } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [0, 2, 3, 2], "tolerance": 0 } }, |
| "args": { "frameStep": 2 } |
| }, |
| { |
| "name": "mixed_stockham_n400_real_onesided_tail25", |
| "provenance": { |
| "notes": "Real onesided 400-point mixed-radix path: 16-point shared Stockham transforms over 25 residue classes, followed by the direct radix-25 tail." |
| }, |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 880, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.021, "cosStep": 0.013, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [400], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0079, "cosStep": 0.0079, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 4, 201, 2], "tolerance": 0.01, "relTolerance": 0.001 } }, |
| "args": { "frameStep": 160 } |
| }, |
| { |
| "name": "mixed_stockham_n288_real_onesided_tail9", |
| "provenance": { |
| "notes": "Generic mixed-radix recurrence with a 32-point shared Stockham factor and radix-9 tail." |
| }, |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 432, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.023, "cosStep": 0.017, "scale": 0.7 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [288], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.007, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 2, 145, 2], "tolerance": 0.02, "relTolerance": 0.001 } }, |
| "args": { "frameStep": 144 } |
| }, |
| { |
| "name": "mixed_stockham_n400_complex_twosided", |
| "provenance": { "notes": "Complex/full-spectrum branch of the 16x25 mixed-radix decomposition." }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 400, 2], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.031, "scale": 0.3 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [400], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0079, "cosStep": 0.0079, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 1, 400, 2], "tolerance": 0.02, "relTolerance": 0.001 } }, |
| "args": { "frameStep": 400 } |
| }, |
| { |
| "name": "mixed_stockham_n480_real_twosided_tail15", |
| "provenance": { |
| "notes": "Real full-spectrum 480-point mixed-radix path: 32-point shared Stockham transforms over 15 residue classes, followed by the direct radix-15 tail." |
| }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 960, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.029, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [480], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0065, "cosStep": 0.0065, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 3, 480, 2], "tolerance": 0.02, "relTolerance": 0.001 } }, |
| "args": { "frameStep": 240 } |
| }, |
| { |
| "name": "mixed_stockham_n496_real_onesided_tail31", |
| "provenance": { |
| "notes": "Generic mixed-radix recurrence at the supported tail bound: a 16-point shared Stockham factor and radix-31 tail." |
| }, |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 744, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.031, "scale": 0.6 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [496], |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.005, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 2, 249, 2], "tolerance": 0.02, "relTolerance": 0.001 } }, |
| "args": { "frameStep": 248 } |
| }, |
| { |
| "name": "mixed_stockham_n132_real_onesided_tail33", |
| "provenance": { |
| "notes": "First tail past the unanchored bound: a 4-point shared Stockham factor and radix-33 tail, so the tail walk re-anchors exactly once." |
| }, |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 198, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.031, "scale": 0.6 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [132], |
| "data": { "kind": "fillFloat32", "sinStep": 0.031, "cosStep": 0.017, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 2, 67, 2], "tolerance": 0.02, "relTolerance": 0.001 } }, |
| "args": { "frameStep": 66 } |
| }, |
| { |
| "name": "window_and_frame_length_copresent_fft", |
| "inputs": { |
| "signal": { "dtype": "float32", "shape": [1, 64, 1], "data": { "kind": "constant", "value": 1.0 } }, |
| "window": { |
| "dtype": "float32", |
| "shape": [16], |
| "data": { |
| "kind": "values", |
| "values": { "$ref": "#/fixtureArrays/onnx_backend_arange128_cos_window16_input_window" } |
| } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 7, 9, 2], "tolerance": 0.0002 } }, |
| "args": { "frameStep": 8, "frameLength": 16 } |
| }, |
| { |
| "name": "mixed_stockham_n1000_real_twosided_tail125", |
| "provenance": { |
| "notes": "Window length 1000 factors as 8 x 125 and exercises the shared Stockham mixed-radix route after the tail-bound transition. Odd lengths 513 and 777 retain independent tiled-real coverage." |
| }, |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 2000, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0091, "cosStep": 0.0071, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [1000], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0031, "cosStep": 0.0031, "scale": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 2, 1000, 2], "tolerance": 0.05, "relTolerance": 0.002 } |
| }, |
| "args": { "frameStep": 1000 } |
| }, |
| { |
| "name": "fft_pow2_win8_drops_partial_last_frame", |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 12, 1], |
| "data": { "kind": "values", "values": [1.0, -2.0, 3.0, -4.0, 5.0, -6.0, 7.0, -8.0, 9.0, -10.0, 11.0, -12.0] } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [8], |
| "data": { "kind": "values", "values": [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3] } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 1, 5, 2], "tolerance": 0.0002, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 8 }, |
| "provenance": { |
| "notes": "The final four samples cannot fill an eight-sample frame, so ONNX floor framing emits only the complete frame at offset zero." |
| } |
| }, |
| { |
| "name": "fft_pow2_win4_complex_twosided_drops_partial_last_frame", |
| "attrs": { "onesided": 0 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 6, 2], |
| "data": { "kind": "values", "values": [1.0, 0.5, 2.0, -0.5, 3.0, 1.0, -4.0, 0.0, 5.0, -2.0, 6.0, 0.25] } |
| }, |
| "window": { "dtype": "float32", "shape": [4], "data": { "kind": "values", "values": [1.0, 0.75, 0.5, 0.25] } } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 1, 4, 2], "tolerance": 0.0002, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 4 }, |
| "provenance": { |
| "notes": "The frame at offset four would extend past the six-sample signal, so ONNX floor framing emits only the complete frame at offset zero." |
| } |
| }, |
| { |
| "name": "fft_pow2_win16_window_with_interior_zeros", |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { "dtype": "float32", "shape": [1, 32, 1], "data": { "kind": "linspace", "start": 0.0, "end": 31.0 } }, |
| "window": { |
| "dtype": "float32", |
| "shape": [16], |
| "data": { |
| "kind": "values", |
| "values": [0.0, 0.25, 0.5, 0.75, 1.0, 0.75, 0.5, 0.0, 0.0, 0.5, 0.75, 1.0, 0.75, 0.5, 0.25, 0.0] |
| } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 3, 9, 2], "tolerance": 0.0002, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 8 } |
| }, |
| { |
| "name": "dispatch_fold_fft_batch2_frames32800_win4_onesided", |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [2, 32803, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.029, "scale": 1.0 } |
| }, |
| "window": { "dtype": "float32", "shape": [4], "data": { "kind": "values", "values": [0.5, 1.0, 1.0, 0.5] } } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [2, 32800, 3, 2], "tolerance": 0.001, "relTolerance": 0.0001 } |
| }, |
| "args": { "frameStep": 1 } |
| }, |
| { |
| "name": "rank3_window_win513_nonpow2_onesided_compact", |
| "provenance": { |
| "notes": "Compact selector and correctness lock for the first non-power-of-two window above 512. Three frames exercise frame addressing; 257 bins exercise the partial second 256-frequency block." |
| }, |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 1025, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0091, "cosStep": 0.0071, "scale": 1.0 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [513], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0061, "cosStep": 0.0061, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 3, 257, 2], "tolerance": 0.02, "relTolerance": 0.001 } }, |
| "args": { "frameStep": 256 } |
| }, |
| { |
| "name": "rank3_window_win777_tiled_real_generic", |
| "provenance": { "notes": "Non-513 correctness lock for the storage-bounded tiled real STFT path." }, |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 777, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0067, "cosStep": 0.0091, "scale": 0.5 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [777], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0041, "cosStep": 0.0051, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "output": { "dtype": "float32", "shape": [1, 1, 389, 2], "tolerance": 0.04, "relTolerance": 0.002 } }, |
| "args": { "frameStep": 777 } |
| }, |
| { |
| "name": "rank3_window_fft8192_storage_generic", |
| "provenance": { |
| "notes": "Non-4096 correctness lock for the geometry-derived large radix-2 FFT; device storage capacity selects the single-dispatch or globally staged implementation." |
| }, |
| "attrs": { "onesided": 1 }, |
| "inputs": { |
| "signal": { |
| "dtype": "float32", |
| "shape": [1, 8192, 1], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0045, "cosStep": 0.0085, "scale": 0.25 } |
| }, |
| "window": { |
| "dtype": "float32", |
| "shape": [8192], |
| "data": { "kind": "fillFloat32", "sinStep": 0.0025, "cosStep": 0.0015, "scale": 0.5, "offset": 0.5 } |
| } |
| }, |
| "outputs": { |
| "output": { "dtype": "float32", "shape": [1, 1, 4097, 2], "tolerance": 0.08, "relTolerance": 0.0005 } |
| }, |
| "args": { "frameStep": 8192 } |
| } |
| ] |
| } |
|
|