如何从 FM 调制(复合信号)中恢复复数值(下变频)?

信息处理 调制 解调
2022-01-30 21:26:21

如何从 FM 调制器的输出中恢复复杂的 IQ 数据。我已经正确组合了我的信号并对它们执行了 FM 调制,现在我正在寻找一种方法来找到对应于 FM 调制器的每个样本输出的 IQ 值?

我正在为我的信号编写一个调制器来测试我的解调器的性能,我的解调器依赖于它从收音机接收的复杂样本。

换句话说,我如何执行调谐收音机中发生的下变频以产生 IQ 数据?

2个回答

我不太确定您是否在问如何执行解调或如何在解调之前将某个中频的信号下混到基带。我会先假设。

如果您有调制信号,则很容易执行解调并恢复原始信号。

只需取延迟鉴别器输出的角度(atan2)。如果您关心效率,您可以对您的实施更加感兴趣。示例 python 代码如下所示:

# Calculate the complex vector between two adjacent data points
vectorDiff = data[1::1] * np.conjugate(data[0:-1:1]);
# Record the angle of the complex difference vectors
fmDemod = np.angle(tmp);

我最近写了一篇博客文章,详细介绍了我使用 Python 编写的 FM 解调器。这是一个链接我用这个项目作为学习python和numpy的借口。

** 编辑 ** 在 FM 解调之前使用希尔伯特变换执行下转换的快速而肮脏的方法(在 python 中)

# Import the plotting library
from matplotlib import pyplot as plot
import scipy.signal
import numpy as np

# Define the setup
fCarrier = 10;
fAudio = 1;
fs = 1000;
timeEnd = 1;
time = np.linspace(0,2,fs*timeEnd);

# Create the signals
carrier = np.sin(2*np.pi*fCarrier*time);
audio = np.sin(2*np.pi*fAudio*time);
audioInt = -np.cos(2*np.pi*fAudio*time);
freqMod = np.sin(2*np.pi*fCarrier*time + 2*np.pi*1*audioInt);

# Downconvert
analyticSignal = scipy.signal.hilbert(freqMod); # wikipedia analytic signal
baseband = analyticSignal * np.exp(-2*np.pi*fCarrier*time*1j); # complex mixing
audioDemod = np.angle( baseband[1::1] * np.conjugate(baseband[0:-1:1]) ); # fm demod

要添加到@dswiston答案:

# Calculate the complex vector between two adjacent data points
vectorDiff = data[1::1] * np.conjugate(data[0:-1:1]);
# Record the angle of the complex difference vectors
fmDemodPhase = np.angle(vectorDiff);

值得添加另一条将相位角与绝对频率相关联的线:

fm = (fmDemodPhase * SampleRate) / (2 * np.pi)

这给出了一个绝对频率。