基于matlab产生数字信号的时域波形——将数字信号当作特殊的模拟信号

在使用matlab的时候,可以很方便的表示二进制的序列或者其他形式的数字信号。用一个行向量表示即可。

但是有时候需要对数字信号的时域波形进行某些操作,例如对时域信号进行调制。将正弦波和一个向量相乘是不现实的,因此本文讲说明如何将matlab中的向量恢复成细小的采样点组成的函数采样序列

写贴上整个的代码

%用来产生二进制码的波形

%待转换的二进制序列
x=round(rand(1,20));%用对随机数取整数的方法产生二进制序列,也可以是其它需要的序列

%基本设定
codeN=length(x);%码元个数
codeTap=1;%每个码元的时间
sampRate=50;%每个码元时间内有多少个取样点
sampTime=codeTap/sampRate;%取样周期内每个取样点的时间间隔

startTime=0;%信号开始的设定时间
tCir=0:sampTime:codeTap-sampTime;%每个码元的时间范围
t=startTime:sampTime:codeTap*codeN-sampTime;%最终输出结果的时间范围

%设定码元和波形的对应关系,可以是需要的波形直接的01码
x0=zeros(1,length(tCir));%码元为0时对应的波形
x1=ones(1,length(tCir));%码元为1时对应的波形
xDirection=[x0;x1];%波形的查询列表,用于在迭代时进行查询

%得到输出波形
y=[];%输出信号的初始化
for i=x%对进制码进行迭代
    y=cat(2,y,xDirection(i+1,:));
end

plot(t,y);

输出波形如图

脚本前面的相关参数设定可以需要更改,也可以选择合适的输入输出变量变成一个需要的函数。

脚本中的xDirection变量可以扩展成不同的维度,适应不同的进制数,例如对于四进制的情况,可以把查询列表部分的代码改成这样:

%待转换的二进制序列
x=round(3*rand(1,20));%用对随机数取整数的方法产生二进制序列,也可以是其它需要的序列


%设定码元和波形的对应关系,可以是需要的波形或直接的01码
x0=zeros(1,length(tCir));%码元为0时对应的波形
x1=ones(1,length(tCir));%码元为1时对应的波形
x2=2*ones(1,length(tCir));%码元为2时对应的波形
x3=3*ones(1,length(tCir));%码元为3时对应的波形
xDirection=[x0;x1;x2;x3];%波形的查询列表,用于在迭代时进行查询

相应地波形如图

因为代码的结构设定,波形查询列表可以不是单纯的恒定值,也可以在产生波形的过程中直接完成调制的功能。例如将查询部分的代码改写成

%设定码元和波形的对应关系,可以是需要的波形或直接的01码
x0=cos(2*pi*codeTap*tCir);%码元为0时对应的波形
x1=cos(6*2*pi*codeTap*tCir);%码元为1时对应的波形
xDirection=[x0;x1];

从而完成了2FSK调制,波形如图所示

算法不完善的方面

最终生成信号的时候采用了迭代方法,并且迭代过程中对矩阵的大小进行了多次改写,运行速度较慢。因此烦请大佬指出是否有更优的解决方案。感谢提出指正。

猜你喜欢

转载自blog.csdn.net/qq_39148922/article/details/84340400