You are on page 1of 10

通信MATLAB仿真常用函数

陈老湿
中国科学技术大学 信息与通信工程硕士

57 人赞同了该文章


前面在写通信MATLAB仿真相关知识时,构建一个通信仿真,总会重复性用到
一些MATLAB的自带函数。当然,如果自己实现相应的函数也可以。

但是,对于刚开始做仿真的同学,一开始可能不一定知道MATLAB是否有自带
函数来实现自己想要的功能。这种情况下,我的做法一般就是先网上搜索或者
在MATLAB文档搜索一下是否有相应函数。

陈老湿:《通信MATLAB仿真》合集
366 赞同 · 23 评论 文章

在这里,集中记录与分享一下《通信MATLAB仿真》合集中的常用函数。

至于这些函数具体怎么使用,怎么设置相应的参数,在MATLAB 命令行
“help 相应函数名”,或者在MATLAB文档搜索一下便知。

除此之外,如果读者朋友有补充的函数,也热烈欢迎你留言告诉我。

上采样

关键函数:upsample

用途:根升余弦滚降滤波器之前需要进行插值
up16_Transmit_code_I = upsample(Transmit_code_I,sps);

根升余弦滚降成型

关键函数:rcosdesign用来设计根升余弦滚降成型滤波器,输出为滤波器系
数;用conv或者filter函数来实现根升余弦滚降滤波的过程。

rcos_fir = rcosdesign(rollof_factor,6,sps);

r_msg_source_I_temp = filter(rcos_fir,1,up16_Transmit_code_I);

r_msg_source_I = r_msg_source_I_temp(1,(1+length(rcos_fir))/2:end);

波形观察

下面涉及观察信号时域、频域图。

% 波形观察 figure(1);

plot(rcos_msg_source);

title('时域波形');

figure(2);

plot(abs(fft(rcos_msg_source)));

title('频域波形');

eyediagram(rcos_msg_source(49:end),sps);

title('眼图');

眼图

eyediagram 则用来看眼图,在接收端对信号的质量做一个简单的定性判断。
插值函数

目前我只用到interp1这函数,该函数的method常用“spline”。

插值算法在两个地方用到:
(1)一个是在信道估计,没有导频位置处的信道增益值,需要用到已有导频
处的信道增益估计值进行插值计算出来;

陈老湿:第7章:OFDM 信道估计与均衡
(4)
120 赞同 · 134 评论 文章

(2)位定时环路中采用Gardner环路时,进行插值。

陈老湿:第10章(1):位同步——
Gardner环路
73 赞同 · 49 评论 文章

调制解调函数

发送端的调制函数有pskmod、qammod,接收端对应的解调函数有
pskdemod、qamdemod;

以pskmod为例,其中值得注意的是,ini_phase常用pi/4,symorder常采用
Gary码映射。
眼图

观察信号的星座图。

M = 4;

data = randi([0 M-1],1000,1);

txSig = pskmod(data,M,pi/M);

rxSig = awgn(txSig,20);

scatterplot(rxSig)
误比特数和误比特率

注意,[ number , ratio ] = biterr( x,y )中的x,y都是0或者1,来进行比对与统


计。

误码率曲线

如果要画出误码率曲线,还要semilogy函数。
semilogy(EbNoVec,berEst,'*')

hold on semilogy(EbNoVec,berTheory)

grid

legend('Estimated BER','Theoretical BER')

xlabel('Eb/No (dB)')

ylabel('Bit Error Rate')

计算功率

spow2 = sum(norm(modulate_data,'fro').^2)/(N_ifft); %计算功率值


spow4 = sum(abs(modulate_data).^2)/(N_ifft);

比如在添加高斯白噪声时,虽然有EbN0等效到SNR,还是先需要计算信号的
功率值,然后才能算出高斯白噪声的功率,进而将噪声功率转化为噪声幅度,
加到信号中。
陈老湿:第7章:OFDM 信道估计与均衡
(1)
104 赞同 · 67 评论 文章

频率响应

如果想要观察一个数字滤波器幅频响应和相频相应图,可以使用freqz函数,这
是数字域的。

当然,也有模拟域的函数,即freqs。

%%%%%%%%%%%%%%%%%%%%%% 画出CIC滤波器的频率响应图 %%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%% test_CIC.m %%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%% date:2021年1月9日 author:飞蓬大将军 %%%%%%

%%%%%%%%%%%%%%%%%程序说明

%%%参考书籍 Digital Communications: A Discrete-Time Approach Chapter 9

%%%%%% 仿真环境

%软件版本:MATLAB R2021a

%%%%%%**** CIC 滤波器

b = [1 0 0 0 0 0 0 0 0 0 -1];

a = [1 -1];

[h,w] = freqz(b,a,'whole');

h(1,1) = length(b)-1;

h_shift = fftshift(h);

n = length(w);

num = 1; %多少个级联

w_shift = (-n/2:n/2-1)*(1/n); % zero-centered frequency range

% plot(w_shift,abs(h_shift))

plot(w_shift,20*log10(abs(h_shift).^num))

peaks = findpeaks(20*log10(abs(h_shift).^num));

xlabel('Normalized frequency(cycles/sample)');

ylabel('|H(e^jw)|(dB)');

grid on;

CIC滤波器的幅频响应图

其中,findpeaks这个函数可以找到局部峰值,这样便有助于定量判断主瓣比
旁瓣值大多少。
同步

如果需要用到位同步或者载波同步的同学,可以参考以下几个函数。同时,也
可以将自己实现功能的函数与MATLAB自带函数进行性能对比。

comm.SymbolSynchronizer 、comm.PhaseFrequencyOffset 、
dsp.Delay、dsp.VariableFractionalDelay、comm.CarrierSynchronizer、
QPSK Transmitter and Receiver。

欢迎你双击屏幕、点赞、收藏、转发和分享,关注我的知乎号,也欢迎读者朋
友就相关技术问题与我交流,一起学习,共同进步。请你也别忘了把这篇文章
分享给你身边正在学习通信专业的同学们,也许能够帮到Ta。

这是《陈老湿·通信MATLAB仿真》,下次更新见!
编辑于 2022-01-11 10:36

You might also like