2024年4月4日发(作者:)
通信工程实验报告
班级:___通信1班____
学号: ________
姓名: 华亿超市
实验一 FPGA 实验 BDPSK 调制解调器设计
一、实验目的
⒈ 掌握BDPSK 的调制和解调原理。
⒉ 掌握倍频和分频的概念以及原理。
⒊ 用VerilogHDL 硬件描述语言建模时序逻辑电路,实现BDPSK 基带调制解调
系统。
二、实验报告要求
⒈ 调制器和解调器的外引脚图和内部结构图。(Microsoft Visio 中截图)
⒉ 调制器模块和解调器模块的VerilogHDL 代码及注释。
⒊ 功能仿真和时序仿真结果的波形。(ModelSim 中截图)
⒋ (选做)开发板验证后的波形。(示波器上拍照)
三、 实验结果
1、 BDPSK 调制系统的结构图。
2、 BDPSK 调制器模块的VerilogHDL 代码及注释。
分频器:
module fre_div(clk,cp0);//分频器
input clk;
output reg cp0;
parameter N=32;
integer i=0;
initial
begin
cp0<=0;
end
always@(posedge clk)
begin
if(i else begin i=0;cp0=~cp0;end end endmodule 随机码序列产生器(m序列): module PN_Seq(clk,reset_n,dataout); input clk; input reset_n; output dataout; reg [ 7 : 1 ] c; always @( posedge clk or negedge reset_n ) begin if (!reset_n) c <= 7'b1001110; else begin c[7]<=c[6]; c[6]<=c[5]; c[5]<=c[4]; c[4]<=c[3]; c[3]<=c[2]; c[2]<=c[1]; c[1]<= c[2]^c[3]^c[4]^c[7]; end end assign dataout = c[7]; endmodule 差分编码器: module dif(clk,reset_n,in,out); input clk; input reset_n; input in; output out; reg [1:0] o; always @(posedge clk or negedge reset_n) begin if(!reset_n) o <= 1; else begin o <= in^o; end end assign out = o; endmodule 控制器: module Controller(clk,reset_n,s,address,cp); input clk; input reset_n; input cp; input s; //相对码 output [ 4 : 0 ] address; reg [ 4 : 0 ] address_data; reg [ 4 : 0 ] count; reg sign ; always @(posedge cp) begin if(s==0) count<= 5'b10000; else if(s==1) count<=5'b00000; sign<= 1; end always @(posedge clk or negedge reset_n) begin if(!reset_n) address_data<=5'b00000; else begin if(sign==1) begin address_data<=count; sign<=0; end address_data<=address_data+1'b1; if(address_data==32) address_data<=5'b00000; end end assign address = address_data; endmodule 正弦波形查找表: module LookUpTable(clk,reset_n,address,dataout);//正弦载波采样表 input clk; input reset_n; input [ 4 : 0 ] address; output [ 7 : 0 ] dataout; reg [ 7 : 0 ] LUT [ 0 : 31 ]; always @( posedge clk or negedge reset_n ) begin if( !reset_n ) begin LUT[ 0 ] <=128 ; //用C编程计算出的查找表采样值填在这里 LUT[ 1 ] <=152 ; LUT[ 2 ] <=176 ; LUT[ 3 ] <=198 ; LUT[ 4 ] <=218 ; LUT[ 5 ] <=234 ; LUT[ 6 ] <=245 ; LUT[ 7 ] <=253 ; LUT[ 8 ] <=255 ; LUT[ 9 ] <=253 ; LUT[ 10 ] <=245 ; LUT[ 11 ] <=234 ; LUT[ 12 ] <=218 ; LUT[ 13 ] <=198 ; LUT[ 14 ] <=176 ; LUT[ 15 ] <=152 ; LUT[ 16 ] <=128 ; LUT[ 17 ] <=103 ; LUT[ 18 ] <=79 ; LUT[ 19 ] <=57 ; LUT[ 20 ] <=37 ; LUT[ 21 ] <=22 ; LUT[ 22 ] <=10 ; LUT[ 23 ] <=2 ; LUT[ 24 ] <=0 ; LUT[ 25 ] <=2 ; LUT[ 26 ] <=10 ; LUT[ 27 ] <=22 ; LUT[ 28 ] <=37 ; LUT[ 29 ] <=57 ; LUT[ 30 ] <=79 ; LUT[ 31 ] <=103 ; end end assign dataout = LUT[ address ]; endmodule 3、 功能仿真和时序仿真结果的波形 功能仿真: 时序仿真: 实验二 MATLAB 实验 OFDM误码率仿真(AWGN) 一、实验目的: 1、 掌握OFDM 的基本原理。 2、 掌握用Matlab 搭建OFDM 系统的基本方法 3、 用MATLAB 进行OFDM 系统在AWGN 信道下误码率分析。 二、实验报告要求 1. 所有程序完整的源代码(.m 文件)以及注释。 2. 仿真结果。对于所有的图形结果(包括波形与仿真曲线等),将图形保存成.tif 或者.emf 的格式并插入word 文档。 三、实验结果 1、所有程序完整的源代码(.m 文件)以及注释: %16QAM的调制函数 function [complex_qam_data]=qam16(bitdata) %modulation of 16QAM,modulate bitdata to 16QAM complex signal X1=reshape(bitdata,4,length(bitdata)/4)'; d=1;%min distance of symble for i=1:length(bitdata)/4; for j=1:4 X1(i,j)=X1(i,j)*(2^(4-j)); end source(i,1)=1+sum(X1(i,:));%convert to the number 1 to 16 end mapping=[-3*d 3*d; -d 3*d; d 3*d; 3*d 3*d; -3*d d; -d d; d d; 3*d d; -3*d -d; -d -d; d -d; 3*d -d; -3*d -3*d; -d -3*d; d -3*d; 3*d -3*d]; for i=1:length(bitdata)/4 qam_data(i,:)=mapping(source(i),:);%data mapping end complex_qam_data=complex(qam_data(:,1),qam_data(:,2)); %16QAM的解调函数。 function [demodu_bit_symble]=demoduqam16(Rx_serial_complex_symbols) %将得到的串行16QAM数据解调成二进制比特流 complex_symbols=reshape(Rx_serial_complex_symbols,length(Rx_serial_complex_symb ols),1); d=1; mapping=[-3*d 3*d; -d 3*d; d 3*d; 3*d 3*d; -3*d d; -d d; d d; 3*d d; -3*d -d; -d -d; d -d; 3*d -d; -3*d -3*d; -d -3*d; d -3*d; 3*d -3*d]; complex_mapping=complex(mapping(:,1),mapping(:,2)); for i=1:length(Rx_serial_complex_symbols); for j=1:16; metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1)); end [min_metric decode_symble(i)]= min(metrics) ; %将离某星座点最近的值赋给 decode_symble(i) end decode_bit_symble=de2bi((decode_symble-1)','left-msb'); demodu_bit_symble=reshape(decode_bit_symble',1,length(Rx_serial_complex_symbols )*4); %加窗函数 function [rcosw]=rcoswindow(beta, Ts) %定义升余弦窗,其中beta为滚降系数,Ts为包含循环前缀的OFDM符号的长度,Ts为正偶 数 t=0:(1+beta)*Ts; rcosw=zeros(1,(1+beta)*Ts); for i=1:beta*Ts; rcosw(i)=0.5+0.5*cos(pi+ t(i)*pi/(beta*Ts)); end rcosw(beta*Ts+1:Ts)=1; for j=Ts+1:(1+beta)*Ts+1; rcosw(j-1)=0.5+0.5*cos((t(j)-Ts)*pi/(beta*Ts)); end rcosw=rcosw';%变换为列向量 %OFDM主程序 clear all; close all; carrier_count=200;%子载波数 symbols_per_carrier=12;%每子载波含符号数 bits_per_symbol=4;%每符号含比特数,16QAM调制 IFFT_bin_length=512;%FFT点数 PrefixRatio=1/4;%保护间隔与OFDM数据的比例 1/6~1/4 GI=PrefixRatio*IFFT_bin_length ;%每一个OFDM符号添加的循环前缀长度为 1/4*IFFT_bin_length 即保护间隔长度为128 beta=1/32;%窗函数滚降系数 GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度20 SNR=15; %信噪比dB %================================================== %================信号产生=================================== baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;%所 输入的比特数目 carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2));%共轭对称子载波映射 复数数据对应的IFFT点坐标 conjugate_carriers = IFFT_bin_length - carriers + 2;%共轭对称子载波映射 共轭复 数对应的IFFT点坐标 baseband_out=round(rand(1,baseband_out_length));%输出待调制的二进制比特流 %==============16QAM调制==================================== complex_carrier_matrix=qam16(baseband_out);%列向量 complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_pe r_carrier)';%symbols_per_carrier*carrier_count 矩阵 figure(1); plot(complex_carrier_matrix,'*r');%16QAM调制后星座图 title('16QAM调制后星座图') axis([-4, 4, -4, 4]); grid on %=================IFFT=========================== IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%添0组成 IFFT_bin_length IFFT 运算 IFFT_modulation(:,carriers ) = complex_carrier_matrix ;%未添加导频信号 ,子载波 映射在此处 IFFT_modulation(:,conjugate_carriers ) = conj(complex_carrier_matrix);%共轭复数 映射 %================================================================= signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM调制 即IFFT变换 time_wave_matrix =signal_after_IFFT;%时域波形矩阵,行为每载波所含符号数,列ITTF 点数,N个子载波映射在其内,每一行即为一个OFDM符号 %=====================添加循环前缀与后缀============ XX=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP); for k=1:symbols_per_carrier; for i=1:IFFT_bin_length; XX(k,i+GI)=signal_after_IFFT(k,i); end for i=1:GI; XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀 end for j=1:GIP; XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀 end end time_wave_matrix_cp=XX;%添加了循环前缀与后缀的时域信号矩阵,此时一个OFDM符号长 度为IFFT_bin_length+GI+GIP=660 %==============OFDM符号加窗================================ windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP); for i = 1:symbols_per_carrier windowed_time_wave_matrix_cp(i,:) = real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗 升 余弦窗 end %========================生成发送信号,并串变换===================== windowed_Tx_data=zeros(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP); windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:); for i = 1:symbols_per_carrier-1 ; windowed_Tx_data((IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windo wed_time_wave_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加 end %======================================================= Tx_data=reshape(windowed_time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_l ength+GI+GIP),1)';%加窗后 循环前缀与后缀不叠加 的串行信号 %================================================================= temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗后 循环前缀与后 缀不叠加 发送总位数 figure (2) subplot(2,1,1); plot(0:temp_time1-1,Tx_data );%循环前缀与后缀不叠加 发送的信号波形 grid on ylabel('Amplitude (volts)') xlabel('Time (samples)') title('循环前后缀不叠加的OFDM Time Signal') temp_time2 =symbols_per_carrier*(IFFT_bin_length+GI)+GIP; subplot(2,1,2); plot(0:temp_time2-1,windowed_Tx_data);%循环后缀与循环前缀相叠加 发送信号波形 grid on ylabel('Amplitude (volts)') xlabel('Time (samples)') title('循环前后缀叠加的OFDM Time Signal') %===============加窗的发送信号频谱================================= symbols_per_average = ceil(symbols_per_carrier/5);%符号数的1/5,10行 avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数,10行数据, 10个符号 averages = floor(temp_time1/avg_temp_time); average_fft(1:avg_temp_time) = 0;%分成5段 for a = 0:(averages-1) subset_ofdm = Tx_data(((a*avg_temp_time)+1):((a+1)*avg_temp_time));%利用循环前 缀后缀未叠加的串行加窗信号计算频谱 subset_ofdm_f = abs(fft(subset_ofdm));%分段求频谱 average_fft = average_fft + (subset_ofdm_f/averages);%总共的数据分为5段,分段 进行FFT,平均相加 end average_fft_log = 20*log10(average_fft); figure (3) subplot(2,1,2) plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)%归一化 0/avg_temp_time : (avg_temp_time-1)/avg_temp_time hold on plot(0:1/IFFT_bin_length:1, -35, 'rd') grid on axis([0 0.5 -40 max(average_fft_log)]) ylabel('Magnitude (dB)') xlabel('Normalized Frequency (0.5 = fs/2)') title('加窗的发送信号频谱') %====================添加噪声================================= Tx_signal_power = var(windowed_Tx_data);%发送信号功率 linear_SNR=10^(SNR/10);%线性信噪比 noise_sigma=Tx_signal_power/linear_SNR; noise_scale_factor = sqrt(noise_sigma);%标准差sigma noise=randn(1,((symbols_per_carrier)*(IFFT_bin_length+GI))+GIP)*noise_scale_fac tor;%产生正态分布噪声序列 Rx_data=windowed_Tx_data +noise;%接收到的信号加噪声 %=============接收信号 串/并变换 去除前缀与后缀================== Rx_data_matrix=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP); for i=1:symbols_per_carrier; Rx_data_matrix(i,:)=Rx_data(1,(i-1)*(IFFT_bin_length+GI)+1:i*(IFFT_bin_length+G I)+GIP);%串并变换 end Rx_data_complex_matrix=Rx_data_matrix(:,GI+1:IFFT_bin_length+GI);%去除循环前缀 与循环后缀,得到有用信号矩阵 %========================================================= % OFDM解码 16QAM解码 %=================FFT变换================================= Y1=fft(Rx_data_complex_matrix,IFFT_bin_length,2);%OFDM解码 即FFT变换 Rx_carriers=Y1(:,carriers);%除去IFFT/FFT变换添加的0,选出映射的子载波 Rx_phase =angle(Rx_carriers);%接收信号的相位 Rx_mag = abs(Rx_carriers);%接收信号的幅度 figure(4); polar(Rx_phase, Rx_mag,'bd');%极坐标坐标下画出接收信号的星座图 title('极坐标下的接收信号的星座图') %=========================================================== [M, N]=pol2cart(Rx_phase, Rx_mag); Rx_complex_carrier_matrix = complex(M, N); figure(5); plot(Rx_complex_carrier_matrix,'*r');%XY坐标接收信号的星座图 title('XY坐标接收信号的星座图') axis([-4, 4, -4, 4]); grid on %====================16qam解调================================= Rx_serial_complex_symbols=reshape(Rx_complex_carrier_matrix',size(Rx_complex_ca rrier_matrix, 1)*size(Rx_complex_carrier_matrix,2),1)' ; Rx_decoded_binary_symbols=demoduqam16(Rx_serial_complex_symbols); %============================================================ baseband_in = Rx_decoded_binary_symbols; figure(6); subplot(2,1,1); stem(baseband_out(1:100)); title('输出待调制的二进制比特流') subplot(2,1,2); stem(baseband_in(1:100)); title('接收解调后的二进制比特流') %================误码率计算=============================== bit_errors=find(baseband_in ~=baseband_out); bit_error_count = size(bit_errors, 2) ber=bit_error_count/baseband_out_length 4、 仿真结果 循环前后缀不叠加的OFDM Time Signal 0.5 A m p l i t u d e ( v o l t s ) 0 -0.5 0 Time (samples) 循环前后缀叠加的OFDM Time Signal 70008000 0.5 A m p l i t u d e ( v o l t s ) 0 -0.5 040005000 Time (samples) 6 加窗的发送信号频谱 20 10 0 M a g n i t u d e ( d B ) -10 -20 -30 -40 00.050.10.150.20.250.30.35 Normalized Frequency (0.5 = fs/2) 0.40.450.5 极坐标下的接收信号的星座图 90 120 4 150 2 30 6 60 180 0 210330 240 270 300 XY坐标接收信号的星座图 4 3 2 1 0 -1 -2 -3 -4 -4-3-2-101234 输出待调制的二进制比特流 1 0.8 0.6 0.4 0.2 0 接收解调后的二进制比特流 1 0.5 0 误 码 率 实验三 MATLAB 实验 OFDM 误码率仿真(衰落) 一、实验目的: 1、 了解瑞利信道产生的原因及其特征。 2、 用MATLAB 进行OFDM 系统在瑞利信道下误码率分析。 二、实验报告要求 1. 所有程序完整的源代码(.m 文件)以及注释。 2. 仿真结果。对于所有的图形结果(包括波形与仿真曲线等),将图形保存成.tif 或者.emf 的格式并插入word 文档。 三、实验结果 1. %16QAM的调制函数 function [complex_qam_data]=qam16(bitdata) %modulation of 16QAM,modulate bitdata to 16QAM complex signal X1=reshape(bitdata,4,length(bitdata)/4)'; d=1;%min distance of symble for i=1:length(bitdata)/4; for j=1:4 X1(i,j)=X1(i,j)*(2^(4-j)); end source(i,1)=1+sum(X1(i,:));%convert to the number 1 to 16 end mapping=[-3*d 3*d; -d 3*d; d 3*d; 3*d 3*d; -3*d d; -d d; d d; 3*d d; -3*d -d; -d -d; d -d; 3*d -d; -3*d -3*d; -d -3*d; d -3*d; 3*d -3*d]; for i=1:length(bitdata)/4 qam_data(i,:)=mapping(source(i),:);%data mapping end complex_qam_data=complex(qam_data(:,1),qam_data(:,2)); %16QAM的解调函数。 function [demodu_bit_symble]=demoduqam16(Rx_serial_complex_symbols) %将得到的串行16QAM数据解调成二进制比特流 complex_symbols=reshape(Rx_serial_complex_symbols,length(Rx_serial_complex_symb ols),1); d=1; mapping=[-3*d 3*d; -d 3*d; d 3*d; 3*d 3*d; -3*d d; -d d; d d; 3*d d; -3*d -d; -d -d; d -d; 3*d -d; -3*d -3*d; -d -3*d; d -3*d; 3*d -3*d]; complex_mapping=complex(mapping(:,1),mapping(:,2)); for i=1:length(Rx_serial_complex_symbols); for j=1:16; metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1)); end [min_metric decode_symble(i)]= min(metrics) ; %将离某星座点最近的值赋给 decode_symble(i) end decode_bit_symble=de2bi((decode_symble-1)','left-msb'); demodu_bit_symble=reshape(decode_bit_symble',1,length(Rx_serial_complex_symbols )*4); %加窗函数 function [rcosw]=rcoswindow(beta, Ts) %定义升余弦窗,其中beta为滚降系数,Ts为包含循环前缀的OFDM符号的长度,Ts为正偶 数 t=0:(1+beta)*Ts; rcosw=zeros(1,(1+beta)*Ts); for i=1:beta*Ts; rcosw(i)=0.5+0.5*cos(pi+ t(i)*pi/(beta*Ts)); end rcosw(beta*Ts+1:Ts)=1; for j=Ts+1:(1+beta)*Ts+1; rcosw(j-1)=0.5+0.5*cos((t(j)-Ts)*pi/(beta*Ts)); end rcosw=rcosw';%变换为列向量 %瑞利信道模拟 function r=Ray1(fm,fc,baseband_out_length) f=1:2*fm-1; %通频带长度 y=0.5./((1-((f-fm)/fm).^2).^(1/2))/pi; %多普勒功率谱(基带) Sf=zeros(1, baseband_out_length); Sf1=y;%多普勒滤波器的频响 Sf(fc-fm+1:fc+fm-1)=y; %(把基带映射到载波频率) x1=randn(1, baseband_out_length); x2=randn(1, baseband_out_length); nc=ifft(fft(x1+i*x2).*sqrt(Sf)); %同相分量 x3=randn(1,baseband_out_length); x4=randn(1,baseband_out_length); ns=ifft(fft(x3+i*x4).*sqrt(Sf)); %正交分量 r0=(real(nc)+j*real(ns)); %瑞利信号 r=abs(r0); %瑞利信号幅值 %OFDM主程序 clear all; close all; fm=450; fc=4500; carrier_count=200;%子载波数 symbols_per_carrier=12;%每子载波含符号数 bits_per_symbol=4;%每符号含比特数,16QAM调制 IFFT_bin_length=512;%FFT点数 PrefixRatio=1/4;%保护间隔与OFDM数据的比例 1/6~1/4 GI=PrefixRatio*IFFT_bin_length ;%每一个OFDM符号添加的循环前缀长度为 1/4*IFFT_bin_length 即保护间隔长度为128 beta=1/32;%窗函数滚降系数 GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度20 SNR=15; %信噪比dB %================================================== %================信号产生=================================== baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;%所 输入的比特数目 carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2));%共轭对称子载波映射 复数数据对应的IFFT点坐标 conjugate_carriers = IFFT_bin_length - carriers + 2;%共轭对称子载波映射 共轭复 数对应的IFFT点坐标 baseband_out=round(rand(1,baseband_out_length));%输出待调制的二进制比特流 %==============16QAM调制==================================== complex_carrier_matrix=qam16(baseband_out);%列向量 complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_pe r_carrier)';%symbols_per_carrier*carrier_count 矩阵 figure(1); plot(complex_carrier_matrix,'*r');%16QAM调制后星座图 title('16QAM调制后星座图') axis([-4, 4, -4, 4]); grid on %=================IFFT=========================== IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%添0组成 IFFT_bin_length IFFT 运算 IFFT_modulation(:,carriers ) = complex_carrier_matrix ;%未添加导频信号 ,子载波 映射在此处 IFFT_modulation(:,conjugate_carriers ) = conj(complex_carrier_matrix);%共轭复数 映射 %================================================================= signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM调制 即IFFT变换 time_wave_matrix =signal_after_IFFT;%时域波形矩阵,行为每载波所含符号数,列ITTF 点数,N个子载波映射在其内,每一行即为一个OFDM符号 %=====================添加循环前缀与后缀============ XX=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP); for k=1:symbols_per_carrier; for i=1:IFFT_bin_length; XX(k,i+GI)=signal_after_IFFT(k,i); end for i=1:GI; XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀 end for j=1:GIP; XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀 end end time_wave_matrix_cp=XX;%添加了循环前缀与后缀的时域信号矩阵,此时一个OFDM符号长 度为IFFT_bin_length+GI+GIP=660 %==============OFDM符号加窗================================ windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP); for i = 1:symbols_per_carrier windowed_time_wave_matrix_cp(i,:) = real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗 升 余弦窗 end %========================生成发送信号,并串变换===================== windowed_Tx_data=zeros(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP); windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:); for i = 1:symbols_per_carrier-1 ; windowed_Tx_data((IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windo wed_time_wave_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加 end %======================================================= Tx_data=reshape(windowed_time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_l ength+GI+GIP),1)';%加窗后 循环前缀与后缀不叠加 的串行信号 %================================================================= temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗后 循环前缀与后 缀不叠加 发送总位数 figure (2) subplot(2,1,1); plot(0:temp_time1-1,Tx_data );%循环前缀与后缀不叠加 发送的信号波形 grid on ylabel('Amplitude (volts)') xlabel('Time (samples)') title('循环前后缀不叠加的OFDM Time Signal') temp_time2 =symbols_per_carrier*(IFFT_bin_length+GI)+GIP; subplot(2,1,2); plot(0:temp_time2-1,windowed_Tx_data);%循环后缀与循环前缀相叠加 发送信号波形 grid on ylabel('Amplitude (volts)') xlabel('Time (samples)') title('循环前后缀叠加的OFDM Time Signal') %===============加窗的发送信号频谱================================= symbols_per_average = ceil(symbols_per_carrier/5);%符号数的1/5,10行 avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数,10行数据, 10个符号 averages = floor(temp_time1/avg_temp_time); average_fft(1:avg_temp_time) = 0;%分成5段 for a = 0:(averages-1) subset_ofdm = Tx_data(((a*avg_temp_time)+1):((a+1)*avg_temp_time));%利用循环前 缀后缀未叠加的串行加窗信号计算频谱 subset_ofdm_f = abs(fft(subset_ofdm));%分段求频谱 average_fft = average_fft + (subset_ofdm_f/averages);%总共的数据分为5段,分段 进行FFT,平均相加 end average_fft_log = 20*log10(average_fft); figure (3) subplot(2,1,2) plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)%归一化 0/avg_temp_time : (avg_temp_time-1)/avg_temp_time hold on plot(0:1/IFFT_bin_length:1, -35, 'rd') grid on axis([0 0.5 -40 max(average_fft_log)]) ylabel('Magnitude (dB)') xlabel('Normalized Frequency (0.5 = fs/2)') title('加窗的发送信号频谱') %====================瑞利信道================================= cd=length(windowed_Tx_data); t=1:cd; delay=[0 31 71 109 173 251]; power=[0 -1 -9 -10 -15 -20]; y_in=[zeros(1,delay(6)) windowed_Tx_data]; Rx_data=zeros(1,cd); for i=1:6 Rx_data+Ray1(fm,fc,cd); Rx_data=Rx_data+Ray1(fm,fc,cd).*y_in(delay(6)+1-delay(i):delay(6)+cd-delay(i))* 10^(power(i)/20); end%=============接收信号 串/并变换 去除前缀与后缀================== Rx_data_matrix=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP); for i=1:symbols_per_carrier; Rx_data_matrix(i,:)=Rx_data(1,(i-1)*(IFFT_bin_length+GI)+1:i*(IFFT_bin_length+G I)+GIP);%串并变换 end Rx_data_complex_matrix=Rx_data_matrix(:,GI+1:IFFT_bin_length+GI);%去除循环前缀 与循环后缀,得到有用信号矩阵 %========================================================= % OFDM解码 16QAM解码 %=================FFT变换================================= Y1=fft(Rx_data_complex_matrix,IFFT_bin_length,2);%OFDM解码 即FFT变换 Rx_carriers=Y1(:,carriers);%除去IFFT/FFT变换添加的0,选出映射的子载波 Rx_phase =angle(Rx_carriers);%接收信号的相位 Rx_mag = abs(Rx_carriers);%接收信号的幅度 figure(4); polar(Rx_phase, Rx_mag,'bd');%极坐标坐标下画出接收信号的星座图 title('极坐标下的接收信号的星座图') %=========================================================== [M, N]=pol2cart(Rx_phase, Rx_mag); Rx_complex_carrier_matrix = complex(M, N); figure(5); plot(Rx_complex_carrier_matrix,'*r');%XY坐标接收信号的星座图 title('XY坐标接收信号的星座图') axis([-4, 4, -4, 4]); grid on %====================16qam解调================================= Rx_serial_complex_symbols=reshape(Rx_complex_carrier_matrix',size(Rx_complex_ca rrier_matrix, 1)*size(Rx_complex_carrier_matrix,2),1)' ; Rx_decoded_binary_symbols=demoduqam16(Rx_serial_complex_symbols); %============================================================ baseband_in = Rx_decoded_binary_symbols; figure(6); subplot(2,1,1); stem(baseband_out(1:100)); title('输出待调制的二进制比特流') subplot(2,1,2); stem(baseband_in(1:100)); title('接收解调后的二进制比特流') %================误码率计算=============================== bit_errors=find(baseband_in ~=baseband_out); bit_error_count = size(bit_errors, 2) ber=bit_error_count/baseband_out_length 4、仿真结果 实验四 MATLAB 实验 多入多出(MIMO)系统接收端检测 一、实验目的 1.掌握MIMO 系统信道模型 2.掌握MIMO 接收端检测的算法原理 3.掌握MIMO 系统误码率仿真的过程与分析方法 二、实验要求 1. 所有程序完整的源代码(.m 文件)以及注释。 2. 仿真结果。对于所有的图形结果(包括波形与仿真曲线等),将图形保存成.tif 或者.emf 的格式并插入word 文档。 三、实验结果 1. 所有程序完整的源代码(.m 文件)以及注释。 % ML-ZF-MMSE 检测算法比较 % bpsk调制-瑞利衰落信道-2个发送端,2个接收端 %% clc clear N = 10^4; % 发送的符号数目 Eb_N0_dB = 0:20; % 信噪比范围 nTx = 2; nRx = 2; %% %ML for ii = 1:length(Eb_N0_dB) % 发送端 ip = rand(1,N)>0.5; % 等概率产生0和1 s = 2*ip-1; % BPSK 调制 0 -> -1; 1 -> 0 sMod = kron(s,ones(nRx,1)); % sMod = reshape(sMod,[nRx,nTx,N/nTx]); % 将矩阵转换为 [nRx,nTx,N/nTx ]形式 h = 1/sqrt(2)*[randn(nRx,nTx,N/nTx) + j*randn(nRx,nTx,N/nTx)]; % 瑞利衰落信道 n = 1/sqrt(2)*[randn(nRx,N/nTx) + j*randn(nRx,N/nTx)]; % 0均值高 斯白噪声 % 加入噪声后在信道中传输 a = h.*sMod; %将两个矩阵的第三维分别相乘 b = sum(h.*sMod,2);%将第三维加为一列 c = squeeze(sum(h.*sMod,2));%变换为2x10矩阵 d = 10^(-Eb_N0_dB(ii)/20)*n;%噪声为2x10矩阵 y = squeeze(sum(h.*sMod,2)) + 10^(-Eb_N0_dB(ii)/20)*n; % 最大似然接收 % ---------------------------- % 当 [s1 s2 ] = [+1,+1 ] sHat1 = [1 1]; sHat1 = repmat(sHat1,[1 ,N/2]); sHat1Mod = kron(sHat1,ones(nRx,1)); sHat1Mod = reshape(sHat1Mod,[nRx,nTx,N/nTx]); %发送矩阵 zHat1 = squeeze(sum(h.*sHat1Mod,2)) ; %接收矩阵 %e = abs(y - zHat1); %取理论接收与实际接收的绝对值 J11 = sum(abs(y - zHat1),1);%将两行加为一行 % % % 当 [s1 s2 ] = [+1,-1 ] sHat2 = [1 -1]; sHat2 = repmat(sHat2,[1 ,N/2]); sHat2Mod = kron(sHat2,ones(nRx,1)); sHat2Mod = reshape(sHat2Mod,[nRx,nTx,N/nTx]); zHat2 = squeeze(sum(h.*sHat2Mod,2)) ; J10 = sum(abs(y - zHat2),1); % % % 当 [s1 s2 ] = [-1,+1 ] sHat3 = [-1 1]; sHat3 = repmat(sHat3,[1 ,N/2]); sHat3Mod = kron(sHat3,ones(nRx,1)); sHat3Mod = reshape(sHat3Mod,[nRx,nTx,N/nTx]); zHat3 = squeeze(sum(h.*sHat3Mod,2)) ; J01 = sum(abs(y - zHat3),1); % % 当 [s1 s2 ] = [-1,-1 ] sHat4 = [-1 -1]; sHat4 = repmat(sHat4,[1 ,N/2]); sHat4Mod = kron(sHat4,ones(nRx,1)); sHat4Mod = reshape(sHat4Mod,[nRx,nTx,N/nTx]); zHat4 = squeeze(sum(h.*sHat4Mod,2)) ; J00 = sum(abs(y - zHat4),1); % % % 从四组数值中找出最小值jj,所在位置dd rVec = [J11;J10;J01;J00]; [jj dd] = min(rVec,[],1); % % % mapping the minima to bits ref = [1 1; 1 0; 0 1; 0 0 ]; ipHat = zeros(1,N); ipHat(1:2:end) = ref(dd,1); ipHat(2:2:end) = ref(dd,2); % % % 统计错误 f = find([ip - ipHat]);%发生错误所在位置 nErrML(ii) = size(find([ip - ipHat]),2);%错误个数 end %% %ZF for ii = 1:length(Eb_N0_dB) % 发送端 ip = rand(1,N)>0.5; % 等概率生成 0,1 s = 2*ip-1; % BPSK 调制 0 -> -1; 1 -> 0 %a = ones(nRx,1) sMod = kron(s,ones(nRx,1)); % sMod = reshape(sMod,[nRx,nTx,N/nTx]); % 变换矩阵形式为 [nRx,nTx,N/NTx ] h = 1/sqrt(2)*[randn(nRx,nTx,N/nTx) + j*randn(nRx,nTx,N/nTx)]; % 瑞 利信道 n = 1/sqrt(2)*[randn(nRx,N/nTx) + j*randn(nRx,N/nTx)]; % 0均值高 斯白噪声 % 加入白噪声后在信道中传输 y = squeeze(sum(h.*sMod,2)) + 10^(-Eb_N0_dB(ii)/20)*n; % 接收端 % 求伪逆矩阵 G = inv(H^H*H)*H^H % H^H*H 的矩阵维数为 [nTx x nTx]. 即 [2 x 2] % [2x2]矩阵的转置为 [a b; c d] = 1/(ad-bc)[d -b;-c a] hCof = zeros(2,2,N/nTx); hCof(1,1,:) = sum(h(:,2,:).*conj(h(:,2,:)),1); % d hCof(2,2,:) = sum(h(:,1,:).*conj(h(:,1,:)),1); % a hCof(2,1,:) = -sum(h(:,2,:).*conj(h(:,1,:)),1); % c hCof(1,2,:) = -sum(h(:,1,:).*conj(h(:,2,:)),1); % b hDen = ((hCof(1,1,:).*hCof(2,2,:)) - (hCof(1,2,:).*hCof(2,1,:))); % ad-bc hDen = reshape(kron(reshape(hDen,1,N/nTx),ones(2,2)),2,2,N/nTx); % hInv = hCof./hDen; % inv(H^H*H) hMod = reshape(conj(h),nRx,N); % H^H yMod = kron(y,ones(1,2)); % 接收信号矩阵化 yMod = sum(hMod.*yMod,1); % H^H * y yMod = kron(reshape(yMod,2,N/nTx),ones(1,2)); % yHat = sum(reshape(hInv,2,N).*yMod,1); % inv(H^H*H)*H^H*y % 接收端 硬判决解码 ipHat = real(yHat)>0; % 统计错误 nErrZF(ii) = size(find([ip- ipHat]),2); end %% %MMSE for ii = 1:length(Eb_N0_dB) % 发送端 ip = rand(1,N)>0.5; s = 2*ip-1; % BPSK 调制 0 -> -1; 1 -> 0 sMod = kron(s,ones(nRx,1)); % sMod = reshape(sMod,[nRx,nTx,N/nTx]); % [nRx,nTx,N/NTx ] h = 1/sqrt(2)*[randn(nRx,nTx,N/nTx) + j*randn(nRx,nTx,N/nTx)]; n = 1/sqrt(2)*[randn(nRx,N/nTx) + j*randn(nRx,N/nTx)]; % 加入高斯白噪声后在信道中传输 y = squeeze(sum(h.*sMod,2)) + 10^(-Eb_N0_dB(ii)/20)*n; % 接收端 % MMSE W = inv(H^H*H+sigma^2*I)*H^H % H^H*H i的维数为[nTx x nTx]. 即[2 x 2] % [2x2]矩阵的逆 [a b; c d] = 1/(ad-bc)[d -b;-c a] hCof = zeros(2,2,N/nTx) ; hCof(1,1,:) = sum(h(:,2,:).*conj(h(:,2,:)),1) + 10^(-Eb_N0_dB(ii)/10); % d hCof(2,2,:) = sum(h(:,1,:).*conj(h(:,1,:)),1) + 10^(-Eb_N0_dB(ii)/10); % a hCof(2,1,:) = -sum(h(:,2,:).*conj(h(:,1,:)),1); % c hCof(1,2,:) = -sum(h(:,1,:).*conj(h(:,2,:)),1); % b hDen = ((hCof(1,1,:).*hCof(2,2,:)) - (hCof(1,2,:).*hCof(2,1,:))); % ad-bc hDen = reshape(kron(reshape(hDen,1,N/nTx),ones(2,2)),2,2,N/nTx); hInv = hCof./hDen; % inv(H^H*H) hMod = reshape(conj(h),nRx,N); % H^H yMod = kron(y,ones(1,2)); yMod = sum(hMod.*yMod,1); % H^H * y yMod = kron(reshape(yMod,2,N/nTx),ones(1,2)); yHat = sum(reshape(hInv,2,N).*yMod,1); % inv(H^H*H)*H^H*y %接收端 ipHat = real(yHat)>0; % 统计错误 nErrMMSE(ii) = size(find([ip- ipHat]),2); end %% %无衰落bpsk调制 for ii = 1:length(Eb_N0_dB) % Transmitter ip = rand(1,N)>0.5; s = 2*ip-1; n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)]; % Noise addition y = s + 10^(-Eb_N0_dB(ii)/20)*n; % additive white gaussian noise % receiver - hard decision decoding ipHat = real(y)>0; % counting the errors nErrBPSK(ii) = size(find([ip- ipHat]),2); end %% %比特错误率 simBer1 = nErrML/N; % 仿真比特错误率 simBer2 = nErrZF/N; simBer3 = nErrMMSE/N; % simBer4 = nErrBPSK/N; EbN0Lin = 10.^(Eb_N0_dB/10); % theoryBer_nRx1 = 0.5.*(1-1*(1+1./EbN0Lin).^(-0.5)); % p = 1/2 - 1/2*(1+1./EbN0Lin).^(-1/2); % theoryBerMRC_nRx2 = p.^2.*(1+2*(1-p)); theoryBerBPSK = 0.5*erfc(sqrt(EbN0Lin)); % bpsk theoretical ber 0.5erfc (sqrt(r)) %% %作图 close all figure % semilogy(Eb_N0_dB,theoryBer_nRx1,'bp-','LineWidth',2); % semilogy(Eb_N0_dB,theoryBerMRC_nRx2,'kd-','LineWidth',2); semilogy(Eb_N0_dB,simBer1,'*g-','LineWidth',2); %ML hold on semilogy(Eb_N0_dB,simBer2,'oy-','LineWidth',2); %ZF semilogy(Eb_N0_dB,simBer3,'+r-','LineWidth',2); %MMSE % semilogy(Eb_N0_dB,simBer4,'mx-','LineWidth',2); semilogy(Eb_N0_dB,theoryBerBPSK,'b.-','LineWidth',2); %BPSK axis([0 20 10^-5 0.5]) grid on legend('sim (nTx=2, nRx=2, ML)','sim (nTx=2, nRx=2, ZF)','sim (nTx=2, nRx=2, MMSE)', 'theory BPSK'); % legend('theory (nTx=1,nRx=1)', 'theory (nTx=1,nRx=2, MRC)', 'sim (nTx=2, nRx=2, ML)','sim (nTx=2, nRx=2, ZF)','sim (nTx=2, nRx=2, MMSE)', 'theory BPSK'); xlabel('Average Eb/No,dB'); ylabel('Bit Error Rate'); title('BER for BPSK modulation with 2x2 MIMO and three kinds of equalizer (Rayleigh channel)'); 2.图形结果 实验五 FPGA 实验 HDB3 编码器设计 一、实验目的 ⒈ 深入理解HDB3 编码原理。 ⒉ 学习用VerilogHDL 硬件描述语言建模较复杂时序逻辑电路。 ⒊ 学习FPGA 设计中的Testbench(测试平台)技术。 ⒋ 学习FPGA 设计中仿真与综合的概念。 ⒌ 学习编写仿真测试代码与可综合代码。 二、实验报告要求 ⒈ 以下各时序仿真结果:(ModelSim 中截图) ⑴ 加V 后; ⑵ 补B 后; ⑶ 最终得到的HDB3 码。 ⒉ 开发板调试产生的波形。(SignalTapⅡ中截图) ⒊ 改写HDB3 编码器的测试文件代码,使测试文件能连续产生伪随机序列,将改写后的 测试文件代码写在实验报告中。(可以参考教师提供的VerilogHDL 教程中的第10 章 10.3.8 部分的内容) ⒋ 思考:测试文件代码和编码器模块代码都是用VerilogHDL 语言编写的,这两种代码在 语法上有什么区别?分别举一个例子进行比较。 三、实验结果 1.仿真结果: 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 always begin #5 clk=~clk; end initial begin #0 reset_n=1'b0; #20 reset_n=1'b1; end datain=$dist_uniform(12,start,end); 思考题: 答:不允许在可综合的设计代码中使用`Define来定义参数,应该使用参数Parameter来定义。 例如`Define只用于编写不可综合的仿真测试模块。 实验六 宽带接入实验 非拨号方式上网 一、实验目的 ⒈ 了解非拨号方式上网的基本原理和组网结构。 ⒉ 学习在MA5300 上配置非拨号方式上网的方法。 ⒊ 在终端计算机上以非拨号方式连通外网。 二、实验报告要求 1. 参考图1,简述非拨号方式上网的原理。 ⒉ 简述实验成功后观测到的现象,并拍照粘贴到实验报告中。 三、实验结果: 1. 配置路由器数据->在MA5300上建立业务VLAN->把ADSL端口划入业务VLAN ->配置以太网端口参数->配置ADSL端口参数->把两台PC设在同一个IP网段 里 ->把PC接在ADS端口上->PC自动获取IP。 2.观测到的现象: 实验七 光传输实验 链形传输组网 一、实验目的 ⒈ 学习链形组网的交换机连接方式。 ⒉ 学习链形组网的电话业务和数据业务的配置方法。 二、实验报告要求 ⒈ 参考图2,画出3 台交换机业务连接图,并标注你所选用的时隙。 ⒉ 简要描述最后的验证方法,以及误码仪上的现象。 三、实验结果 1.业务连接图 1 11 12 1 11 12 1 11 12 1 1 3 3 5 5 5 1 2:1 2 3:3 1 5:3 2.用误码仪分别测交换机1与交换机2,交换机2与交换机3,测出来的结果都 是0,无误码秒都在增加,说明三台交换机之间可以互相通信。 实验八 光传输实验 环形传输组网 一、实验目的 ⒈ 学习环形组网的交换机连接方式。 ⒉ 学习环形组网的电话业务和数据业务的配置方法。 二、实验报告要求 1. 参考图2,画出3 台交换机的业务连接图,并标注所选用的时隙。 ⒉ 简要描述最后的验证方法,以及误码仪上的现象。 三、实验结果 1.业务连接图 1 11 12 1 11 12 1 11 12 3 3 5 4 4 6 7 5 7 8 6 8 6 7 4 1 2:3 2 3:5 1 3:7 2 1:4 3 2: 6 3 1:8 2.用误码仪测分别测交换机1与交换机2,交换机2与交换机3,交换机1与交 换机3之间的误码率,测出来的结果都是0,说明三台交换机之间可以互相通信。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1712190051a2020163.html
评论列表(0条)