西南交通大学_通信工程实验报告

西南交通大学_通信工程实验报告


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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信