使用simulink的延时器的时候,通过不断地导出变量到工作区,我终于搞明白了延时器中基于帧和基于样点的设置的区别
使用场景
在使用simulink对信号的调制解调进行仿真学习的时候,由于过程中需要使信号通过各种滤波器,滤波器的群时延会导致滤波完的信号会有一定的延迟。所以在接收方接收到了信号,想拿来和发送的信号进行对比以计算误码率的时候,二者如果不同步就会导致误码率很高,基本都是50%(那不就是猜么),所以同步是一件非常有必要的事。
结合实例分析
既然滤波器导致的延迟无法避免,那我们可以将发送的信号进行延迟以进行同步。比如下图是一个简单的QPSK收发链路:
其中黄框中的subsystem中包含有一个低通滤波器,并且和黄框相连的前后两个是两个根升余弦滚降滤波器(square root),这三者的阶数都设置为160,进而群延时为80个sample(这里就出现sample的概念了),如下图
而在simulink中,会把数据分成帧(frame)来处理,比如伯努利信源的设置界面中:
可以看到其中是包含有sample time和sample per frame的设置的。sample time就是采样率,可以理解为每隔1/1000秒,就可以得到一个随机bit;samples per frame就是帧长。那帧是啥?
帧可以理解为数据的一个打包。打包成帧之后,每一帧的数据就可以视为一个个独立的小矩阵,那对其进行一些矩阵操作,无论点乘(.*)还是普通矩阵乘,或者一些校验什么的,就会非常的方便。
但是到了延迟设置的时候,这个方便的帧就令人抓狂了。如下图两处的设置(其他设置我没用过也不太清楚):
实验验证
我始终搞不懂这个sample based和frame based之间有啥区别,于是我就做了这么个实验:
使用伯努利信源,设置如下图,仿真时间设为10,将输出的信号导出到工作区,我得到一个维度为20x1x501的rdata1变量
即得到了501帧数据,每帧长20,且使用rdata(:, :, k)就可以方便的访问任意第k帧的数据。
现在回到最开始的那个问题,如果我有三个filter,每个有80 samples的延迟,那我最后如何设置延迟器的延迟呢?
首先假设系统为BPSK,那么,在上图的设置,都为1000,但是在升余弦滚降滤波器中我使用了16x的上采样,于是采样率变为了16k。如果延迟了80x3个样点,就是延迟了80x3个样点的时间,即总延时:80x3x1/16k。现在要将这个总延时换算为样点数,因为是发送方直接将数据进行延迟之后和接收方进行计算误码率的,而不是上采样的数据。而在simulink的延迟器设置中,延时只能是一个样点时长的整数倍。所以使用之前得到的总延时除以发送方的采样率(也是符号率,但是这里是BPSK,所以同时也是比特率),即延迟的样点数为:(80x3x1/16k) / (1/1k) = 15个。
注意,这里延迟的是15个sample。
那在delay模块中怎么设置才行呢?
我又做了如下的实验:
将Delay模块设置为基于sample,得到了rdata1 rdata2两个数据(如下图),通过对比可以发现,延迟过的数据是帧整体延迟了三个单位
再将Delay模块设置为基于frame,得到了rdata1 rdata2两个数据(如下图),通过对比可以发现,延迟过的数据是帧中的数据延迟了三个单位
根据实验结果,就知道了帧和样点之间了关系。至于之前那个问题的delay怎么设置,管他的呢。