121 lines
2.7 KiB
Rust
121 lines
2.7 KiB
Rust
extern crate hound;
|
|
|
|
mod utils;
|
|
mod sinegen;
|
|
mod firfilter;
|
|
mod resamplers;
|
|
mod mixer;
|
|
mod amdemod;
|
|
|
|
use utils::float_sample_iterator;
|
|
use sinegen::SineGenerator;
|
|
use firfilter::FIRFilter;
|
|
use mixer::Mixer;
|
|
use amdemod::SquaringAMDemodulator;
|
|
|
|
|
|
fn main() {
|
|
let carrier_freq = 2400.0;
|
|
let sample_freq = 48000.0;
|
|
|
|
let mut reader = match hound::WavReader::open("noaa19_20160814_mono.wav") {
|
|
Err(e) => panic!("Could not open inputfile: {}", e),
|
|
Ok(r) => r
|
|
};
|
|
|
|
if reader.spec().channels != 1 {
|
|
panic!("Expected a mono file");
|
|
}
|
|
|
|
let sample_rate = reader.spec().sample_rate;
|
|
println!("Samplerate: {}", sample_rate);
|
|
|
|
println!("{} Samples", reader.len());
|
|
|
|
let samples = float_sample_iterator(&mut reader);
|
|
|
|
let coeffs = vec![ -7.383784e-03,
|
|
-3.183046e-03,
|
|
2.255039e-03,
|
|
7.461166e-03,
|
|
1.091908e-02,
|
|
1.149109e-02,
|
|
8.769802e-03,
|
|
3.252932e-03,
|
|
-3.720606e-03,
|
|
-1.027446e-02,
|
|
-1.447403e-02,
|
|
-1.486427e-02,
|
|
-1.092423e-02,
|
|
-3.307958e-03,
|
|
6.212477e-03,
|
|
1.511364e-02,
|
|
2.072873e-02,
|
|
2.096037e-02,
|
|
1.492345e-02,
|
|
3.347624e-03,
|
|
-1.138407e-02,
|
|
-2.560252e-02,
|
|
-3.507114e-02,
|
|
-3.591225e-02,
|
|
-2.553830e-02,
|
|
-3.371569e-03,
|
|
2.882645e-02,
|
|
6.711368e-02,
|
|
1.060042e-01,
|
|
1.394643e-01,
|
|
1.620650e-01,
|
|
1.700462e-01,
|
|
1.620650e-01,
|
|
1.394643e-01,
|
|
1.060042e-01,
|
|
6.711368e-02,
|
|
2.882645e-02,
|
|
-3.371569e-03,
|
|
-2.553830e-02,
|
|
-3.591225e-02,
|
|
-3.507114e-02,
|
|
-2.560252e-02,
|
|
-1.138407e-02,
|
|
3.347624e-03,
|
|
1.492345e-02,
|
|
2.096037e-02,
|
|
2.072873e-02,
|
|
1.511364e-02,
|
|
6.212477e-03,
|
|
-3.307958e-03,
|
|
-1.092423e-02,
|
|
-1.486427e-02,
|
|
-1.447403e-02,
|
|
-1.027446e-02,
|
|
-3.720606e-03,
|
|
3.252932e-03,
|
|
8.769802e-03,
|
|
1.149109e-02,
|
|
1.091908e-02,
|
|
7.461166e-03,
|
|
2.255039e-03,
|
|
-3.183046e-03,
|
|
-7.383784e-03];
|
|
|
|
|
|
let demod = SquaringAMDemodulator::from(samples);
|
|
let filter = FIRFilter::from(demod, coeffs);
|
|
|
|
let spec = hound::WavSpec {
|
|
channels: 1,
|
|
sample_rate: 48000,
|
|
bits_per_sample: 32,
|
|
sample_format: hound::SampleFormat::Int,
|
|
};
|
|
let mut writer = hound::WavWriter::create("demod.wav", spec).unwrap();
|
|
|
|
|
|
for sample in filter {
|
|
//println!("{}", sample);
|
|
|
|
let amplitude = (i32::max_value() as f32) * 0.8; //About 1dB headroom
|
|
writer.write_sample((sample * amplitude) as i32).unwrap();
|
|
}
|
|
}
|