Fix STFT complex input frame offsets (#28961)
### Description
Fix STFT frame pointer arithmetic for complex-valued input so frame
starts are computed in input samples, not trailing real/imag components.
Since the frame view pointer is `U*`, one pointer increment advances one
full real or complex sample.
Also add validation that `frame_step` is positive and keep a defensive
bounds check before creating non-owning tensor views.
Review feedback addressed: simplified the frame pointer arithmetic,
fixed the swapped STFT input comments, documented the defensive bounds
check, and added double-complex regression coverage. The new STFT
validation/regression tests exclude `kDmlExecutionProvider` because
these CPU STFT validation/regression paths do not consistently match
DirectML behavior in Windows GPU CI.
### Motivation and Context
For complex input shaped `[batch_size, signal_length, 2]`, pointer
increments already advance by one real/imag pair. Multiplying frame
offsets by `signal_components == 2` again can advance past the valid
frame start, allowing later frames to read across batches or beyond the
input allocation.
### Testing
- `git diff --check -- onnxruntime/core/providers/cpu/signal/dft.cc
onnxruntime/test/providers/cpu/signal/signal_ops_test.cc`
- `.\.venv\Scripts\python.exe tools\ci_build\build.py --config
RelWithDebInfo --build --parallel --target onnxruntime_provider_test
--build_dir build\Windows`
- `.\onnxruntime_provider_test.exe
--gtest_filter="SignalOpsTest.STFTFloat:SignalOpsTest.STFTFrameStepMustBePositive:SignalOpsTest.STFTFloatComplexInputBatched:SignalOpsTest.STFTDoubleComplexInputBatched"`
from `build\Windows\RelWithDebInfo\RelWithDebInfo`
---------
Co-authored-by: Gopalakrishnan Nallasamy <gnallasamy@microsoft.com>