0%

探寻二十年前的声卡 SDR

几日前和一个朋友聊起 SDR,在感叹两年的芯片短缺潮终于快要翻篇之余,朋友还提到了快二十年前他在玩的一种 SDR。

RTL-SDR 的出现在 2012 年左右,值得一提的是,博主入坑 SDR 的第一台设备,也是 RTL-SDR。而在这之前,SDR 设备主要还是集中在专业领域,成本较高且功能也相对有限,仅有 USRP、BladeRF 等几种选择,对于博主这样的业余玩家来说,要是当年购买一套 USRP 或是 BladeRF,恐怕就要掏空好几个腰包了。

即便如此,也没有难住那时的玩家:在遥远的当年,比较流行的一个方案就是 DIY 一块包含了射频信号采集、混频、放大、滤波的板卡,然后将其与 PC 上的声卡相连,以声卡作为 ADC,再透过软件进行信号处理,这就是声卡 SDR

声卡 SDR 架构图

上图是一个典型的声卡 SDR 架构框图,在博主正式给出声卡 SDR 的原理图之前,还需要引入一些概念和理论做铺垫,便于以出浅入深的方式去分析及理解声卡 SDR 的工作原理。

I/Q 信号

在通常的数字通信中,通常将复杂信号以两个正交的信号分量 I 和 Q 来表示,其中,I 指代同相(In-phase),Q 则指代正交(Quadrature),另外,I 分量和 Q 分量之间的相位差通常为 90 度

I 分量表示信号在实轴上的幅度或幅度变化,Q 分量表示信号在虚轴上的幅度或幅度变化。若将这两个信号组合起来,则可以表示复杂信号的幅度和相位信息。

要生成 I/Q 信号,可以透过混频器和振荡器来实现,其基本原理是将原始信号与正弦(I)和余弦(Q)波形进行乘法运算,即可得到对应的 I/Q 信号。

使用 I/Q 信号的意义在于,I/Q 信号在数字信号处理中提供了更大的灵活性。透过对 I/Q 信号进行数字信号处理操作,如滤波、频谱分析、调制解调等,可以实现更高级的信号处理功能,例如信号的解调、编码解码、信道估计、自适应调制等。

例如在 GNURadio 中,complex 数据类型就表示了 I/Q 数据,生成一个余弦信号,并使用 Time Sink 查看其时域波形,可以看到,实部信号(即 I 分量)与虚部信号(即 Q 分量)之间相位差刚好为 90 度。

GNURadio 中 complex 数据类型

由于本文的重点不在 I/Q 调制和解调的原理上,所以这里只会简单介绍 I/Q 信号的构成及应用领域,有兴趣的朋友可以自行查阅相关资料及文献。

移相器与触发器

刚刚上文提到,I 分量和 Q 分量之间相位差为 90 度,而要实现这样的相位差,硬件层面则需要透过移相器(Phase Shifter)来实现。移相器的主要功能是将输入信号的相位进行可控的变化,可以增加或减小信号的相位角度,或者将相位角度移动到不同的位置。

从硬件层面来说,虽然可能有人没接触过移相器的概念,但是如果曾经有学过数字电路,那么多半会接触到触发器(Flip-Flop)这一器件。触发器是一种存储器件,可以将输入信号的状态(高电平或低电平)先存储起来,然后在时钟信号的作用下,将存储的状态输出。

所以,结合上述两个器件的共通之处,就可以透过触发器来实现移相器的功能,例如使用 D 触发器、JK 触发器等。向触发器输入的时钟信号可以由 SI5351 等模块产生,透过调整 SI5351 等模块产生的时钟频率,即可实现移相的操作,从而调制出 I/Q 信号。

本文决定采用 D 触发器来实现移相器的功能,74HC74 双 D 触发器就是一个不错的选择。借助此 IC 中的两个 D 触发器,可以产生相位差分别为 0 度、90 度、180 度和 270 度的 4 个信号,而我们只需要取出其中相位差为 90 度的任意两路信号即可构成 I/Q 信号。博主使用了 Proteus 来模拟 74HC74 用作移相器的电路,如下图所示。

74HC74 双 D 触发器原理图

仿真结果如下所示,可以明显看到不同输出端有不同的相位差,从而验证了这套方案的可行性。

74HC74 实现移相器仿真

值得一提的是,由于此电路的工作原理和双 D 触发器的特性使然,当使用 74HC74 作为移相器时,其输出频率为输入频率的 1/4,所以在使用时,需要将输入信号的频率调整到 4 倍,这样才能得到正确的输出信号。例如要产生 9 MHz 的 I/Q 信号,那么输入信号的频率应该为 9 * 4 = 36 MHz,这样才能得到正确的 9 MHz 的 I/Q 信号。

模拟开关与混频器

混频器的主要功能是将两路信号做乘法运算,其输出信号的频率为两路输入信号频率的和与差。

下面是使用 GNURadio 进行混频的例子,原始信号频率 10 kHz,用于混频的信号频率为 -9 kHz,那么最终能得到混频后的信号频率为 1 kHz。

GNURadio 实现混频

又例如使用使用 48 Ksps 采样率的声卡 SDR 接收 9.75 MHz 上的电台,那么就需要将 9.75 MHz 的信号降频到 -24 kHz 至 +24 kHz 的范围之内(声卡左右声道对应 I/Q 信号,每个声道带宽 24 kHz),所以通过计算可得,若要在声卡 SDR 上接收 9.75 MHz 的电台,则需要将 9.75 MHz 的信号降频到 9.75 MHz - 24 kHz = 9.726 MHz 至 9.75 MHz + 24 kHz = 9.774 MHz 的范围内,而这一段频率,就需要由上面合成的 I/Q 信号来提供了。

本文选用 74HC4052 双 4 通道模拟开关来实现混频器的功能,其真值表如下所示。

通道选择 - A 通道选择 - B 连通通道 - X 连通通道 - Y
L L X -> X0 Y -> Y0
H L X -> X1 Y -> Y1
L H X -> X2 Y -> Y2
H H X -> X3 Y -> Y3

其中,上文中由双 D 触发器产生的相位差为 90 度的 I/Q 信号可以作为 74HC4052 的通道选择输入端 A、B;由天线接收到的信号则可以先分成两路,分别输入到 74HC4052 的连通通道输入端 X、Y,这样一来,就可以实现混频器的功能了。下图是 74HC4052 的接线图,值得一提的是,Xn 和 Yn 的引脚(n = 0, 1, 2, 3)应当相互连接起来,实现所选的输入信号直接连接到输出端口,进而实现信号的直通功能

74HC4052 双 4 通道模拟开关

放大器及滤波器

由于混频过后的信号仍然较弱,所以需要经过放大器进行放大,而放大器的输出信号则需要经过滤波器进行滤波,以去除掉不需要的频率分量。本文选用了 LM358 作为放大器,并使用一个电容作为降频滤波器。

LM358 放大及滤波电路

透过原理图,可以得知如下几点。

  1. 为了降低元件耦合到电源端的噪声,运放输入端各连接了一个电容到 GND
  2. 反相输入端通过反馈电阻连接到运放的输出端,用于控制增益和频率响应
  3. 反馈电阻上还并联了一个电容,实现一个低通滤波器,使得高频噪声能够被滤除

完整电路图

若将上述内容综合起来,其实一个完整的声卡 SDR 电路已经呼之欲出了。最后附上完整电路图,细心的人可能已经发现,其实博主要 DIY 的这款声卡 SDR,就是曾流行一时的 ZetaSDR。另外,在原理图中,时钟输入(即 CLK_IN 标签)将由 SI5351 模块来完成,以实现频率范围调节的功能。

ZetaSDR 完整电路图