Files
rspektrum/SPECTROGRAM_README.md
T

155 lines
4.5 KiB
Markdown

# Spectrogram Viewer (C/Raylib)
A real-time spectrogram viewer ported from the Unity Audio-Experiments project, with interactive region selection and audio playback.
## Features
- **Spectrogram Visualization**: Displays frequency content of audio over time using STFT
- **Time & Frequency Selection**: Select both time regions AND frequency ranges
- **Audio Playback**: Play back only the selected time region
- **Multiple Colormaps**: 6 different heat map styles
- **Adjustable Threshold**: Control the dB floor for visualization
- **Drag & Drop**: Load files by dragging them onto the window
## Building
### Linux
```bash
cd rspektrum/build
./premake5 gmake
cd ..
make
```
## Running
```bash
cd rspektrum/bin/Debug
./rspektrum
```
## Controls
| Key | Action |
|-----|--------|
| **O** | Open file dialog |
| **Drag & drop** | Load WAV file |
| **LMB Drag** | Select time region |
| **Shift+LMB Drag** | Select frequency range |
| **SPACE** | Play selected time region |
| **M** | Cycle colormap |
| **W/S** | Adjust dB floor (up/down) |
| **G** | Toggle grid overlay |
| **R** | Reset all selections to full range |
| **ESC** | Stop playback / Cancel dialog |
## File Loading
Two ways to load a WAV file:
1. **Drag & Drop**: Simply drag a `.wav` file onto the application window
2. **File Dialog**: Press **O** to open a file path input dialog
## Selection Modes
### Time Selection (Left Mouse Button)
- Click and drag horizontally to select a time range
- The non-selected areas are greyed out
- Yellow borders indicate the selection boundaries
### Frequency Selection (Shift + Left Mouse Button)
- Hold **Shift** and drag vertically to select a frequency range
- Cyan borders indicate the frequency selection
- Useful for isolating specific frequency bands
## Colormaps
Press **M** to cycle through available colormaps:
1. **Grays** - Classic grayscale
2. **Inferno** - Dark purple to bright yellow (default)
3. **Viridis** - Purple to yellow (perceptually uniform)
4. **Plasma** - Purple to yellow-orange
5. **Hot** - Black to red to yellow to white
6. **Cool** - Cyan to magenta
## Threshold Control
Use **W** and **S** keys to adjust the amplitude floor:
- **W**: Raise the floor (show only louder signals)
- **S**: Lower the floor (show quieter signals too)
The current dB floor is displayed in the bottom right corner.
## Technical Details
### STFT Parameters
- **FFT Size**: 2048 samples
- **Hop Size**: 1024 samples (50% overlap)
- **Window**: Hann window
- **Frequency Resolution**: `sampleRate / 2048` Hz per bin
### Audio Format Support
- WAV files (any sample rate)
- Automatically detected sample rate (displayed in info panel)
- 8-bit, 16-bit PCM, and 32-bit float supported
- Stereo files are converted to mono
### Display
- X-axis: Time (seconds)
- Y-axis: Frequency (Hz), scaled to actual sample rate
- Color/brightness: Amplitude in dB
## Project Structure
```
rspektrum/
├── src/
│ ├── spectrogram.c # Main application (~1000 lines)
│ └── icon.ico # Windows icon
├── libs/
│ └── ... # Optional external libraries
├── build/
│ ├── premake5.lua # Build configuration
│ └── external/ # Downloaded dependencies (raylib)
└── bin/
├── Debug/ # Debug build
└── Release/ # Release build
```
## Comparison: Unity vs C/Raylib
| Aspect | Unity Original | C/Raylib Port |
|--------|---------------|---------------|
| Lines of Code | ~2000+ (multiple files) | ~1000 (single file) |
| Build Time | Minutes | Seconds |
| Dependencies | Unity Editor, .NET | raylib only |
| GPU Acceleration | Compute shaders | CPU-based |
| Colormaps | Single gradient | 6 presets |
| Freq Selection | No | Yes |
| Startup Time | Slow | Fast |
## Tips
1. **For 16kHz audio**: The max frequency will show as 8kHz (Nyquist)
2. **Better visibility**: Use Inferno or Viridis colormap for better contrast
3. **Quiet signals**: Lower the dB floor with 'S' to see quieter content
4. **Isolate frequencies**: Use Shift+drag to focus on specific frequency bands
5. **Playback**: Only the time selection is played, full frequency range
## Future Improvements
- [ ] Logarithmic frequency scale option
- [ ] Zoom in/out on frequency axis
- [ ] Real-time microphone input
- [ ] Export selection as WAV
- [ ] Faster FFT (pffft/kissfft)
- [ ] Save/load presets
## License
Based on Unity Audio-Experiments by Sebastian Lague (Coding Adventure series)
C/Raylib port created for educational purposes.