simulink的frame和sample的问题

使用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,那么 R b = R s R_b = R_s Rb=Rs,在上图的设置,都为1000,但是在升余弦滚降滤波器中我使用了16x的上采样,于是采样率变为了16k。如果延迟了80x3个样点,就是延迟了80x3个样点的时间,即总延时:80x3x1/16k。现在要将这个总延时换算为样点数,因为是发送方直接将数据进行延迟之后和接收方进行计算误码率的,而不是上采样的数据。而在simulink的延迟器设置中,延时只能是一个样点时长的整数倍。所以使用之前得到的总延时除以发送方的采样率(也是符号率,但是这里是BPSK,所以同时也是比特率),即延迟的样点数为:(80x3x1/16k) / (1/1k) = 15个。

结论,应该延迟15个样点。

那在delay模块中怎么设置才行呢?

我又做了如下的实验:
在这里插入图片描述
将Delay模块设置为基于sample,在工作区得到了rdata1和rdata2两个数据(如下图),通过对比可以发现,延迟过的数据是帧整体延迟了三个单位,数据的移动是按列为单位的。(注意下图的箭头反了)
在这里插入图片描述
再将Delay模块设置为基于frame,得到了rdata1和rdata2两个数据(如下图),通过对比可以发现,延迟过的数据是帧中的数据延迟了三个单位,数据的移动是按其中的数据为单位的。
在这里插入图片描述

结论

但是发现一点,如果设置成基于的,那么延迟的长度是几个样点;如果设置成样点的,那么延迟的长度是几。那这不是反过来了么? simulink这么设计是咋想的?

经过查阅资料,在《Simulink 与信号处理》书中,看到了这么一句话:
在这里插入图片描述
原来是这样,在simulink中,任何信号都可以看作是帧或者样点,如果视为,那么处理的最小单位就是帧里面的一个个的数据,将其中更小的单位视为不可分的“原子”(举例而已,原子可分);如果把信号视为样点,那么就把每个信号视为一个样点,样点总不能再分了吧,所以处理的对象就是它本身,把自己当作一个不可分“原子”,无论它本身是30x1还是20x1。

### 如何在Simulink中实现快速傅里叶变换(FFT) #### 创建新的Simulink模型 启动MATLAB并打开一个新的Simulink模型窗口。这可以通过命令行输入`simulink`来完成。 #### 添加必要的模块 为了构建一个能够执行FFT的简单仿真环境,在库浏览器中找到以下模块: - **Sine Wave**: 来自Sources库,用于生成正弦波作为测试信号。 - **Buffer**: 来自Signal Management下的Operations子库,用来缓冲数据以便于后续处理。 - **FFT**: 存在于DSP System Toolbox内的Transforms分类下,专门负责计算输入序列的离散傅立叶变换[^2]。 - **Scope**: 同样来自Sinks库,可视化输出结果。 这些组件通过拖拽方式加入到工作区,并按照逻辑顺序连接起来形成一条完整的路径:从信号源经过缓存再到转换器最后到达观察端口。 #### 配置参数设置 对于每一个选定的模块都需要适当调整其属性以适应特定应用场景的要求。特别是针对`Buffer``FFT`两个核心部分: - `Buffer`: 设置适当的帧大小(Frame Size),它决定了每次传递给FFT多少样本点;同时也要注意重叠率的选择,这对于提高分辨率至关重要。 - `FFT`: 默认情况下可以接受实数或复数值形式的数据流作为输入。如果希望得到单边频谱,则需额外配置相应的选项或将输出进一步加工处理。 #### 编写脚本辅助操作 有时仅靠图形界面难以满足复杂需求,此时可以在MATLAB环境中编写一小段代码来进行更精细的操作。比如定义变量保存重要参数、调用内置函数获取初始条件等。下面给出一段简单的例子说明如何初始化某些全局使用的常量: ```matlab Fs = 1000; % Sampling frequency (Hz) T = 1/Fs; % Sample time interval (seconds) L = 1000; % Length of signal t = (0:L-1)*T; % Time vector f = Fs*(0:(L/2))/L; % Frequency domain axis for one-sided spectrum ``` 上述片段设置了采样频率为1kHz,总长度设为一千个周期,从而确保整个过程覆盖了一秒钟的时间范围[^3]。 #### 运行模拟查看效果 当所有准备工作完成后就可以点击运行按钮开始实验了。利用之前提到过的`Scope`工具实时监控变化趋势,也可以导出最终的结果至workspace做更加深入的研究分析。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值