1 个稳定版本
使用旧Rust 2015
1.0.0 | 2017年2月27日 |
---|
#13 in #fm
6KB
54 行
demod_fm.rs -- FM信号解调器
此crate提供了一种简单的FM信号解调器,用于软件无线电。
使用方法
可以通过Cargo将其作为依赖项添加到Cargo.toml
[dependencies]
demod_fm = "1.0.0"
并在crate根目录中导入它
extern crate demod_fm;
lib.rs
:
此crate提供了一种简单的FM信号解调器,用于软件无线电。它使用以下描述的相位差近似进行解调。
理论
考虑经典方程[1]的FM信号
s(t) = a(t) cos(ωct + φ(t))
其中
φ(t) = ω∆∫x(τ)dτ
积分从0到t计算,x(t)是要恢复的调制信号。
对此进行微分得到
dφ(t) / dt = ω∆x(t)
因此
x(t) = ω∆-1 dφ(t) / dt
在连续时间中的微分通过离散时间中的有限差分近似,因此
x(t) ≈ ω∆-1 (φ[t] - φ[t-1]) / T
假设“标准化”周期T = 1,则变为
x(t) ≈ w∆-1 (φ[t] - φ[t-1])
这需要当前和前一次采样瞬间的相位变化,可以从相应的I/Q样本中计算得出。给定一个FM信号s(t),接收到的I/Q序列将包含以下组件
i(t) = a(t) cos φ(t)
q(t) = a(t) sin φ(t)
每个样本表示为
p(t) = i(t) + j q(t)
计算此式的复数幅角给出
arg(p(t)) = arctan[q(t) / i(t)] = arctan tan φ(t) = φ(t)
因此
arg(p(t)) - arg(p(t-1)) = φ(t) - φ(t-1)
应用复数恒等式 arg(uv) ≡ arg(u) + arg(v) (mod (-π, π]) 和 arg(u*) = -arg(u),
arg(p(t)p(t-1)*) = arg(p(t)) - arg(p(t-1)) = φ(t) - φ(t-1)
将所有这些结果结合起来,得到每个样本计算出的方程
x[t] = ω∆-1 arg(p[t]p[t - 1]*)
使用角频率偏移ω∆ = 2π f∆和当前和前一个复数样本。
参考文献
- "使用数字无线电和数字信号处理进行FM解调",J.M. Shima,
依赖项
~240KB