几日前和一个朋友聊起 SDR,在感叹两年的芯片短缺潮终于快要翻篇之余,朋友还提到了快二十年前他在玩的一种 SDR。
RTL-SDR 的出现在 2012 年左右,值得一提的是,博主入坑 SDR 的第一台设备,也是 RTL-SDR。而在这之前,SDR 设备主要还是集中在专业领域,成本较高且功能也相对有限,仅有 USRP、BladeRF 等几种选择,对于博主这样的业余玩家来说,要是当年购买一套 USRP 或是 BladeRF,恐怕就要掏空好几个腰包了。
即便如此,也没有难住那时的玩家:在遥远的当年,比较流行的一个方案就是 DIY 一块包含了射频信号采集、混频、放大、滤波的板卡,然后将其与 PC 上的声卡相连,以声卡作为 ADC,再透过软件进行信号处理,这就是声卡 SDR。
在兴趣驱使之下,博主最终也打算 DIY 一块声卡 SDR 板卡,重温那个没有 RTL-SDR 的年代。本系列文章将会分成三篇,本篇文章将会介绍声卡 SDR 的原理及电路,另外两篇文章将会介绍博主制作声卡 SDR 板卡、上机测试及性能调优的全部过程。
同时,博主希望能藉由自制 SDR 的过程,对 SDR 的基本原理有更深入的了解,也希望能够帮助到有兴趣 DIY 简单 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 度。
由于本文的重点不在 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 用作移相器的电路,如下图所示。
仿真结果如下所示,可以明显看到不同输出端有不同的相位差,从而验证了这套方案的可行性。
值得一提的是,由于此电路的工作原理和双 D 触发器的特性使然,当使用 74HC74 作为移相器时,其输出频率为输入频率的 1/4,所以在使用时,需要将输入信号的频率调整到 4 倍,这样才能得到正确的输出信号。例如要产生 9 MHz 的 I/Q 信号,那么输入信号的频率应该为 9 * 4 = 36 MHz,这样才能得到正确的 9 MHz 的 I/Q 信号。
模拟开关与混频器
混频器的主要功能是将两路信号做乘法运算,其输出信号的频率为两路输入信号频率的和与差。
下面是使用 GNURadio 进行混频的例子,原始信号频率 10 kHz,用于混频的信号频率为 -9 kHz,那么最终能得到混频后的信号频率为 1 kHz。
又例如使用使用 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)应当相互连接起来,实现所选的输入信号直接连接到输出端口,进而实现信号的直通功能。
放大器及滤波器
由于混频过后的信号仍然较弱,所以需要经过放大器进行放大,而放大器的输出信号则需要经过滤波器进行滤波,以去除掉不需要的频率分量。本文选用了 LM358 作为放大器,并使用一个电容作为降频滤波器。
透过原理图,可以得知如下几点。
- 为了降低元件耦合到电源端的噪声,运放输入端各连接了一个电容到 GND
- 反相输入端通过反馈电阻连接到运放的输出端,用于控制增益和频率响应
- 反馈电阻上还并联了一个电容,实现一个低通滤波器,使得高频噪声能够被滤除
完整电路图
若将上述内容综合起来,其实一个完整的声卡 SDR 电路已经呼之欲出了。最后附上完整电路图,细心的人可能已经发现,其实博主要 DIY 的这款声卡 SDR,就是曾流行一时的 ZetaSDR。另外,在原理图中,时钟输入(即 CLK_IN 标签)将由 SI5351 模块来完成,以实现频率范围调节的功能。
这个系列的下一篇文章将会介绍博主打板、组装、焊接及上机测试的过程,敬请期待。