clear all close all clc %% Constantes iniciales para OFDM pl=10; % Prefijo cíclico (siempre mayor al delay del canal) ws=16; % Tamaño de ventana Nc=196; % Número de portadoras activas fc=30; % Primera portadora activa FFTsize=512; %Tamaño de los bloques FFT/IFFT k=1; %Determina la cantidad de datos a transmitir all_data=sign(randn(1,Nc*FFTsize*k)); %Datos a enviar. Para que sean múltiplos y puedan dividirse. data_ofdm=reshape(all_data,[],Nc); % Paquete total de datos para OFDM. Np=size(data_ofdm,1); %número de bloques de datos a enviar. m=data_ofdm; %Datos BPSK normales. w=hann(2*ws+1); %Ventana para la FFT/IFFT %% Modulación OFDM por bloques. ms=[zeros(size(m,1),fc) m zeros(size(m,1),FFTsize-2*Nc-2*fc+1) conj(fliplr(m)) zeros(size(m,1),fc-1)]; % arma todos los símbolos OFDM. s1=(FFTsize/sqrt(Nc))*ifft(ms,[],2); %Transformación por bloques al dominio del tiempo (datos reales) %Se agrega el prefijo cíclico s2=[s1(:,end-pl+1:end) s1 s1(:,1:ws)].*repmat([w(1:ws)' ones(1,FFTsize+(pl-ws)) fliplr(w(1:ws)')],size(m,1),1); %se convierten los bloques a un paquete serie para transmitir. s=zeros(1,(size(s2,1))*size(s2,2)); %el vector "s" tendra los datos en serie. for c=0:Np-1 s(c*(FFTsize+pl)+1:c*(FFTsize+pl)+FFTsize+pl+ws)=s(c*(FFTsize+pl)+1:c*(FFTsize+pl)+FFTsize+pl+ws)+s2(c+1,:); end %Graficas %Densidad de potencia espectral de un solo simbolo ofdm figure %Espectro por FFT de un símbolo OFDM (mapea de 0Hz a "Fs" Hz.) plot(real(fft(s1(1,:)))); %% ENVIO POR CANAL DE COMUNICACIÓN PLANO PERO CON RUIDO rs=awgn(s,110); %se suma ruido al envío. pwelch(rs(1,:)) %% DEMODULACIÓN r1=rs(1:floor(length(rs)/(FFTsize+pl))*(FFTsize+pl)); %Se recorta la recepción a un tamaño que pueda paralelizarse. r2=reshape(r1,FFTsize+pl,[]); %se paralelizan los datos a bloques de long "FFTsize + pl" r3=r2(pl+1:end,1:length(data_ofdm)); %se quita el prefijo cíclico y quedan bloques de FFT SIZE d=real((1/sqrt(FFTsize))*fft(r3)); %se pasa al dominio frecuencial los bloques. d1=d(fc+1:fc+Nc,:); %almaceno los datos de portadoras utilizadas. %Cálculo de la tasa de error de la comunicación bercs = numel(find(data_ofdm(1:end-1,:)-sign(d1(:,1:end-1)')))/numel(m(4:end,:))