1.上采样函数(用升余弦滚降滤波器前要进行插值)
y=upsample(x,n);
x 是原始信号,一个向量。
n 是上采样的倍数,即每两个原始样本之间将插入 n-1 个零。
一般情况下n=sps=fs/Rs sps为单个符号范围内的采样数
y 是上采样后的信号,其长度是原始信号长度的 n 倍。
2.脉冲成型滤波器
用于定义滤波器系数
fir_rcos_trans=rcosdesign(rolloff,span,sps,shape);
fvtool(fir_rcos_trans,'Analysis','impulse'); %将脉冲响应可视化
rolloff:滚降系数
span:截断范围
sps:单个符号范围的采样数 sps=fs/Rs
shape:可以选填'sqrt'(均方根成型滤波器),'normal'(升余弦滤波器)
一般在通信系统中,使用‘sqrt’
3.滤波&卷积
rcos_data = conv(data_i_upsample,fir_rcos_trans,'same');
conv也可以视为信号与系统中经常提到的卷积函数
fir_rcos_trans 是前面设计的根升余弦滤波器的系数数组。相当于卷积中的h(t)
'full' - 返回完整的 N 维卷积。
'same' - 返回卷积中大小与 A 相同的中心部分(去掉拖尾)。
'valid' - 仅返回计算的没有补零边缘的卷积部分。
data_i_upsample 是需要被滤波的信号,这里假设它已经被上采样(例如,通过在每个原始样本之间插入零来实现),并且可能还经过了其他预处理。
rcos_data是滤波后的信号,滤波器的阶数是(span*sps +1),带来的延时是(span*sps)/2。
4.波形观察(时域,频域,眼图,星座图)
figure(1);
plot(rcos_msg_source);
title('时域波形');
figure(2);
plot(abs(fft(rcos_msg_source)));
title('频域波形');
figure(3);
eyediagram(rcos_msg_source(49:end),sps);
title('眼图');
%%绘制教材中完美的星座图要采用解调后的波形,如果想看到一堆乱点的星座图,用抽样判决前的数据,星座图用于判断调制方式的误码率
scatterplot(rx_data);
title('星座图');
5.AWGN信道
首先需要预设snr(单位dB),通常情况下snr为10dB以上不失真(在仿真中-20dB以上一般可以画出和理论较为相似的Eb/N0~BER曲线)
数字通信系统常采用 Eb/N0~BER 来衡量通信系统的性能,在matlab中 EsN0与 EbN0的计算公式与理论推导略有不同。
EsN0=snr+10*log10(0.5*sps);
EbN0=snr+10*log10(0.5*sps)-10*log10(M); %M为输入码元的比特数
信号通过AWGN信道
data_qpsk_addnoise = awgn(data, snr, 'measured');% 经过awgn信道
关于上述公式中0.5*sps的问题,是因为matlab在生成AWGN信道时会自动将功率谱范围变为2倍因此在计算时,基带:sps 频带:0.5*sps
6.理论误码率计算
以QPSK为例
ber_qpsk = berawgn(EbN0, 'psk', M, 'nondiff');
需要选定调制方式,注matlab中不认可qpsk这种调制方式
对于非差分数据编码,需要使用'nondiff'