annotate src/lib/signal/mixer.rs @ 24:daa09aecdc40 default tip

lib: rename phase_shift to sample_shift Instead of tracking the phase shift in signals, we should track the sample shift (i.e., delay) of the signal. The sample shift is a constant regardless of the frequency - unlike phase shift. This simplifies the tracking considerably.
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Thu, 15 Apr 2021 22:26:06 -0400
parents 2d5ae243921c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
1 /*
24
daa09aecdc40 lib: rename phase_shift to sample_shift
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 23
diff changeset
2 * Copyright (c) 2020-2021 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
6
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
3 *
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
5 * of this software and associated documentation files (the "Software"), to deal
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
6 * in the Software without restriction, including without limitation the rights
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
8 * copies of the Software, and to permit persons to whom the Software is
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
9 * furnished to do so, subject to the following conditions:
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
10 *
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
11 * The above copyright notice and this permission notice shall be included in
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
12 * all copies or substantial portions of the Software.
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
13 *
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
20 * SOFTWARE.
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
21 */
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
22
8
7d88dd4875f2 lib: implement multiplication of two signals as mixing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 6
diff changeset
23 use std::ops::Mul;
7d88dd4875f2 lib: implement multiplication of two signals as mixing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 6
diff changeset
24
9
267326c24a1e lib: implement multiplication of a signal by a scalar as a gain
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 8
diff changeset
25 use crate::{IQSample, Scalar};
6
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
26 use super::Signal;
9
267326c24a1e lib: implement multiplication of a signal by a scalar as a gain
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 8
diff changeset
27 use super::Gain;
6
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
28
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
29 pub struct Mixer<T: Signal, U: Signal> {
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
30 rate: u64,
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
31 /* TODO: freq */
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
32 lhs: T,
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
33 rhs: U,
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
34 }
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
35
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
36 impl<T: Signal, U: Signal> Mixer<T, U> {
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
37 pub fn new(lhs: T, rhs: U) -> Mixer<T, U> {
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
38 if lhs.sample_rate() != rhs.sample_rate() {
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
39 panic!("sample rate mismatch: {} {}", lhs.sample_rate(), rhs.sample_rate());
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
40 }
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
41
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
42 Mixer {
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
43 rate: lhs.sample_rate(),
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
44 lhs: lhs,
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
45 rhs: rhs,
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
46 }
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
47 }
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
48 }
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
49
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
50 impl<T: Signal, U: Signal> Signal for Mixer<T, U> {
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
51 fn sample_rate(&self) -> u64 {
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
52 self.rate
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
53 }
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
54
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
55 fn sample_size(&self) -> usize {
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
56 std::mem::size_of::<IQSample>()
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
57 }
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
58
24
daa09aecdc40 lib: rename phase_shift to sample_shift
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 23
diff changeset
59 fn sample_shift(&self) -> u64 {
6
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
60 panic!("TODO");
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
61 }
14
d312acc19ef7 lib: add phase shift tracking to Signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 12
diff changeset
62
24
daa09aecdc40 lib: rename phase_shift to sample_shift
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 23
diff changeset
63 fn freq(&self) -> u64 {
14
d312acc19ef7 lib: add phase shift tracking to Signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 12
diff changeset
64 panic!("TODO");
d312acc19ef7 lib: add phase shift tracking to Signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 12
diff changeset
65 }
6
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
66 }
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
67
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
68 impl<T: Signal, U: Signal> Iterator for Mixer<T, U> {
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
69 type Item = IQSample;
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
70
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
71 fn next(&mut self) -> Option<Self::Item> {
12
f33b11324cc1 lib: remove Option matching abuse from Mixer::next
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 9
diff changeset
72 Some(self.lhs.next()? * self.rhs.next()?)
6
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
73 }
527d411fb83c lib: implement Mixer signal
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
74 }
8
7d88dd4875f2 lib: implement multiplication of two signals as mixing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 6
diff changeset
75
23
2d5ae243921c lib: move signal math into a common macro
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
76 include!("math.rs");
2d5ae243921c lib: move signal math into a common macro
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
77 signal_math!(Mixer<Signal, Signal>);