M=3*Nbit; %导频个数 EbNo=0:35; %信噪比 err(length(EbNo))=0; %误码率
MSE(length(EbNo))=0; %信道估计MSE message = rand(1,N)>0.5; %二进制比特流 pf(1:M) = 1+i; %导频信号
%生成二进制比特流并qpsk调制
qpsk_IQ = [-1 1];
qpsk_I = qpsk_IQ(message(1:2:end)+1); qpsk_Q = qpsk_IQ(message(2:2:end)+1); qpsk=(qpsk_I+1j.*qpsk_Q);
MN=M+length(qpsk); frame(1:MN)=0; %帧信号 %组帧
k=1; j=1;
for i=1:length(qpsk) frame(j)=qpsk(i); j=j+1;
if( mod(i,7)==0 )
frame(j)=pf(k);j=j+1;k=k+1; frame(j)=pf(k);j=j+1;k=k+1; frame(j)=pf(k);j=j+1;k=k+1; end end
frame_rayl(1:length(frame))=0; %通过瑞利信道后的帧信号
%产生瑞利分布
hb=unifrnd (0,2*pi,1,Nbit); ha=raylrnd(1,1,Nbit); h=ha.*exp(1i.*hb);
%帧通过瑞利信道
j=1;
for i=1:length(h) for k=1:10
frame_rayl(j)=h(i)*frame(j);j=j+1; end end
pf_awgn(1:M)=0; %加高斯白噪声导频信号部分
qpsk_awgn(1:length(qpsk))=0; %加高斯白噪声qpsk信号部分 h_est(1:Nbit)=0; %根据导频信号计算出的信道估计
qpsk_est(1:length(qpsk))=0; %根据计算出的信道估计得到接收到的qpsk信号
%计算误码率与信道估计的MSE for kk=1:length(EbNo)
frame_awgn = awgn(frame_rayl,EbNo(kk),'measured'); %加高斯白噪声 %分离组帧中的数据信号与导频信号
jj=1;ii=1;
for j=1:length(frame_awgn)
if( mod(j,10)==0 || mod(j,10)==8 ||mod(j,10)==9 ) pf_awgn(jj)=frame_awgn(j);jj=jj+1; else
qpsk_awgn(ii)=frame_awgn(j);ii=ii+1; end end
%根据导频信号计算信道估计
h_awgn=pf_awgn./pf; for jjj=1:length(h_est)
h_est(jjj)=(h_awgn(jjj*3-2)+h_awgn(jjj*3-1)+h_awgn(jjj*3))/3; end k=1;
%根据计算出的信道估计,计算接收到的qpsk信号
for iii=1:length(qpsk_est)
qpsk_est(iii)=qpsk_awgn(iii)/h_est(k); if( mod(iii,7)==0 ) k=k+1; end end
%qpsk解调
qpsk_est_re=real(qpsk_est); qpsk_est_im=imag(qpsk_est); qpsk_IQD = [0 1];
qpsk_est_re(find(qpsk_est_re>1)) = 1; qpsk_est_re(find(qpsk_est_re<-1)) = -1; qpsk_est_im(find(qpsk_est_im>1)) = 1; qpsk_est_im(find(qpsk_est_im<-1)) = -1; qpsk_de=[zeros(1,N)];
qpsk_de(1:2:end) = qpsk_IQD(round((qpsk_est_re+1)/2) + 1); qpsk_de(2:2:end) = qpsk_IQD(round((qpsk_est_im+1)/2) + 1);
%计算误码率
err(kk)=length(find((qpsk_de-message)~=0)); err(kk)=err(kk)./N;
%计算信道估计的MSE
for imse=1:length(h)
MSE(kk)=MSE(kk)+(abs(h(imse)-h_est(imse)))^2; end
MSE(kk)=MSE(kk)/length(h); end
plot(EbNo,err);xlabel('EbNo/dB');ylabel('误码率'); figure(2)
plot(EbNo,MSE);xlabel('EbNo/dB');ylabel('MSE');
2.仿真结果
MSE曲线
BER曲线
实验五FPGA 实验 HDB3 编码器设计
一、实验目的
⒈ 深入理解 HDB3 编码原理。
⒉ 学习用 VerilogHDL 硬件描述语言建模较复杂时序逻辑电路。 ⒊ 学习 FPGA 设计中的 Testbench(测试平台)技术。 ⒋ 掌握 FPGA 设计中仿真与综合的概念。 ⒌ 学习编写仿真测试代码与可综合代码。
二、报告要求
⒈ 输入信号为全 全 0 码时,以下各时序仿真结果:(ModelSim 中截图)
⑴ 加 V 后; ⑵ 补 B 后;
⑶ 最终得到的 HDB3 码。
2. 改写 HDB3 编码器的测试文件代码,使测试文件能 连续产生伪随机序列,将改写后的 测试文件代码写在实验报告中。(可以参考教师提供的 VerilogHDL 教程中的第 10 章 10.3.8 部分的内容)
3. 思考:测试文件代码和编码器模块代码都是用 VerilogHDL 语言编写的,这两种代码在 语法上有什么区别?分别举一个例子进行比较。
三、实验结果
1.
data_v:加V信号 data_b:加B信号 dataout:最终信号 2. 测试文件
timescale 1ns/100ps
module HDB3_encoder_test; reg clk; reg reset_n; reg datain;
wire [2:0] dataout;
HDB3_encoder DESIGN (
.clk (clk),
.reset_n (reset_n), .datain (datain), .dataout (dataout) ); initial begin
clk=1'b0; end