正交 IQ 信号的 ASK、FSK 解调实践

[toc]

背景

异常的轮胎气压可能会破坏汽车的稳定性并影响汽车的驾驶和制动,增加安全隐患,特别是在高速行驶过程中,由于轮胎气压、温度异常导致的轮胎故障是引起突发性交通事故的主要因素之一,胎压监测系统 (TPMS) 作为非常重要的主动安全部件,已经拥有越来越广阔的市场。

胎压监测系统由位于驾驶室的接收器和安装于各个轮胎端的发射器组成。胎压监测系统示意图如下,发射器对汽车各个轮胎的气压、温度适时地进行监测,并将监测数据传送给接收器。接收器接收并处理数据,当发现轮胎气压或温度异常时,告警以提醒驾驶员及时进行处理,可以有效地预防轮胎故障的发生。

当汽车轮胎损坏需要更换时,可以选择其他厂商性价比较高的替代件。由于目前国内外对 TPMS 的通信协议暂时没有统一规定,所以生产销售其它厂商替代件时需要破解其 TPMS 模块的通信协议。我实习所在的技术研发部主要使用频谱仪对 TPMS 模块的射频 RF 信息解调后进行人工分析。由于频谱仪显示屏幕较小,人工分析射频信息所需时间长并且对数据分析处理不方便,容易造成视觉疲劳。

目标和方法

在本科校外实习期间,我曾在 PC 端利用 Matlab 对频谱仪导出的 I/Q 数据进行分析,然后绘制出频谱信息,方便人工进行分析和研究。其中,ASK、FSK 解调流程如下:

  1. 从频谱仪中导出频谱仪 I/Q 数据;
  2. 在 matlab 上编程实现基于 I/Q 数据的多帧 ASK 和 FSK 解调;
  3. Matlab 解调结果和频谱仪基本吻合,并实现解调自动化。

导入 I/Q 数据

以某型号频谱仪为例,利用设备提供的 I/Q 解调功能采集数据,保存在后缀名为 “.mat” 的文件中进行脱机分析处理。

用 MATLAB 代码 “LOAD EXAMPLE.MAT” 将数据导入。下图是利用 RSA3303A 采集数据后存储为 “.mat” 文件的内容。

通过对频谱仪用户手册和文献资料的查阅,我了解到频谱仪导出数据的含义基本如下:

  • Y 是一个复变量,包含了采样数据点的同相 I 分量和正交 Q 分量。
  • InputCenter 显示了采样时的中心频率,据此可计算出实际频率分量。
  • InputZoom 值为 1,表示采集数据已下变频到基带。
  • **XDelta ** 为采样周期,由此可以计算出采样率 (fs=1/XDelta)。

ASK、FSK 解调

IQ 数据简介

极坐标参量与 I/Q 直角坐标参量间的转换示意如下图。

极坐标图表示的矢量的参数是幅值和瞬时相位,一般表示为 $A\angle \theta$ ,因为所有调制形式针对载波的改变都是幅值、相位以及可以由相位推导的频率,极坐标图是分析调制技术矢量参数的主要描述方式。

I/Q 直角坐标图表示矢量的参数不是直接的幅值和瞬时相位,而是把它们投影在 I/Q 直角坐标轴上,采用 I 轴和 Q 轴的投影分量来确定矢量。

数据分析

根据 “.mat” 文件中的每个采样时刻的 I/Q 采样数据 Y,可得到相应的 I 分量和 Q 分量,用 MATLAB 代码表示为:I=real (Y),Q=imag (Y)。采集到的数据可用幅度分析、频率分析、相位分析以及小波分析等方法进行处理。

  • 输入信号的幅度 $Am$ 分析: $Am=\sqrt {I^{2}+Q^{2}}$ 。根据 I/Q 信号的每一个采样值,可以计算出对应采样时刻的幅度值。在测量时间内的所有幅度数值构成 I/Q 幅度数组,对应于 “射频功率-时间曲线”。

  • 输入信号的相对相位 $\Phi m$ 分析: $\Phi m=arctan (Q/I)$ 。根据 I/Q 信号的每一个采样值,可以计算出对应采样时刻的相对相位值。在测量时间内的所有 $\Phi m$ 数值构成 I/Q 相对相位数组 $\Phi m$ 。

  • 输入信号的频率 $F m$ 计算:$F m = \frac {d (\Phi m)}{dt}$ 。在测量时间内的所有 $F m$ 数值构成 I/Q 频率数组 $F m$,对应于频率曲线。

  • 频谱计算:Spectrum = FFT (Y)。对 I/Q 数据 Y 进行傅里叶变换,即可计算出其频谱值。其中,Spectrum 为输入信号中频带宽内的频谱。

解调实例分析

FSK 解调实现

FSK 就是用数字信号去调制载波的频率,FSK 解调一般采用两种方式:非相干解调和相干解调。

相干解调需要同步信号,适用于窄带调频信号解调;

非相干解调不需要同步信号,对于窄频带调频 (NBFM) 信号和宽频带调频 (WBFM) 信号均适用。

非相干解调,即不需提取载波信息(或不需恢复出相干载波)的一种解调方法,优点是可以较少的考虑信道估计甚至略去,处理复杂度降低,实现较为简单,但相比相干解调方法性能下降,从定量角度来看,普遍的结果是非相干解调性能上比相干解调差 3dB。

我选用非相干解调方法进行解调,主要应用上述计算频率 $F m$ 的公式,将频谱仪导入的 I/Q 数据先计算瞬时相角,再微分计算出频率。

Matlab 代码为:

1
diff(unwrap(angle(Y)))

其中,unwrap () 是解卷绕,经观察解调效果良好。

Matlab解调结果

局部放大对比图

ASK 解调实现

ASK 是振幅键控方式,这种调制方式是根据信号的不同,调节正弦波的幅度。这里参考上述计算幅值 $Am$ 的公式,将频谱仪导入的 I/Q 数据计算瞬时幅值。

Matlab 代码为:

1
magY=10*log10(real(Y).^2+imag(Y).^2)+GainOffset

其中,GainOffset 与仪器硬件相关,经观察解调效果良好。

Matlab解调结果

局部放大对比图

综上,Matlab 解调结果与频谱仪图形对比可以看出,Matlab 解调结果和频谱仪所示基本吻合,并且可以随意放大和缩小,方便人工查看和分析,并实现解调自动化,可以方便人工分析。

源代码

ASK 解调源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
%文件askshow.m
%用途:ASK解调并matlab显示
%用法:输入导入数据向量、幅度截止和增益,元素之间用逗号分开
function data=askshow(Y,cutoff,GainOffset)
datalength=length(Y);%获取数据长度
magY=10*log10(real(Y).^2+imag(Y).^2)+GainOffset;%对Y中每一个数据求绝对值,然后以10为底求对数
%magY=20*log10(abs(Y))+GainOffset;
y=zeros(datalength,1);%生成length(Y)行1列的零矩阵y,用于存储处理的数据
for i=1:datalength
if magY(i)<cutoff %如果低于cutoff,则强制截止等于cutoff
y(i)=cutoff;
else y(i)=magY(i);
end
end
n=0:1:datalength-1;%初值:增量:终值
xspan=n;%生成x轴坐标值
plot(xspan,y);%做出以数据(xspan(i),y(i))为结点的折线图
title('ASK显示');%图形标题说明
ylabel('10dBm');%坐标轴y轴说明
axis([0,datalength-1,cutoff-0.1,-1]);%定制2维坐标轴范围
grid on;%显示格栅

FSK 解调源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
%文件 fskdemo().m
%用途:频谱仪导入I/Q数据进行FSK非相干解调,输出解调图像,可解调多峰值
%用法:输入导入数据向量,幅值截止值
function fskdemoshow=fskdemo(Y,cutoff)
close all;%关闭所有的图片窗口
DataLength=length(Y);%获取.mat格式的数据长度
magY=abs(Y);%求I/Q数据的幅值
m=1:DataLength;
figure(1);
plot(m,magY);
title('幅度显示');%图形标题说明
%获取高峰值数目PeakNumber
TestEnd =1;%峰值检验初始起始点
PeakNumber=0;
for time=1:100%预计极限峰值数
for i=TestEnd:DataLength %检测峰值开始值
if magY(i)>cutoff
TestBegin=i;
PeakNumber=PeakNumber+1;
break;
end
end
for i= TestBegin: DataLength %检测峰值结束值
if magY(i)<cutoff
TestEnd=i;break;
end
end
end
TestEnd =1;%峰值检验初始起始点
%峰值数目大于等于100提示
if(PeakNumber>=100)
disp('峰值数超过100次,处理可能出错!');
end
%峰值fsk解码处理显示
for time=1:PeakNumber%峰值数
for i= TestEnd: DataLength %检测峰值开始值
if magY(i)>cutoff
TestBegin=i;break;
end
end
for i= TestBegin: DataLength %检测峰值结束值
if magY(i)<cutoff
TestEnd=i;break;
end
end
ValueNumber= TestEnd- TestBegin;%计算当前峰值总数
y=Y.';%矩阵倒置
ValueData=y(1,TestBegin:TestEnd-1);
PhaseDiff=diff(unwrap(angle(ValueData)));%核心算法
m=1:ValueNumber-1;
figure(time+1);%图片递增打开
plot(m, PhaseDiff);
axis([1,ValueNumber-1,-2.5,2.5]);%X,Y轴尺度要变化
title('FSK解调显示');%图形标题说明
grid on%显示格栅
end

References

  • 关玉莲。正交解调在无线电信号分析中的应用。中国无线电. 2010 年第 11 期
  • 《RSA3408B 8 GHz Real-Time Spectrum Analyzer User Manual》