yaboPP电子
技术文章

如何在软件定义的射频接收机中处理I/Q信号

2018年10月04通过罗伯特Keim

本文讨论了I/Q信号的数学意义,并给出了移频键控基带信号的DSP译码算法的最后步骤。

本文讨论了I/Q信号的数学意义,并给出了移频键控基带信号的DSP译码算法的最后步骤。

在本文中,我们将讨论如何完成算法的开发(从以前的文章开始),包括如何查找数据可视化的DC偏移量,以及如何将I和Q偏移量组合成单个值。

在继续之前,请查看我们的相关资源和文章,以提供更多的背景信息:

相关信息

基于scilab的数字信号处理以前的文章

上一篇文章中给出的最后一个计算设计一个健壮的FSK解码器为三个I/Q基带信号(表示二进制序列0101)与FSK译码所用的参考符号相乘。结果如下:

Phase-Aligned基带信号

图1

图1中的图是相对齐的基带信号。左边是I基带信号的倍增波形,右边是Q基带信号的倍增波形。二进制数0的解码结果在最上面一行,二进制数1的解码结果在最下面一行。

相移45°的基带信号

图2

图2中的图是相移为45°的基带信号。如图1所示,I在左边,Q在右边,二进制0解码在上一行,二进制1解码在下一行。

相移90°的基带信号

图3

图3中的图形是具有90°相移的基带信号。该地块的组织与前两位数字相同。

评估的情节

我们的目标是制造一个系统,当接收信号的频率与参考信号的频率非常相似时,它会产生一个相对较大的直流偏置,不管这两个信号之间的相位关系如何

现在,让我们只看左上角的图,它显示了接收到的I信号的二进制0解码。

在图1中,第一个和第三个符号对应一个很大的直流偏移量,它们是二进制0符号。在图2中,接收信号与参考信号之间的45°相位差使得二进制0符号的直流偏移减小;尽管如此,补偿仍然相当大。在图3中,接收信号与参考信号之间的90°相位差消除了直流偏置。

如果您观察右上角的图形的变化,您会看到相反的趋势:二进制0符号的偏移量从0开始,并在第二和第三个数字中增加。这是I/Q处理的“平衡”效果。通过产生两个相位差为90°的基带信号,确保相位增大偏差在一个基带信号是通过增加相位来平衡的对齐在另一个基带信号中。

底部一行中的图显示了相同的行为,但是针对二进制符号(即第二个和第四个符号)。

I/Q信号为复数

理解I / Q信号处理的一个键是在I / Q分量和复数之间的连接。我使用“组件”这个词,因为我波形和Q波形是从数学的角度来看,而不是自身发出的。它们是原始信号的同相和正交组件,它们以相同的方式表示原始信号,使得复数的真实和虚部表示由幅度和角度组成的矢量。

图4

到目前为止,我们一直在处理I和Q信号,好像它们是独立的,这产生的结果有点难以解释——我们本质上是在看复数矩形形式我们真正想知道的是大小。

因此,为了使我们基于I/Q的算法在数学上完整,我们需要将I和Q分量转换成一个大小。

如何找到直流偏置

让我们使我们的I / Q数据更容易通过生成对应于上图的三个图的图来可视化,但是每个符号由其直流偏移量替换(以数学术语为单位)。你可能会记得我们在前一篇文章结束时做了同样的事情解码FSK信号

> SymbolOffsets_Zero_I_aligned(((k-1)*Samples_per_Symbol)+1:k*(Samples_per_Symbol)) = mean(DecodeZero_I_aligned ((((k-1)*Samples_per_Symbol)+1:k*(Samples_per_Symbol)));>结束

这对于循环是所有其余的模板。您需要总共12个,因为我们有12个阵列(对应于上面显示的12个曲线)。你需要改变的唯一事情是解码…数组和SymbolOffsets……数组中。例如:

> SymbolOffsets_One_Q_90deg(((k-1)*Samples_per_Symbol)+1:k*(Samples_per_Symbol)) = mean(DecodeOne_Q_90deg (((k-1)*Samples_per_Symbol)+1:k*(Samples_per_Symbol)))>结束

我使用了以下命令(根据需要对其他数组进行修改)来绘制数据并改进外观。

subplot(2,2,1) plot(SymbolOffsets_One_I_aligned) subplot(SymbolOffsets_One_I_aligned) subplot(SymbolOffsets_One_I_aligned) subplot(SymbolOffsets_One_Q_aligned) subplot(SymbolOffsets_One_I_aligned) subplot(SymbolOffsets_One_I_aligned) subplot(SymbolOffsets_One_Q_aligned) f = gcf();对于k=1:4 > f.children(k)。font_size = 3;> f.children (k)。Data_bounds = [0, -0.2;120年,0.7);> f.children .children.children (k)。厚度= 2;>结束

以下是结果。对于每组地块,结果如下所示:

  • 左上角:译码零,I分量
  • 右上角:解码零,Q分量
  • 左下:解码1,I分量
  • 最正确的是:解码一,Q分量。

相位对齐基带信号的直流偏置

图5

45°相移的基带信号的直流偏移

图6

90°相移基带信号的直流偏置

图7

如何从I/Q转换为大小

在产生相位无关解码结果的过程中,最后一步是将I和Q偏移合并成一个单独的解码值。这可以通过以下方式实现:

symboloffs_zero_aligned = sqrt((symboloffsets_zero_i_aligned。* symboloffsets_zero_i_aligned)+(symboloffsets_zero_q_aligned。* symboloffs_zero_q_aligned)));symboloffs_one_aligned = sqrt((symboloffsets_one_i_aligned。* symboloffsets_one_i_aligned)+(symboloffsets_one_qujeced。* symboloffsets_one_q_aligned));symboloffs_zero_45deg = sqrt((symboloffsets_zero_i_45deg。* symboloffsets_zero_i_45deg)+(symboloffsets_zero_q_45deg。* symboloffsets_zero_q_45deg));symbanoffs_one_45deg = sqrt((symboloffsets_one_i_45deg。* symboloffsets_one_i_45deg)+(symboloffsets_one_qu@ _45deg。* symboloffsets_one_q_45deg));symboloffs_zero_90deg = sqrt((symboloffsets_zero_i_90deg。* symboloffsets_zero_i_90deg)+(symboloffsets_zero_q_90deg。* symboloffs_zero_q_90deg));symboloffs_one_one_90deg = sqrt((symboloffsets_one_i_90deg。* symboloffsets_one_i_90deg)+(symboloffsets_one_que_q_90deg。* symboloffsets_one_q_90deg));

下面的命令将绘制结果:

次要情节(3,2,1)情节(SymbolOffsets_Zero_aligned)次要情节(3 2 2)情节(SymbolOffsets_One_aligned)次要情节(3 2 3)情节(SymbolOffsets_Zero_45deg)次要情节(3 2 4)情节(SymbolOffsets_One_45deg)次要情节(3 2 5)情节(SymbolOffsets_Zero_90deg)次要情节(3 2 6)情节(SymbolOffsets_One_90deg) f = gcf ();对于k=1:6 > f.children(k)。font_size = 3;> f.children (k)。Data_bounds = [0, -0.2;120年,0.7);> f.children .children.children (k)。厚度= 2;>结束

准确解码,不考虑相位关系

如您所见,I / Q信号处理已被淘汰的影响阶段接收信号与参考信号之间的差值。二进制0和二进制1符号现在产生了完全的直流偏移,可以被精确解码,不管发射机和接收机之间的相位关系如何。

我希望你现在理解了正交调制在基于dsp的FSK解码中的价值,并且你对如何在现实中实现频移键控有一些清晰的想法软件定义射频数据链路。