• qujike
    了解作者
  • matlab
    开发工具
  • 1KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 9
    下载次数
  • 2020-06-25 12:28
    上传日期
可见光通信经典的dco ofdm 和aco ofdm,加高斯白噪声信道,可以使用的。
ofdm vlc.zip
  • ofdm vlc.m
    3.6KB
内容介绍
% dco和aco的对比 clc; clear all ; close all; global N_IFFT; global N_sc; N_IFFT=128;%IFFT点数 N_sc=256;%有效数据的子载波数 BitperSymbol=4;%每符号的比特数 DataSymlength=512;%传输的符号数 Data_Bitlength=DataSymlength*N_sc*BitperSymbol; N_cp=32;%循环前缀的个数 %% 产生数据信号 ------------(X_Data) X_BitSource=round(rand(1,DataSymlength*BitperSymbol*N_sc)); %524288 Y_BitSource=round(rand(1,DataSymlength*BitperSymbol*N_sc)); xsym=bi2de(reshape(X_BitSource',BitperSymbol,length(X_BitSource)/BitperSymbol).','left-msb'); %二进制转为十进制,最左边为最高有效位 ysym=bi2de(reshape(Y_BitSource',BitperSymbol,length(Y_BitSource)/BitperSymbol).','left-msb'); %% 串并变换 X_input=reshape(xsym,N_sc/4,[]); Y_input=reshape(ysym,N_sc/4,[]); %% MQMAM调制 hI = modem.qammod(2^BitperSymbol); %生成16QAM调制器 hII = modem.qamdemod(2^BitperSymbol); %生成16QAM的解调器 X_Data = modulate(hI,X_input); Y_Data = modulate(hI,Y_input); %% 自共轭 %% Hermitian对称 %% ACO信号调整 NumLoop=2048; N=128; SymIFFT = zeros(128*2,NumLoop);%? SymIFFTtmp = reshape(X_Data,64,NumLoop); SymIFFTtmptmp = zeros(128*2,NumLoop);%? for i=1:64 SymIFFTtmptmp(2*i,:)=SymIFFTtmp(i,:); end SymIFFTtmptmp(N+1,:) = SymIFFT(N+1,:); SymIFFTtmptmp(N+2:N*2,:) = flipdim(conj(SymIFFTtmptmp(2:N,:)),1); %% DCO信号调整 NumLoop=2048; SymIFFT_Y = zeros(130,NumLoop);%? SymIFFTtmptmp_Y = zeros(130,NumLoop);%? SymIFFTtmp_Y = reshape(Y_Data,64,NumLoop); SymIFFTtmptmp_Y(1,:) = SymIFFT_Y(1,:); % 实数 SymIFFTtmptmp_Y(2:65,:) = SymIFFTtmp_Y; % 实数 SymIFFTtmptmp_Y(66,:)=SymIFFT_Y(66,:); SymIFFTtmptmp_Y(65+1,:) = SymIFFT_Y(65+1,:); SymIFFTtmptmp_Y(65+2:65*2,:) = flipdim(conj(SymIFFTtmptmp_Y(2:65,:)),1); %% ifft变换 X1_ifft_output=ifft(SymIFFTtmptmp); Y1_ifft_output=ifft(SymIFFTtmptmp_Y); %% ACO切割 X1_ifft_output_x=X1_ifft_output; X1_ifft_output_x(find(X1_ifft_output<0))=0; %% DCO偏置 Y1_ifft_output_D=std2(Y1_ifft_output); U=2.05;%偏置系数 Din_y=U*sqrt(Y1_ifft_output_D); Din=Din_y*ones(130,NumLoop); Y1_ifft_output_y=Y1_ifft_output+Din; Y1_ifft_output_y(find(Y1_ifft_output_y<0))=0; si=1; s1=zeros(1,16); s2=zeros(1,16); %% 信道 for snr=0:1:30; % ofdm_sig_x=X1_ifft_output_x; % ofdm_sig_y=Y1_ifft_output_y; ofdm_sig_x=awgn(X1_ifft_output_x,2*snr,'measured'); %添加加性高斯白噪声,并测量能量 ofdm_sig_y=awgn(Y1_ifft_output_y,2*snr,'measured'); %% DCO去偏置 ofdm_sig_y=ofdm_sig_y-Din; %% FFT运算 RX1_QAMSymbol=fft(ofdm_sig_x); RY1_QAMSymbol=fft(ofdm_sig_y); %% 反Hermitian对称 %% ACO for i=1:64 SymEqtmp1_x(i,:)=2*RX1_QAMSymbol(2*i,:); end %% DCO SymEqtmp1_y=zeros(64,NumLoop); SymEqtmp1_y= RY1_QAMSymbol(2:65,:); %% 解码 %% ACO DX1_int = demodulate(hII,SymEqtmp1_x); DX1_Bit = de2bi(DX1_int,'left-msb'); %% DCO DY1_int = demodulate(hII,SymEqtmp1_y); %16QAM解调 DY1_Bit = de2bi(DY1_int,'left-msb'); %十进制转二进制 %% 并串变换 DX1_Bit_chuan=reshape(DX1_Bit.',1,[]); DY1_Bit_chuan=reshape(DY1_Bit.',1,[]); %% BER计算 %% ACO X_input_ceshi=X_BitSource; DX1_Bit_ceshi=DX1_Bit_chuan(1:length(X_input_ceshi)); [number_of_errors,bit_error_rate]=biterr(X_input_ceshi,DX1_Bit_ceshi); %% DCO Y_input_ceshi=Y_BitSource; DY1_Bit_ceshi=DY1_Bit_chuan(1:length(Y_input_ceshi)); [number_of_errors_y,bit_error_rate_y]=biterr(Y_input_ceshi,DY1_Bit_ceshi); s1(si)=bit_error_rate; s2(si)=bit_error_rate_y; si=si+1; % disp([' ']); % disp(['=========>> X_BER=',num2str(bit_error_rate)]); % disp(['=========>> Y_BER=',num2str(bit_error_rate_y)]); % disp('_______________________________________'); end snr=0:1:30; figure(1); semilogy(snr,s1,'o-',snr,s2,'*-'); xlabel('信噪比/dB') ylabel('错误比特数') grid on
评论
    相关推荐
    • USB-COM(HL340).rar
      usb转串口,找了很久才找到,现在别的地方很难下到,要不用不了,我这个可以用 HL340D 的
    • NAND FLASH的读写程序.rar
      Nand flash 读写程序 C语言代码,可以给U盘开发者参考 可以读写三星各种型号的Nand flash芯片
    • USB_2.0.rar
      USB2.0开发例程,基于51单片机,包括pc端程序
    • 串口温度数据采集并实时显示.rar
      串口温度数据采集并实时显示 读串口数据的原理是,只要当有数据向串口发数据来时,计算机就会自动将其数据写到一个特定的缓冲区,我们只要写程序去读那个特定的缓冲区就可以了. 有数据向串口发过来时,程序可以将数据接收到,接收的数据是字符型的,那么将数据转化为数字型的,再将这个数据的大小作为画图的某一个点的纵坐标,横坐标为数据的序号.将这些点用线连起来就是一个曲线图了,这个就是图形显示基本原理. 查看原来的数据的原理也是这样的,不同的地方就是,数据是从文件中来,同样的也是将多个数据分成一个一个的,然后这一个数据的大小就是画图的某一个点的纵坐标,横坐标同样为数据的序号,再将这些点用线连起来就是曲线图. 图形能移动的原理,是我们首先改变的只是数据,图形并没有变,但图形的形式是由这些数据来确定的,当数据发生变化后,我们通过刷新显示区来变化的.
    • gps.rar
      GPS应用程序设计,内含GPS卫星原理、方法及详细源代码
    • MSCOMM32.OCX.rar
      串口编程控件MSCOMM32.OCX mscomm32.ocx是微软提供的串口通讯开发控件。支持串口通讯的软件大部分都是使用这个控件来实现串口通讯功能的。 安装方法:请您把它复制到系统目录下,对于windows9x系列(win95、win98、winme)是x:\windows\system\,对于 windowsNT、windows2000、windowsXP系列是x:\winnt\system32\。然后打开一个命令行提示符窗口(MSDOS方式窗口), 用"cd x:\windows\system\"命令或者"cd x:\winnt\system32\"切换到系统目录下,再执行"regsvr32 mscomm32.ocx"这个命令。
    • VSer.rar
      虚拟串口的完整源代码,包括注释和开发日志。据说市值5万人民币!
    • USB-shujucaiji.rar
      USB数据采集系统论文-自己的毕业设计论文,花了很长时间做的,内容十分详细,包括核心代码和开发环境的设置。
    • wmserial.zip
      基于消息的Windows串口通讯例子
    • TX-1C-usbdriver.rar
      郭天祥TX-1C的USB开发板原码,内有驱动文件,固件程序