软件定义无线电实战入门 第5篇:接收机工作原理与FM收音机

摘要

本文将深入剖析接收机的内部工作机制,并带你从AM接收机升级到FM收音机。你将理解调谐技术的深入原理、复数混频的数学基础、FM调制的独特优势,以及如何构建一个功能完整的FM收音系统。这是你掌握SDR接收技术的关键一步。

学习目标

阅读完本文后,你将能够:

  • 深入理解AM接收机:分析每个处理阶段的作用和参数设置
  • 掌握复数混频:理解IQ信号的数学原理和工程应用
  • 理解FM调制原理:认识FM与AM的本质区别和性能差异
  • 实现FM解调:使用GNU Radio的FM解调模块
  • 构建FM收音机:将AM接收机改造为FM收音系统
  • 优化接收性能:通过参数调整改善音质和选择性

一、AM接收机深度剖析

在第3篇中我们构建了第一个AM接收机,现在让我们深入理解每个组件的工作原理。

1.1 完整信号流分析

让我们追踪信号从输入到输出的完整变换过程。

flowchart TD
    subgraph AM_Flow[AM接收机信号流]
        direction TB
        Stage1["阶段1: 数据源<br/>File Source<br/>输出: Complex IQ"]
        Stage2["阶段2: 调谐<br/>Signal Source + Multiply<br/>频率搬移到基带"]
        Stage3["阶段3: 滤波<br/>Low Pass Filter<br/>提取目标电台"]
        Stage4["阶段4: 解调<br/>AM Demod<br/>提取音频包络"]
        Stage5["阶段5: 重采样<br/>Rational Resampler<br/>转换采样率"]
        Stage6["阶段6: 输出<br/>Audio Sink<br/>播放声音"]
    end

    subgraph Signal_Evolution[信号演变]
        RF["RF信号:<br/>中心频率 ~900kHz<br/>带宽 ~10kHz<br/>类型: Complex"]
        BB["基带信号:<br/>中心频率 0Hz<br/>带宽 ~10kHz<br/>类型: Complex"]
        Audio["音频信号:<br/>中心频率 0Hz<br/>带宽 ~5kHz<br/>类型: Float"]

        RF -->|调谐后| BB
        BB -->|解调后| Audio
    end

    subgraph Purpose[每个阶段的目的]
        P1["数据源: 提供原始RF数据"]
        P2["调谐: 选择目标电台"]
        P3["滤波: 去除其他电台"]
        P4["解调: 提取音频信息"]
        P5["重采样: 匹配音频设备"]
        P6["输出: 呈现给用户"]

        Stage1 -.->|实现| P1
        Stage2 -.->|实现| P2
        Stage3 -.->|实现| P3
        Stage4 -.->|实现| P4
        Stage5 -.->|实现| P5
        Stage6 -.->|实现| P6
    end

    AM_Flow -.->|信号| Signal_Evolution
    AM_Flow -.->|功能| Purpose

    style Stage2 fill:#fff9c4
    style Stage3 fill:#c8e6c9
    style Stage4 fill:#bbdefb

图表讲解:这张图展示了AM接收机的完整数据流和每个阶段的作用。RF数据从File Source进入,包含整个频段的多个电台。调谐阶段将目标电台移到基带(零频附近),其他电台被移到不同的频率位置。滤波阶段只保留基带附近的频率(目标电台),滤除其他所有电台。解调阶段从载波中提取音频包络,将复数信号转换为实数音频。重采样阶段将采样率从SDR的高速率(MHz级别)降低到音频速率(kHz级别)。最后,音频输出将信号送到扬声器播放。理解这个流程对于诊断问题和优化性能至关重要。

1.2 调谐的数学原理

让我们用数学的语言描述调谐过程。

flowchart TD
    subgraph Tuning_Math[调谐数学原理]
        direction TB
        Input_Sig["输入信号<br/>s(t) = A·cos(2πf_c t + φ)"]
        LO_Sig["本地振荡<br/>lo(t) = e^(-j2πf_LO t)"]
        Mix_Out["混频输出<br/>s(t) × lo(t)"]
    end

    subgraph Euler[欧拉公式展开]
        Cosine["cos(θ) = (e^jθ + e^-jθ)/2<br/>余弦函数"]
        Complex["e^jθ = cos(θ) + j·sin(θ)<br/>复指数"]
        Result["余弦 × 复指数<br/>= 两项之和"]

        Cosine --> Complex
        Complex --> Result
    end

    subgraph Frequency_Domain[频域分析]
        Input_F["输入频谱:<br/>载波在 ±f_c"]
        LO_F["LO频谱:<br/>只在 -f_LO"]
        Output_F["输出频谱:<br/>在 f_c - f_LO<br/>和 f_c + f_LO"]

        Input_F --> Output_F
        LO_F --> Output_F
    end

    Tuning_Math -.->|基于| Euler
    Tuning_Math -.->|理解| Frequency_Domain

    style Mix_Out fill:#c8e6c9
    style Output_F fill:#c8e6c9

图表讲解:调谐的数学基础是复数乘法。输入信号是一个实数余弦波,按照欧拉公式可以表示为两个复指数的和(正频率和负频率各一个)。本地振荡是一个复指数信号,只有负频率成分(这是我们的选择,也可以用正频率)。乘积的结果是输入信号的所有频率分量都减去LO频率。如果输入信号包含一个f_c的载波,我们设置f_LO = f_c,输出就会包含0Hz(基带)和2f_c(和频)两个分量。后续的低通滤波器会滤除2f_c分量,只保留基带。这就是调谐将目标电台移到基带的数学原理。


二、复数混频与IQ信号

复数混频是SDR的核心技术,理解它对于掌握SDR至关重要。

2.1 实数信号与复数信号

实数信号和复数信号在频域有根本的不同。

flowchart TD
    subgraph Real_Signal[实数信号特性]
        direction TB
        Real_Time["时域: 实数值<br/>只有一个数值"]
        Real_Freq["频域: 对称<br/>正负频率相同"]
        Real_Info["信息: 有冗余<br/>正负频率包含相同信息"]
    end

    subgraph Complex_Signal[复数信号特性]
        direction TB
        Complex_Time["时域: 复数值<br/>I + jQ"]
        Complex_Freq["频域: 不对称<br/>只有正频率或负频率"]
        Complex_Info["信息: 无冗余<br/>独立信息在I和Q"]
    end

    subgraph IQ_Deconstruct["IQ分量含义"]
        I_Comp["I (同相):<br/>实部<br/>与参考同相"]
        Q_Comp["Q (正交):<br/>虚部<br/>与参考90°相差"]
        Together["合起来:<br/>完整描述信号<br/>幅度和相位"]

        I_Comp --> Together
        Q_Comp --> Together
    end

    Real_Signal -.->|扩展| Complex_Signal
    Complex_Signal -.->|由| IQ_Deconstruct

    style Real_Freq fill:#ffcdd2
    style Complex_Freq fill:#c8e6c9
    style Together fill:#e1f5fe

图表讲解:实数信号在每个时刻只有一个值(电压),频谱是对称的——正频率和负频率有相同的幅度。这意味着实数信号有一半的信息是冗余的。复数信号在每个时刻有两个值(I和Q),频谱可以是不对称的——我们可以只有正频率或只有负频率。I分量是信号的”实部”,Q分量是”虚部”。从物理角度看,I和Q是两个幅度相同但相位相差90度的信号。复数信号的独特之处在于它可以表示任意的幅度和相位,而不需要额外的载波参考。这就是为什么IQ采样是SDR的标准——它保留了信号的完整信息。

2.2 复数混频的优势

复数混频相比实数混频有关键优势。

flowchart TD
    subgraph Complex_Mixing[复数混频优势]
        direction TB
        No_Image["无镜像频率问题<br/>单边带处理"]
        Full_Phase["保留相位信息<br/>完整信号描述"]
        Efficient["频谱效率高<br/>不需要重复信息"]
    end

    subgraph Real_Mixing_Problem[实数混频问题]
        Real_In["实数输入<br/>包含 ±f_c"]
        Real_LO["实数本振<br/>cos(ω_LO t)"]
        Real_Out["实数输出<br/>包含 |f_c ± f_LO|"]
        Image["镜像干扰:<br/>无法区分<br/>f_c - f_LO 和 f_LO - f_c"]

        Real_In --> Real_Out
        Real_LO --> Real_Out
        Real_Out --> Image
    end

    subgraph Solution[复数混频解决方案]
        C_In["复数输入<br/>包含 ±f_c"]
        C_LO["复数本振<br/>e^(-jω_LO t)"]
        C_Out["复数输出<br/>只在 f_c - f_LO"]
        No_Issue["无镜像问题:<br/>单边带输出<br/>清晰分离"]

        C_In --> C_Out
        C_LO --> C_Out
        C_Out --> No_Issue
    end

    Real_Mixing_Problem -.->|问题| Complex_Mixing
    Solution -.->|解决| Complex_Mixing

    style No_Image fill:#c8e6c9
    style Image fill:#ffcdd2
    style No_Issue fill:#c8e6c9

图表讲解:实数混频的致命问题是镜像频率。假设你想接收900kHz的电台,使用900kHz的实数本振混频。输出会包含两个分量:900kHz - 900kHz = 0Hz(想要的)和900kHz + 900kHz = 1800kHz(不想要的)。这还OK,因为滤波器可以滤除1800kHz。但问题是:如果你的输入还有一个1800kHz的电台,它混频后也会产生1800kHz - 900kHz = 900kHz的分量!这个”镜像”电台会干扰目标电台。复数混频没有这个问题,因为复数本振只有一个频率成分(负频率),只产生一个差频分量,镜像频率不会出现。

2.3 IQ信号的物理意义

I和Q分量有直观的物理解释。

flowchart TD
    subgraph IQ_Phys[IQ信号的物理意义]
        direction TB
        Vector["矢量表示<br/>信号 = 矢量<br/>有长度和方向"]
        Length["长度 = 幅度<br/>√(I² + Q²)"]
        Angle["方向 = 相位<br/>arctan(Q/I)"]
        Rotate["矢量旋转<br/>变化率 = 频率"]
    end

    subgraph IQ_Example[IQ示例]
        DC["直流:<br/>I=常数, Q=0<br/>矢量不旋转"]
        Cosine["余弦波:<br/>I=cos(ωt), Q=0<br/>矢量左右摆动"]
        Sine["正弦波:<br/>I=0, Q=sin(ωt)<br/>矢量上下摆动"]
        Complex["复指数:<br/>I=cos(ωt), Q=sin(ωt)<br/>矢量匀速旋转"]

        DC -.->|0Hz| Vector
        Cosine -.->|振动| Vector
        Sine -.->|振动| Vector
        Complex -.->|旋转| Vector
    end

    subgraph Visualization[可视化]
        V1["I横轴<br/>Q纵轴<br/>信号 = 矢量端点"]
        V2["旋转速度 = 频率<br/>快 = 高频"]
        V3["矢量长度 = 幅度<br/>长 = 强信号"]

        V1 --> V2
        V2 --> V3
    end

    IQ_Phys -.->|理解| IQ_Example
    IQ_Example -.->|可视化| Visualization

    style Vector fill:#bbdefb
    style Complex fill:#c8e6c9

图表讲解:IQ信号可以想象为二维平面上的旋转矢量。I是横轴(x轴),Q是纵轴(y轴)。信号的每个样本对应矢量的一个位置。矢量长度是信号幅度(√(I² + Q²)),矢量角度是信号相位(arctan(Q/I))。对于恒定频率的信号,矢量以恒定速度旋转——旋转速度就是信号频率。直流信号(0Hz)的矢量不旋转,固定在一个位置。正弦波和余弦波是特例:余弦波只在I轴上振动(Q=0),正弦波只在Q轴上振动(I=0)。一般的复指数信号(e^jωt)对应匀速旋转的矢量,I和Q都是正弦波,相位相差90°。


三、从AM到FM:调制方式的升级

FM(调频)与AM(调幅)有本质的区别,带来了显著的性能优势。

3.1 AM与FM的本质区别

让我们深入对比两种调制方式。

flowchart TD
    subgraph Modulation_Compare[AM vs FM 对比]
        direction TB
        AM_Mod["AM调制:<br/>幅度变化<br/>携带信息"]
        FM_Mod["FM调制:<br/>频率变化<br/>携带信息"]
    end

    subgraph AM_Detail[AM详细机制]
        Carrier_AM["载波:<br/>A_c · cos(ω_c t)"]
        Info_AM["信息:<br/>m(t)"]
        Mod_AM["已调波:<br/>A_c[1+m(t)]·cos(ω_c t)<br/>幅度 = A_c[1+m(t)]"]

        Carrier_AM --> Mod_AM
        Info_AM --> Mod_AM
    end

    subgraph FM_Detail[FM详细机制]
        Carrier_FM["载波:<br/>A_c · cos(ω_c t)"]
        Info_FM["信息:<br/>m(t)"]
        Mod_FM["已调波:<br/>A_c · cos(ω_c t + k∫m(τ)dτ)<br/>相位 = ω_c t + k∫m(τ)dτ"]
        Freq_Dev["瞬时频率:<br/>f = f_c + k·m(t)"]

        Carrier_FM --> Mod_FM
        Info_FM --> Mod_FM
        Mod_FM --> Freq_Dev
    end

    Modulation_Compare -.->|深入| AM_Detail
    Modulation_Compare -.->|深入| FM_Detail

    style AM_Mod fill:#ffcdd2
    style FM_Mod fill:#c8e6c9
    style Mod_AM fill:#ffcdd2
    style Mod_FM fill:#c8e6c9

图表讲解:AM和FM的根本区别在于哪个参数携带信息。在AM中,载波的幅度随信息信号变化——如果信息是正弦波,载波幅度会周期性增大和减小。在FM中,载波的频率(或相位)随信息信号变化——如果信息是正弦波,载波频率会周期性变快和变慢,但幅度保持恒定。这个根本区别导致了性能上的巨大差异。AM的信息编码在幅度上,任何幅度干扰(噪声、干扰)都会直接影响信息。FM的信息编码在频率上,幅度干扰(只要不削波)不会影响信息——FM接收机可以通过限幅器去除所有幅度变化,只保留频率信息。

3.2 FM的性能优势

FM相比AM有三个关键优势。

flowchart TD
    subgraph FM_Adv[FM的三大优势]
        direction TB
        Capture["捕获效应<br/>强信号压制弱信号"]
        Noise_Immunity["抗噪声干扰<br/>信息在频率上"]
        Quality["高音质<br/>宽带传输"]
    end

    subgraph Capture_Detail[捕获效应详解]
        Strong["强信号<br/>功率 P1"]
        Weak["弱信号<br/>功率 P2 << P1"]
        Same_Freq["同频率<br/>或频率接近"]
        Result["接收机锁定强信号<br/>弱信号被抑制<br/>像不存在一样"]

        Strong --> Result
        Weak --> Same_Freq
        Same_Freq --> Result
    end

    subgraph Noise_Detail[抗干扰详解]
        Amp_Noise["幅度噪声<br/>如闪电、电机"]
        Limiter["限幅器<br/>去除幅度变化"]
        Freq_Info["频率信息<br/>保留完好"]
        Clean["干净解调<br/>无幅度干扰"]

        Amp_Noise --> Limiter
        Limiter --> Freq_Info
        Freq_Info --> Clean
    end

    FM_Adv -.->|优势1| Capture_Detail
    FM_Adv -.->|优势2| Noise_Detail
    FM_Adv -.->|优势3| Quality

    style Capture fill:#c8e6c9
    style Noise_Immunity fill:#c8e6c9
    style Result fill:#a5d6a7
    style Clean fill:#a5d6a7

图表讲解:FM的第一个优势是捕获效应。当两个同频FM信号到达接收机时,较强的信号会”捕获”接收机,较弱的信号会被完全抑制。这与AM不同——AM接收机会同时接收两个信号,产生严重的干扰和拍音。这意味着在FM系统中,较强的”有用”信号会自然压制较弱的”干扰”信号,即使干扰只强几分贝。第二个优势是抗噪声干扰。因为信息编码在频率变化而不是幅度上,任何幅度干扰(雷电、电机噪声)都可以被限幅器去除,只保留干净的频率信息。第三个优势是高音质——FM使用更宽的带宽(180kHz vs AM的10kHz),能够传输更宽的音频频谱(高达15kHz),提供接近CD的音质。

3.3 FM的代价

FM的优势不是没有代价的。

flowchart TD
    subgraph FM_Cost[FM的代价]
        direction TB
        Bandwidth["带宽更大<br/>~180kHz vs ~10kHz<br/>需要更多频谱资源"]
        Complexity["复杂度更高<br/>需要鉴频器<br/>比包络检波复杂"]
        Power["功率效率<br/>理论相同<br/>实际FM需要更多功率"]
    end

    subgraph Bandwidth_Detail[带宽代价详解]
        AM_BW["AM带宽:<br/>2 × 音频频率<br/>~10kHz"]
        FM_BW["FM带宽:<br/>卡森公式<br/>≈ 2(Δf + f_audio)"]
        Example_FM["FM广播:<br/>频偏 75kHz<br/>音频 15kHz<br/>带宽 ~180kHz"]

        AM_BW -.->|窄| Bandwidth
        FM_BW -.->|宽| Bandwidth
        Example_FM -.->|实例| Bandwidth
    end

    subgraph Tradeoff[工程权衡]
        T1["AM适用:<br/>长距离、低成本<br/>窄带宽足够"]
        T2["FM适用:<br/>本地高质量<br/>宽带宽可用"]
        T3["现代趋势:<br/>数字调制<br/>结合两者优势"]

        T1 -.->|场景| AM_BW
        T2 -.->|场景| FM_BW
        T3 -.->|未来| Modern_Trend[数字调制趋势]
    end

    FM_Cost -.->|代价1| Bandwidth_Detail
    FM_Cost -.->|权衡| Tradeoff

    style Bandwidth fill:#ffcdd2
    style Complexity fill:#ffcdd2
    style FM_BW fill:#ffcdd2

图表讲解:FM的主要代价是带宽。AM广播只需要约10kHz带宽,可以容纳更多电台在同一频段。FM广播需要约180kHz带宽,每个电台占用更多频谱资源。在城市环境中,频谱是宝贵的资源,这意味着FM频段能容纳的电台数量远少于AM频段。FM接收机也更复杂——AM解调器可以是一个简单的二极管和电容(包络检波器),FM解调器需要鉴频器(如锁相环或正交鉴频器),实现复杂得多。功率方面,理论上AM和FM可以相同功率达到相同覆盖范围,但实践中FM发射机通常需要更高功率来覆盖相同区域,这部分是由于FM的捕获效应虽然改善了同频干扰,但对相邻频道干扰更敏感。


四、FM解调器实现

在GNU Radio中实现FM解调需要使用专门的模块。

4.1 FM解调原理

FM解调的核心是频率到电压的转换。

flowchart TD
    subgraph FM_Demod[FM解调原理]
        direction TB
        FM_In["FM信号<br/>频率随信息变化"]
        Freq2Volt["鉴频器<br/>频率 → 电压"]
        Audio_Out["音频输出<br/>电压 = 原始信息"]
    end

    subgraph Discriminator[鉴频器类型]
        Type1["微分鉴频<br/>d/dt[cos(ωt)]<br/>简单但噪声大"]
        Type2["延迟鉴频<br/>延迟线+乘法器<br/>常用实现"]
        Type3["正交鉴频<br/>I/Q处理<br/>数字FM常用"]
        Type4["PLL鉴频<br/>锁相环<br/>高性能"]

        Type1 -.->|传统| Freq2Volt
        Type2 -.->|模拟| Freq2Volt
        Type3 -.->|数字| Freq2Volt
        Type4 -.->|高级| Freq2Volt
    end

    subgraph GNU_Radio_FM[GNU Radio实现]
        GR_Method["正交解调<br/>计算 dQ/dt · I - dI/dt · Q"]
        GR_Formula["输出 = (I·dQ/dt - Q·dI/dt) / (I² + Q²)"]
        GR_Simp["简化的近似:<br/>只需相位差"]

        GR_Method --> GR_Formula
        GR_Formula --> GR_Simp
    end

    FM_Demod -.->|实现| Discriminator
    Discriminator -.->|GRC使用| GNU_Radio_FM

    style Freq2Volt fill:#bbdefb
    style GR_Method fill:#c8e6c9

图表讲解:FM解调器的核心是将频率变化转换为电压变化。在模拟时代,这通过鉴频器实现——微分鉴频器、延迟鉴频器或比例鉴频器。在数字SDR中,最常用的方法是正交解调,它直接利用IQ信号计算瞬时频率。原理是:信号的相位变化率就是频率。对于复数信号I + jQ,瞬时频率可以计算为(I·dQ/dt - Q·dI/dt)/(I² + Q²)。GNU Radio的FM Demod模块使用这个公式或其变体实现数字鉴频。这种方法的优势是直接在数字域工作,精度高,易于实现。

4.2 Quadrature Demod模块

Quadrature Demod是GNU Radio中通用的解调模块。

flowchart TD
    subgraph Quad_Demod[Quadrature Demod模块]
        direction TB
        Input_QD["输入<br/>Complex IQ"]
        Param_QD["参数:<br/>解调灵敏度"]
        Output_QD["输出<br/>Float 音频"]
    end

    subgraph Quad_Math[数学原理]
        M1["计算相位:<br/>φ = arctan(Q/I)"]
        M2["计算相位差:<br/>Δφ = φ[n] - φ[n-1]"]
        M3["输出信息:<br/>m(t) ∝ Δφ"]

        M1 --> M2 --> M3
    end

    subgraph Sensitivity[灵敏度参数]
        Sens["灵敏度 = 2π × 频偏<br/>控制增益"]
        Example1["FM广播:<br/>频偏75kHz<br/>灵敏度合理"]
        Example2["窄带FM:<br/>频偏5kHz<br/>需要更高灵敏度"]

        Sens -.->|设置| Example1
        Sens -.->|调整| Example2
    end

    Quad_Demod -.->|基于| Quad_Math
    Quad_Demod -.->|配置| Sensitivity

    style Output_QD fill:#c8e6c9
    style Quad_Math fill:#fff9c4

图表讲解:Quadrature Demod模块通过计算信号的相位变化率实现解调。首先计算每个样本的相位(arctan(Q/I)),然后计算相邻样本的相位差。相位差与瞬时频率成正比,因此与原始信息成正比。灵敏度参数控制解调器的增益——对于标准FM广播(频偏±75kHz),默认灵敏度通常合适;对于窄带FM(如业余无线电,频偏±5kHz),需要增加灵敏度以获得相同的输出幅度。调整灵敏度时,可以在输出端添加QT GUI Time Sink观察音频波形,确保幅度合适(不要太小导致量化噪声,也不要太大导致削波)。


五、从AM到FM:接收机改造

现在让我们将AM接收机改造为FM收音机。

5.1 AM与FM接收机对比

两种接收机的架构非常相似,只需要替换几个模块。

flowchart TD
    subgraph AM_Rx[AM接收机]
        direction TB
        Source1["File Source<br/>RF数据"]
        Tune1["调谐<br/>频率搬移"]
        Filter1["低通滤波<br/>~10kHz"]
        Demod1["AM Demod<br/>包络检波"]
        Resample1["重采样<br/>48kHz"]
        Audio1["Audio Sink<br/>输出"]
    end

    subgraph FM_Rx[FM接收机]
        direction TB
        Source2["File Source<br/>RF数据"]
        Tune2["调谐<br/>频率搬移"]
        Filter2["低通滤波<br/>~200kHz"]
        Demod2["FM Demod<br/>鉴频器"]
        Resample2["重采样<br/>48kHz"]
        Audio2["Audio Sink<br/>输出"]
    end

    subgraph Difference[关键差异]
        D1["滤波器带宽:<br/>AM ~10kHz<br/>FM ~200kHz"]
        D2["解调器类型:<br/>AM Demod<br/>FM Demod/Quadrature"]
        D3["中心频率:<br/>AM ~1MHz<br/>FM ~100MHz"]

        Source1 -.->|相同| Source2
        Tune1 -.->|相同| Tune2
        Filter1 -.->|不同| D1
        Filter1 -.->|改为| Filter2
        Demod1 -.->|不同| D2
        Demod1 -.->|改为| Demod2
    end

    AM_Rx -.->|改造| FM_Rx
    AM_Rx -.->|差异| Difference

    style Filter1 fill:#ffcdd2
    style Filter2 fill:#c8e6c9
    style Demod1 fill:#ffcdd2
    style Demod2 fill:#c8e6c9

图表讲解:从AM接收机到FM接收机的改造非常简单,因为基本架构相同。主要差异是滤波器带宽和解调器类型。AM信号的带宽约10kHz(载波±5kHz),FM信号的带宽约200kHz(载波±100kHz,包含主要边带)。因此FM接收机的低通滤波器截止频率应该设置为约100kHz,过渡宽度可以设置为50kHz。解调器方面,只需要将AM Demod替换为FM Demod或Quadrature Demod。另一个重要区别是中心频率——AM广播在1MHz频段,FM广播在100MHz频段,所以调谐频率需要相应调整。

5.2 完整FM接收机流程图

这是完整的FM接收机GRC流程图。

flowchart TD
    subgraph FM_Complete[完整FM接收机]
        direction TB

        subgraph Variables_FM[变量定义]
            samp_rate_fm[Variable: samp_rate = 1e6]
            center_freq_fm[Variable: center_freq = 100e6]
            audio_rate_fm[Variable: audio_rate = 48e3]
        end

        subgraph Source_FM[数据源]
            file_src_fm[File Source<br/>FM数据文件]
        end

        subgraph Tuning_FM[调谐]
            sig_src_fm[Signal Source<br/>复指数<br/>频率 = -center_freq]
            multiply_fm[Multiply<br/>混频器]
        end

        subgraph Filter_FM[滤波]
            lpf_fm[Low Pass Filter<br/>截止: 100kHz<br/>过渡: 50kHz]
        end

        subgraph Demod_FM[解调]
            fm_demod[FM Demod<br/>或 Quadrature Demod]
        end

        subgraph Resample_FM[重采样]
            resampler_fm[Rational Resampler<br/>输入: samp_rate<br/>输出: audio_rate]
        end

        subgraph Output_FM[输出]
            audio_sink_fm[Audio Sink<br/>采样率: audio_rate]
        end

        file_src_fm --> multiply_fm
        sig_src_fm --> multiply_fm
        multiply_fm --> lpf_fm
        lpf_fm --> fm_demod
        fm_demod --> resampler_fm
        resampler_fm --> audio_sink_fm

        samp_rate_fm -.->|控制| lpf_fm
        samp_rate_fm -.->|控制| resampler_fm
        center_freq_fm -.->|控制| sig_src_fm
        audio_rate_fm -.->|控制| resampler_fm
        audio_rate_fm -.->|控制| audio_sink_fm
    end

    style file_src_fm fill:#bbdefb
    style fm_demod fill:#c8e6c9
    style lpf_fm fill:#fff9c4

图表讲解:这个FM接收机流程图与AM接收机非常相似,主要差异是参数设置。滤波器截止频率从5kHz增加到100kHz,以适应FM信号的更宽带宽。解调器从AM Demod改为FM Demod或Quadrature Demod。调谐频率从1MHz改为100MHz(FM广播频段)。其他组件(File Source、Multiply、Rational Resampler、Audio Sink)保持不变。这种相似性说明了SDR的强大——相同的硬件和软件框架,只需要改变几个参数,就可以处理完全不同的调制方式和频段。


六、FM接收机性能优化

构建基本FM接收机后,我们可以进行各种优化来改善性能。

6.1 去加重与预加重

FM广播使用预加重/去加重技术改善信噪比。

flowchart TD
    subgraph PreEmphasis[预加重/去加重系统]
        direction TB
        TX_Pre["发射端:<br/>预加重<br/>提升高频"]
        Channel["信道:<br/>FM传输"]
        RX_De["接收端:<br/>去加重<br/>衰减高频"]
        Result["结果:<br/>高频SNR改善<br/>平坦响应"]
    end

    subgraph Pre_Detail[预加重原理]
        High_Freq["高频成分<br/>通常较弱<br/>易受噪声影响"]
        Boost["提升<br/>发射前放大<br/>增加幅度"]
        Trans["传输<br/>提升后传输<br/>相对更强"]
        Explain["噪声叠加:<br/>相同噪声<br/>影响更小"]

        High_Freq --> Boost
        Boost --> Trans
        Trans --> Explain
    end

    subgraph De_Detail[去加重实现]
        De_Filter["滤波器<br/>-6dB/oct<br/>高通衰减"]
        Time_Const["时间常数<br/>US: 75μs<br/>EU: 50μs"]
        Flat["平坦响应<br/>恢复原始<br/>频谱平衡"]

        De_Filter --> Time_Const
        Time_Const --> Flat
    end

    PreEmphasis -.->|发射| Pre_Detail
    PreEmphasis -.->|接收| De_Detail

    style Result fill:#c8e6c9
    style Explain fill:#a5d6a7

图表讲解:预加重/去加重是FM广播的经典技术。问题是:高频音频成分通常较弱(音乐中高音能量比低音少),同时高频噪声更明显(如热噪声、晶体管噪声)。如果不处理,高频SNR会较差。解决方案是在发射端”预加重”——提升高频成分(+6dB/oct,频率每翻倍增加6dB)。这些高频成分以更大的幅度传输,相对噪声更强。在接收端,使用匹配的”去加重”滤波器衰减高频(-6dB/oct),恢复原始频谱平衡。在这个过程中,高频SNR得到了改善,因为预提升让信号更强,而噪声没有预提升。美国使用75μs时间常数,欧洲使用50μs。GNU Radio的FM Demod模块通常包含可选的去加重功能。

6.2 立体声FM

FM广播可以携带立体声音频。

flowchart TD
    subgraph FM_Stereo[FM立体声广播]
        direction TB
        L_R["左/右声道<br/>L和R音频"]
        Sum["和信号:<br/>L + R<br/>单声道兼容"]
        Diff["差信号:<br/>L - R<br/>立体声信息"]
        Pilot["导频:<br/>19kHz<br/>立体声指示"]
        MPX["复合信号:<br/>和 + 差 + 导频"]
    end

    subgraph Freq_Alloc[频率分配]
        Base["0 - 15kHz:<br/>和信号<br/>单声道兼容"]
        Pilot["19kHz:<br/>导频<br/>立体声指示"]
        DSB["23 - 53kHz:<br/>差信号<br/>DSB-SC调制"]
        Other["其他:<br/>RDS/辅助<br/>更高频率"]

        Base --> Pilot
        Pilot --> DSB
        DSB --> Other
    end

    subgraph Stereo_Rx[立体声接收]
        RX_Input["FM信号<br/>接收"]
        FM_Demod2["FM解调<br/>恢复MPX"]
        Pilot_Detect["导频检测<br/>确认立体声"]
        Stereo_Dec["立体声解码<br/>恢复L/R"]
        Output_LR["左右声道<br/>立体声输出"]

        RX_Input --> FM_Demod2
        FM_Demod2 --> Pilot_Detect
        Pilot_Detect --> Stereo_Dec
        Stereo_Dec --> Output_LR
    end

    FM_Stereo -.->|频谱| Freq_Alloc
    FM_Stereo -.->|接收| Stereo_Rx

    style MPX fill:#bbdefb
    style Pilot fill:#fff9c4
    style Output_LR fill:#c8e6c9

图表讲解:FM立体声广播巧妙地将立体声信息嵌入频谱。和信号(L+R)占据基带0-15kHz,这样单声道接收机可以正常解调(只听到和信号,虽然是单声道但兼容)。差信号(L-R)调制到23-53kHz(使用双边带抑制载波DSB-SC),这个频带在单声道接收机的滤波器之外,不会干扰。19kHz导频指示立体声广播的存在。立体声接收机检测到19kHz导频后,提取差信号,然后通过L = (L+R)+(L-R)和R = (L+R)-(L-R)恢复左右声道。这种设计的巧妙之处是完全向后兼容——单声道接收机不需要任何修改就能接收立体声广播(只是丢失立体声)。

6.3 音量控制

为FM接收机添加音量控制非常简单。

flowchart TD
    subgraph Volume_Ctrl[音量控制实现]
        direction TB
        Audio_In["音频输入<br/>解调后"]
        Gain_Block["Multiply Const<br/>音量控制"]
        Audio_Out["音频输出<br/>到扬声器"]

        Audio_In --> Gain_Block --> Audio_Out
    end

    subgraph GUI_Volume[GUI控制]
        Slider["QT GUI Range<br/>滑动条"]
        Variable2["Variable<br/>音量变量"]
        Range["范围:<br/>0 到 2<br/>静音到加倍"]

        Slider --> Variable2
        Variable2 --> Gain_Block
        Range -.->|设置| Variable2
    end

    subgraph Example_Vol[音量示例]
        Mute["0: 静音<br/>完全无声"]
        Half["0.5: 一半音量<br/>-6dB"]
        Unity["1: 单位增益<br/>原始音量"]
        Double["2: 加倍音量<br/>+6dB"]

        Mute -.->|调节| Gain_Block
        Half -.->|调节| Gain_Block
        Unity -.->|默认| Gain_Block
        Double -.->|最大| Gain_Block
    end

    Volume_Ctrl -.->|使用| GUI_Volume
    GUI_Volume -.->|范围| Example_Vol

    style Gain_Block fill:#bbdefb
    style Slider fill:#fff9c4

图表讲解:音量控制只是一个增益模块(Multiply Const),但有几个实际考虑。增益范围应该从0(静音)到略大于1(如1.5或2)。增益小于1会衰减音量,增益大于1会放大音量。太小的增益(如0.1)可能导致信号太小,受量化噪声影响。太大的增益(如5或10)可能导致削波——信号幅度超过ADC/DAC的范围。通常设置范围0到2比较合理,可以完全静音到适当放大。将增益绑定到QT GUI Range滑动条,用户就可以实时调整音量,就像真实的收音机音量旋钮。


七、接收机调谐优化

调谐是接收机的核心功能,优化调谐可以改善接收质量。

7.1 频率跟踪精度

精确的频率跟踪对于高质量接收很重要。

flowchart TD
    subgraph Freq_Error[频率误差影响]
        direction TB
        Perfect["完美调谐:<br/>f_LO = f_c<br/>信号在基带"]
        Offset["频率偏移:<br/>f_LO ≠ f_c<br/>信号偏移基带"]
        Problem1["AM问题:<br/>音质下降<br/>高频损失"]
        Problem2["FM问题:<br/>严重失真<br/>音频衰减"]

        Perfect --> Offset
        Offset --> Problem1
        Offset --> Problem2
    end

    subgraph Fine_Tuning[精细调谐]
        Step["调谐步长:<br/>可调精度"]
        Coarse["粗调:<br/>大步长<br/>快速找到信号"]
        Fine["细调:<br/>小步长<br/>精确对准"]
        Auto["自动:<br/>AFC<br/>自动频率控制"]

        Step --> Coarse
        Coarse --> Fine
        Fine --> Auto
    end

    subgraph AFC[AFC实现]
        Error["误差信号:<br/>载波偏移量"]
        Loop["环路滤波器<br/>平滑误差"]
        Adjust["调整LO<br/>锁定载波"]

        Error --> Loop --> Adjust
    end

    Freq_Error -.->|需要| Fine_Tuning
    Fine_Tuning -.->|高级| AFC

    style Perfect fill:#c8e6c9
    style Offset fill:#ffcdd2
    style Problem1 fill:#ffcdd2
    style Problem2 fill:#ffcdd2
    style Auto fill:#e1f5fe

图表讲解:频率误差会导致接收质量下降。对于AM,即使有几十Hz的误差,信号也会偏移基带,解调器可能无法正确提取包络,导致音质下降(特别是高频成分丢失)。对于FM,频率误差更严重——FM解调器输出与频率偏移成正比,如果载波没有精确对准基带,会有一个直流偏置加上音频信号,可能导致放大器饱和或音频衰减。理想情况是将载波精确对准0Hz(基带中心)。在GRC中,可以通过精细调整center_freq变量实现。更高级的接收机有AFC(自动频率控制)功能,自动检测载波偏移并调整LO频率以锁定。

7.2 中频滤波器优化

中频滤波器的特性直接影响接收质量。

flowchart TD
    subgraph IF_Filter[中频滤波器设计]
        direction TB
        BW_Choice["带宽选择:<br/>通过多少信号"]
        Shape["滤波器形状:<br/>通带响应"]
        Delay["群时延:<br/>相位失真"]
    end

    subgraph BW_Tradeoff[带宽权衡]
        Narrow["窄带宽:<br/>优点: 更好选择性<br/>缺点: 信号失真<br/>包络失真"]
        Wide["宽带宽:<br/>优点: 完整信号<br/>缺点: 干扰增加<br/>噪声增加"]

        Narrow -->|权衡| BW_Choice
        Wide -->|权衡| BW_Choice
    end

    subgraph Optimal_BW[最佳带宽]
        Opt["最佳带宽:<br/>匹配信号带宽<br/>AM: ~10kHz<br/>FM: ~200kHz"]
        Margin["设计余量:<br/>稍大于理论值<br/>AM: 12-15kHz<br/>FM: 250kHz"]

        Opt --> BW_Choice
        Margin --> BW_Choice
    end

    subgraph Shape_Types[滤波器形状]
        Brick["砖墙:<br/>理想<br/>不可实现"]
        Gauss["高斯:<br/>形状好<br/>最小群时延失真"]
        Raised["升余弦:<br/>数字通信<br/>零ISI"]

        Brick -.->|近似| Shape
        Gauss -.->|推荐| Shape
        Raised -.->|数字| Shape
    end

    IF_Filter -.->|权衡| BW_Tradeoff
    IF_Filter -.->|选择| Optimal_BW
    IF_Filter -.->|类型| Shape_Types

    style Narrow fill:#ffcdd2
    style Wide fill:#ffcdd2
    style Optimal_BW fill:#c8e6c9
    style Gauss fill:#e1f5fe

图表讲解:中频滤波器的带宽需要仔细选择。太窄的带宽会改善选择性(抑制相邻电台),但会导致信号失真——对于AM,窄带宽会削去边带,导致音频高频损失;对于FM,窄带宽会削去有效边带,导致严重失真甚至音频解调不出。太宽的带宽会保留完整信号,但也会包含更多噪声和干扰。最佳实践是匹配信号的标称带宽(AM10kHz,FM200kHz),并留一点余量(10-20%)。滤波器形状也很重要——高斯形状的滤波器有最小的群时延失真(所有频率延迟相同),这对于音频信号很重要。GNU Radio的滤波器设计工具可以选择不同的滤波器类型。

7.3 相邻频道抑制

接收机需要抑制相邻频道的强信号。

flowchart TD
    subgraph Adjacent[相邻频道问题]
        direction TB
        Target["目标频道:<br/>f = 100MHz<br/>信号强度: 中"]
        Adj1["相邻1:<br/>f = 100.2MHz<br/>信号强度: 强"]
        Adj2["相邻2:<br/>f = 99.8MHz<br/>信号强度: 强"]
        Problem["问题:<br/>强干扰<br/>可能淹没目标"]
    end

    subgraph Solutions[解决方案]
        Better_Filter["更好的滤波器:<br/>更陡峭滚降<br/>窄过渡带"]
        High_Order["更高阶数:<br/>计算复杂度↑"]
        Adapt["自适应:<br/>根据干扰调整<br/>滤波器参数"]
        Digital["数字滤波:<br/>更高精度<br/>更灵活"]

        Better_Filter --> High_Order
        High_Order --> Adapt
        Adapt --> Digital
    end

    subgraph Spec[接收机规格]
        Selectivity["选择性:<br/>抑制相邻<br/>频道能力"]
        Measurement["测量:<br/>相邻频道<br/>衰减dB"]
        Typical["典型值:<br/>40-60dB<br/>良好接收机"]
        High["高性能:<br/>>80dB<br/>专业接收机"]

        Selectivity --> Measurement
        Measurement --> Typical
        Typical --> High
    end

    Adjacent -.->|需要| Solutions
    Solutions -.->|改善| Spec

    style Adj1 fill:#ffcdd2
    style Adj2 fill:#ffcdd2
    style Problem fill:#ffcdd2
    style Better_Filter fill:#c8e6c9
    style High fill:#a5d6a7

图表讲解:相邻频道干扰是实际接收中的常见问题。你想接收100MHz的电台,但99.8MHz和100.2MHz有强信号发射。如果接收机的滤波器不够好,这些干扰会”泄漏”进来,降低接收质量。选择性是接收机抑制相邻频道的能力,以分贝表示。例如,60dB选择性意味着相邻频道的信号被衰减60dB(1000倍)。提高选择性的方法是使用更陡峭的滤波器(更窄的过渡带),但这需要更高的滤波器阶数和更多的计算。GNU Radio的滤波器设计工具允许你指定衰减要求,会自动计算所需的阶数。


八、核心概念总结

概念定义关键要点应用
AM解调包络检波提取幅度变化AM广播
FM解调鉴频器频率→电压转换FM广播
复数混频IQ信号处理避免镜像问题SDR标准
捕获效应强信号压制弱信号FM独有优势同频干扰抑制
预加重高频提升发射端提升高频FM广播
去加重高频衰减接收端恢复平坦FM接收
选择性抑制相邻频道滤波器陡峭度接收机质量
AFC自动频率控制锁定载波频率精确调谐

常见问题解答

Q1:为什么我的FM接收机有明显的背景噪声或”嘶嘶”声?

:FM接收机的噪声通常有几个可能原因,需要系统排查。

首先是SNR太低——信号太弱或噪声太强。解决方法是检查输入信号的频谱,确认目标电台的强度。如果信号很弱,尝试增加前端增益(如果有SDR硬件的话)。如果噪声很强,可能是本地干扰(电脑、电源),尝试改善物理环境或使用屏蔽电缆。

其次是解调器灵敏度设置不当。Quadrature Demod模块的灵敏度参数如果太低,输出音频幅度会很小,你需要增加后续放大才能听到,这也会放大噪声。尝试增加灵敏度参数,使输出幅度合适。

然后是带宽设置——如果低通滤波器带宽太宽(如500kHz),会包含更多噪声。FM信号的有效带宽约200kHz,设置滤波器截止频率为100-120kHz,过渡带50kHz,这样既保留完整信号又滤除带外噪声。

最后是去加重——如果信号是标准FM广播(带有预加重),接收端需要使用匹配的去加重滤波器。GNU Radio的FM Demod模块可能有去加重选项(如75μs),确保启用它。去加重不仅恢复平坦响应,还能减少高频噪声(噪声在预加重前就存在的不会被去加重衰减)。


Q2:立体声FM和单声道FM有什么区别?我的接收机能接收立体声吗?

:立体声FM和单声道FM的主要区别在于调制内容。

单声道FM只携带一个音频通道(通常是L+R,左右声道的和),解调后直接得到单声道音频,左右扬声器播放相同内容。立体声FM携带更多信息:和信号(L+R,用于单声道兼容)加差信号(L-R,调制在23-53kHz)加19kHz导频(指示立体声存在)。立体声接收机检测到19kHz导频后,提取差信号,然后通过矩阵运算恢复左右声道。

你的GNU Radio接收机能接收立体声吗?基本FM解调模块(FM Demod或Quadrature Demod)只能输出单声道(MPX复合信号),不包含立体声解码。要获得真正的立体声,需要额外的立体声解码模块。GNU Radio社区有立体声解码器的实现,通常包括:19kHz导频检测(使用窄带带通滤波器或PLL)、差信号解调(使用相干解调或包络检波)、矩阵运算(L = (L+R)+(L-R), R = (L+R)-(L-R))。

如果你是初学者,建议先掌握单声道接收,理解基本原理后再尝试立体声。单声道接收已经能获得良好的音质,立体声是锦上添花。


Q3:为什么AM接收机容易受到”啸叫”干扰,而FM不会?

:这种”啸叫”是AM和FM本质差异导致的。

AM的信息编码在幅度上,任何幅度干扰都会直接影响解调输出。“啸叫”通常是音频反馈——接收机的音频输出(通过扬声器)又被天线接收到,形成正反馈回路。音频信号被发射出去,又被接收,放大,再发射…这个过程快速振荡,产生刺耳的啸叫。

FM不会这样,因为FM的信息编码在频率变化上,而不是幅度上。即使有音频反馈,它表现为幅度变化,FM解调器对幅度变化不敏感(尤其是有限幅器的情况下),所以不会形成同样的正反馈。即使有反馈,FM解调器输出的只是稍微失真的音频,而不是剧烈的啸叫。

另一个因素是AGC(自动增益控制)。AM接收机如果有AGC,可能会试图放大反馈信号,加剧问题。FM接收机的限幅器会去除幅度变化,天然抵抗这种反馈。

如果你在使用AM接收机时遇到啸叫,尝试降低音量、移动天线远离扬声器、或使用耳机(没有声音反馈到天线)。FM接收机在这方面更”宽容”,不容易产生啸叫。


Q4:FM接收机的”捕获效应”是什么?我能利用它改善接收吗?

:捕获效应是FM的独特特性,指当两个同频信号到达接收机时,较强的信号会”捕获”接收机,较弱的信号会被完全抑制,就像不存在一样。

捕获效应的阈值大约是信号强度差2-6dB。这意味着如果有用信号比干扰信号强3dB,你只会听到有用信号,完全没有干扰的痕迹。这对于AM是不可想象的——AM接收机会同时接收两个信号,产生严重的拍音和干扰。

你可以利用捕获效应改善接收。首先,尝试调整天线方向和位置,使目标信号的强度最大化。稍微改善信号强度(几dB)就可能从”干扰主导”切换到”捕获主导”,接收质量会突然大幅改善。

其次,如果可能,增加前端增益(RF放大)。更强的信号会触发捕获效应,压制干扰。但要小心不要增益太高导致前端饱和或产生互调失真。

最后,利用定向天线。定向天线可以增强目标方向的信号,抑制其他方向的信号,人为创造信号强度差,触发捕获效应。

需要注意的是,捕获效应只在同频或频率非常接近时有效。如果干扰信号在频率上明显不同,滤波器会先起作用,捕获效应不太相关。


Q5:如何判断我的FM接收机是否调谐正确?有没有快速检查方法?

:有几种方法可以快速验证FM接收机是否调谐正确。

最直接的方法是使用QT GUI Frequency Sink观察调谐后的信号。如果调谐正确,目标电台应该在0Hz(基带中心)附近。你应该能看到信号的中心频率对准0Hz标记。如果不是,需要调整center_freq变量。

另一个方法是观察解调后的音频信号直流偏置。使用QT GUI Time Sink观察FM Demod或Quadrature Demod的输出。如果调谐完美,输出应该以0V为中心上下振荡(音频信号)。如果有一个大的直流偏置(如整个波形向上或向下偏移),说明频率有偏移——载波没有精确对准基带。尝试微调center_freq直到直流偏置最小化。

第三种方法是听音质。调谐正确时,音质应该清晰、饱满、动态范围好。如果有频率偏移,音质会变差、变闷、或失真。这需要一些经验,但对于有经验的听众来说很直观。

还可以使用FFT分析——观察FM Demod输出的频谱。语音应该在20Hz-5kHz范围,没有明显的直流分量(0Hz)。如果0Hz有很大分量,说明有频率偏移。

对于自动检查,可以编写Python脚本计算输出信号的均值(直流分量)并调整center_freq使其最小化。这是简单但有效的AFC(自动频率控制)实现。


总结

本文深入剖析了接收机的工作原理,并带你完成了从AM到FM的升级。我们学习了:

  1. AM接收机分析:每个处理阶段的作用和信号演变
  2. 复数混频技术:IQ信号的数学原理和物理意义
  3. FM调制原理:FM与AM的本质区别和性能优势
  4. FM解调实现:鉴频器和Quadrature Demod的使用
  5. FM接收机构建:从AM接收机的改造方法
  6. 性能优化技巧:去加重、立体声、音量控制
  7. 调谐优化方法:频率跟踪、滤波器设计、干扰抑制

通过这个升级,你的接收机从简单的AM系统变成了功能完整的FM收音机,具备更好的音质和抗干扰能力。更重要的是,你掌握了不同调制方式的处理方法,为后续更复杂的学习打下基础。

下篇预告

下一篇将进入硬件集成的世界,使用真实的SDR硬件接收实时信号。你将学习SDR硬件的工作原理、IQ采样的实现、增益设置与优化,以及如何将仿真流程图改造为硬件流程图。这是从仿真到实战的关键一步!