clc; clear; close all; tic; N=128; M=[4 16 32 64]; D=5; c=0.15; nt=0.1289; nr=0.9500; N_ofdm=1000; snr_dB=1:18; SNR=10.^(snr_dB./10); for kk=1:length(snr_dB) N_fft=N*2+2; for jj=1:length(M) base_data=randi([0 1],1,N*N_ofdm*log2(M(jj))); data_temp1= reshape(base_data,log2(M(jj)),[])'; data_temp2= bi2de(data_temp1); mod_data = qammod(data_temp2,M(jj)); data=reshape(mod_data,N,[])'; H_data=zeros(N_ofdm,N_fft); H_data(:,2:N_fft/2)= data; H_data(:,N_fft/2+2:N_fft)= conj(fliplr(data)); ifft_data=ifft(H_data,[],2); ifft_data=ifft_data+0.02*ones(size(ifft_data)); Noise=awgn(ifft_data,SNR(kk),'measured')-ifft_data; Rx_data=ifft_data*nt*nr*exp(-c*D)+Noise; Rx_data=Rx_data/(nt*nr*exp(-c*D)) fft_data=fft(Rx_data,[],2); Rx_psk_data=fft_data(:,2:N_fft/2); demodulation_data = qamdemod(Rx_psk_data',M(jj)); demodulation_data= reshape(demodulation_data,[],1); temp1=de2bi(demodulation_data); err(kk,jj)=sum(sum((temp1~=data_temp1))); end BER(kk,:)=err(kk,:)./(N*N_ofdm*log2(M(jj))); end figure(); for a=1:length(M) semilogy(snr_dB,BER(:,a),'*-','LineWidth',1.5);hold on; end
时间: 2023-06-16 09:07:35 浏览: 96
这段代码是用来模拟无线通信系统中的 BER(误比特率)与 SNR(信噪比)之间的关系。其中,N是子载波数目,M是调制方式,D是传输距离,c是衰减系数,nt和nr是发射和接收天线的增益,N_ofdm是OFDM符号数目。
代码中先生成随机的二进制数据,然后将其进行 M-QAM 调制,生成调制后的数据。接着,对调制后的数据进行 OFDM 变换,加上高斯白噪声,进行逆变换,并加上信道衰减。最后,对接收到的数据进行 FFT 变换,并将其还原为二进制数据,计算误码率。
代码最后使用 semilogy 函数将误码率与信噪比之间的关系画出来,以便对无线通信系统的性能进行分析。
相关问题
clc clear all close all path=dir('*000'); t0=1; name_train={}; name_test={}; class_train={}; class_test={};
这段代码的作用是读取当前文件夹中以“000”结尾的文件夹中的数据,并将数据分为训练集和测试集,同时记录训练集和测试集的名称和类别。具体实现方式如下:
- `clc`、`clear all` 和 `close all` 是 Matlab 中常用的清除命令,用于清除命令行窗口、工作空间和图形窗口中的内容。
- `path=dir('*000')` 用于获取当前文件夹中以“000”结尾的文件夹的信息,并将这些信息存储在 path 变量中。dir 函数返回一个结构体数组,每个元素表示当前文件夹中的一个文件或子文件夹,包含文件或文件夹的名称、日期、大小等信息。
- `t0=1` 定义一个变量 t0,用于记录已经读取的数据数量。
- `name_train={}` 和 `name_test={}` 定义两个空的单元格数组,用于存储训练集和测试集的名称。
- `class_train={}` 和 `class_test={}` 定义两个空的单元格数组,用于存储训练集和测试集的类别。
接下来的代码是对每个以“000”结尾的文件夹进行遍历,并将其中的数据分为训练集和测试集。具体实现方式如下:
```
for i=1:length(path)
name=path(i).name;
fprintf('Processing %s\n',name);
file=dir(sprintf('./%s/*.mat',name));
for j=1:length(file)
fprintf('Processing file %d/%d\n',j,length(file));
load(sprintf('./%s/%s',name,file(j).name));
if mod(j,5)==0
name_test{end+1}=file(j).name;
class_test{end+1}=name;
else
name_train{end+1}=file(j).name;
class_train{end+1}=name;
end
t0=t0+1;
end
end
```
其中:
- `for i=1:length(path)` 对当前文件夹中以“000”结尾的文件夹进行遍历。
- `name=path(i).name` 获取当前遍历到的文件夹的名称。
- `file=dir(sprintf('./%s/*.mat',name))` 获取当前文件夹中所有以“.mat”为扩展名的文件,并将这些文件的信息存储在 file 变量中。
- `for j=1:length(file)` 对当前文件夹中的所有文件进行遍历。
- `load(sprintf('./%s/%s',name,file(j).name))` 加载当前文件的数据。
- `if mod(j,5)==0` 判断当前文件是训练集还是测试集。每隔 5 个文件取一个作为测试集,其余作为训练集。
- `name_test{end+1}=file(j).name` 将当前文件的名称添加到测试集名称列表中。
- `class_test{end+1}=name` 将当前文件夹的名称添加到测试集类别列表中。
- `name_train{end+1}=file(j).name` 将当前文件的名称添加到训练集名称列表中。
- `class_train{end+1}=name` 将当前文件夹的名称添加到训练集类别列表中。
- `t0=t0+1` 更新已读取的数据数量。
最终,该段代码将得到四个单元格数组:name_train、name_test、class_train 和 class_test,分别存储训练集和测试集的名称和类别。
clear all; clc; close all; N=256; figure(3); plot(hanning(N)); hold on; plot(boxcar(N)); plot(hamming(N)); legend('hanning','boxcar','hamming'); title('三种窗函数的时域波形图');如何在这段代码中加上三角窗和高斯窗
可以参考以下修改后的代码来添加三角窗和高斯窗:
```
clear all; clc; close all; N=256;
figure(3);
plot(hanning(N));
hold on;
plot(boxcar(N));
plot(hamming(N));
plot(Gaussian(N));
plot(Triangular(N));
legend('hanning','boxcar','hamming','Gaussian','Triangular');
title('五种窗函数的时域波形图');
```
在原有代码的基础上,添加了两行代码:plot(Gaussian(N)) 和 plot(Triangular(N)),用于绘制高斯窗和三角窗的波形图。同时在 legend 函数中也添加了这两个窗函数的名称,使得图例中也包含了这两个窗函数的标识。
阅读全文