AM全称Amplitude Modulation(幅度调制),这是最古老的无线电通信技术之一。小时候听过的中波广播,就是典型的AM信号。它的核心思想特别直观:用声音信号的幅度去控制高频载波的幅度。就像用手电筒发摩尔斯电码,只不过这里不是简单的开关,而是让光线亮度随着声音起伏变化。
在数学表达上,AM信号可以表示为:
python复制S(t) = A[1 + m_a * v(t)] * cos(2πf_c t)
其中A是载波幅度,m_a是调制深度(建议取值0.3-0.7避免过调制),v(t)是音频信号,f_c是载波频率。我在实验室实测时发现,当调制深度超过1时,解调信号会出现严重失真——这就像把音响音量调到爆棚时的破音现象。
GNURadio的魅力在于,它把这些抽象公式变成了可视化的模块。你不需要从头写代码,只需要像搭积木一样连接各种信号处理模块。最近有个大学生在课程设计中,用GNURadio复现了1920年代的第一代AM广播系统,整个过程只用了不到20个模块。
音频源可以选择WAV文件或实时麦克风输入。这里有个坑要注意:普通音频文件的采样率通常是44.1kHz,但我们的系统采样率可能需要设为100kHz以上。我推荐先用Rational Resampler模块进行采样率转换,就像把不同制式的视频转换成统一格式。
python复制# 典型参数设置示例
audio_source = blocks.file_source(gr.sizeof_float, "test.wav")
resampler = filter.rational_resampler_fff(
interpolation=100, # 目标采样率倍数
decimation=441, # 原始采样率倍数
taps=None,
fractional_bw=None)
载波发生器是AM系统的"发动机"。建议使用Signal Source模块生成10kHz的正弦波(中波广播典型频段)。有个实用技巧:在属性面板勾选"Output Complex"可以生成复数信号,方便后续的IQ处理。我曾遇到过载波频率漂移的问题,后来发现是采样率设置不当导致的时钟不同步。
GNURadio没有现成的AM模块,但用乘法器就能自制。将音频信号加上1.0的直流偏置(防止负幅度),再用Multiply模块与载波相乘。这就好比用音频信号当"模具"来塑造载波的形状。调试时建议打开QT GUI Time Sink观察波形,正常AM信号应该像海浪一样有规律的幅度起伏。
真实的无线电传播会有噪声和衰减。推荐添加Channel Model模块模拟实际环境。关键参数设置:
在关键节点添加这些显示模块:
QT GUI Frequency Sink:观察频谱特征QT GUI Waterfall Sink:发现频率漂移QT GUI Time Sink:检查调制深度这是最简单的解调方式,只需要一个二极管和RC电路就能实现。在GNURadio中可以用Complex to Mag模块提取信号幅度,再通过Low Pass Filter滤除高频分量。但这种方法抗噪声性能较差,我在市区测试时经常听到背景杂音。
更专业的做法是采用本地振荡器同步解调:
python复制# 解调流程示例
multiplier = blocks.multiply_cc()
lo_source = analog.sig_source_c(samp_rate, analog.GR_COS_WAVE, fc, 1)
low_pass = filter.fir_filter_ccf(1, firdes.low_pass(1, samp_rate, 5000, 1000))
self.connect(input, multiplier, low_pass)
self.connect(lo_source, (multiplier, 1))
这种方法需要精确匹配发射端载波频率,我建议添加PLL Freq Det模块实现自动频率控制。
现代SDR设备常用这种方法:
Complex to I/Q分离信号FFT分析频谱特征如果听到"沙哑"的解调声音,可能是这些原因:
正常AM信号频谱应该显示:
GNURadio的强大之处在于支持运行时参数调整:
QT GUI Range控件实现滑动调节完成仿真后,可以连接真实硬件:
最后提醒:实际发射无线电信号需要遵守当地无线电管理规定。建议在实验室环境下使用衰减器控制发射功率,或者通过电缆直连的方式进行测试。