Mercurial > dsp > rdsp
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 |
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>); |