# simple_src
A simple sample rate conversion lib for audio.
## Usage
Usually use *sinc* Converter, it is flexible and high-quality.
The *linear* Converter is not recommended unless performance is really important
and quality is not cared.
### sinc
With new method:
```rust
use simple_src::{sinc, Convert};
let samples = vec![1.0, 2.0, 3.0, 4.0];
let manager = sinc::Manager::new(2.0, 48.0, 8, 0.1).unwrap();
let mut converter = manager.converter();
for s in converter.process(samples.into_iter()) {
println!("{s}");
}
```
Or use builder:
```rust
use simple_src::{sinc, Convert};
let samples = vec![1.0, 2.0, 3.0, 4.0];
let manager = sinc::Manager::builder()
.ratio(2.0)
.attenuation(48.0)
.quantify(8)
.pass_width(0.9)
.build()
.unwrap();
let mut converter = manager.converter();
for s in converter.process(samples.into_iter()) {
println!("{s}");
}
```
For multi-channel example see [two_channels.rs](/examples/two_channels.rs).
### linear
```rust
use simple_src::{linear, Convert};
let samples = vec![1.0, 2.0, 3.0, 4.0];
let manager = linear::Manager::new(2.0).unwrap();
let mut converter = manager.converter();
for s in converter.process(samples.into_iter()) {
println!("{s}");
}
```
## Sinc parameters
Recommended initialization parameters for *sinc* converter:
| 8bit fast | 48 | 8 |
| 8bit medium | 60 | 16 |
| 8bit better | 72 | 32 |
| 16bit lower | 84 | 64 |
| 16bit fast | 96 | 128 |
| 16bit medium | 108 | 256 |
| 16bit better | 120 | 512 |
| 24bit lower | 132 | 1024 |
| 24bit fast | 144 | 2048 |
| 24bit medium | 156 | 4096 |
| 24bit better | 168 | 8192 |
The relationship between *attenuation* and *quantify* is about
*Q = 2 ^ (A / 12 - 1)*, *A = 12 + 12 * log2(Q)*.
Due to the amount of calculation and the size of LUT, A = 144 or 156 for 24bit
audio is usually fine, and for 16bit, A = 120 is enough.
## Plots
Use [plots.py](/plots.py) to show the results of conversion. It needs *numpy*, *scipy*
and *matplotlib*.
Here is an example showing the results of a downsampling 96kHz:
```
$ cargo test -r --test testwav -- --ignored --exact --show-output generate
$ cargo test -r --test sinc -- --ignored --exact --show-output ta120_2_96k_down
$ python
>>> import plots
>>> import os
>>> os.chdir('output')
>>> plots.spectrum('beep_96k_44k_s_a120_2.wav')
>>> plots.spectrogram('sweep_96k_44k_s_a120_2.wav')
>>> plots.impulse('impulse_96k_44k_s_a120_2.wav')
>>> plots.impulse('impulse_96k_44k_s_a120_2.wav', True)
```
See code in [tests](/tests/) for more details.
## References
1. Smith, J.O. Digital Audio Resampling Home Page
https://ccrma.stanford.edu/~jos/resample/.
2. Alan V. Oppenheim, Ronald W. Schafer.
Discrete-Time Signal Processing, Third Edition.