c5234d5799
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
155 lines
4.5 KiB
Markdown
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.
|