AM调制原理及GNURadio仿真
AM, 英文全称为 Amplitude Modulation, 通过改变载波的幅度来携带信息,使用数学公式表示如下:
S
(
t
)
=
A
(
1
+
m
a
v
Ω
)
c
o
s
(
w
c
t
)
S(t)=A(1+m_{a}v_{\Omega })cos(w_{c}t)
S(t)=A(1+mavΩ)cos(wct)
其中,ma为调制深度,vΩ为调制源,cos(wct)为高频载波信号;
如果使用正交调制实现AM调制,只需要令:
I
(
t
)
=
1
+
m
a
v
Ω
I(t)=1+m_{a}v_{\Omega}
I(t)=1+mavΩ
Q ( t ) = 0 Q(t)=0 Q(t)=0
因此AM调制在GNURadio下虽然没有直接使用的模块,在十分容易自己生成。下面对应的是使用单音源生成的AM信号及其解调,将调制源由单音更换为wav文件,就可以使用音频对AM信号进行调制。(注:第二个Signal Source使用模拟10k载波)
使用单音源调制的AM信号的频谱图如下(注:上方的图为解调之后音频,仍未5kHz,图2为1次重采样之后,主峰和边带频率差之2.2k),非常的容易分辨,AM信号具有3个峰,分别是中间的主峰和两边的两个边带,其中中间的主峰为载波信号,两个边带分为携带信息的信号,并且两个边带携带的信息相同,主峰和边带之间的频率差即为单音的调制频率。(注意:因为一般播放音频的采样率为44.1k,为了匹配整个流程的100k的采样率,需要对数据进行重采样,接收之后,重新恢复到44.1k即可,重采样之后的5k的单音频率为5*441/1000=2.205k,所以频谱图上看到的边带和主峰之间的频率差为2.205k)
AM单音调制之后的时域图如下(下方的图),其主要特点是时域的幅度跟随调制源信号的幅度不断变化;
AM信号的解调非常的简单,这里采用相干解调的方法。首先采用相干解调(混频之后,低通滤波)之后,得到AM的基带的IQ数据,之后对IQ归一化之后,求平方和,减掉1即为调制源信号。这种解调方式可以有效防止混频中由于发送方和接收方时钟有所偏差产生的频差。
AM解调的代码可见于GNURadio的源码,am_demod.py.
#此处求复数的幅度大小,相当于求解 I2+Q2,注意求解之前需要将IQ进行归一化
MAG = blocks.complex_to_mag()
#将归一化之后的幅值向下搬 -1
DCR = blocks.add_const_ff(-1.0)
#音频滤波
audio_taps = filter.optfir.low_pass(0.5, # Filter gain
channel_rate, # Sample rate
audio_pass, # Audio passband
audio_stop, # Audio stopband
0.1, # Passband ripple
60) # Stopband attenuation
LPF = filter.fir_filter_fff(audio_decim, audio_taps)
self.connect(self, MAG, DCR, LPF, self)
好了,AM调制、解调,就梳理到这里,欢迎各位讨论交流,批评指正。