OFDM system with channel estimation code error in modulate
    6 views (last 30 days)
  
       Show older comments
    
getting ab error in modulate can any figure this out
%% OFDM system with channel estimation:
clear all; close all; clc;
global W
%% define parameters 
 m=10 ;
N=1000 ; %length of OFDM symbols N
M=16 ; %Constellation Order M
pilotFrequency=5 ; 
E=1; %Pilot Energy
Ncp=100 ; %Cyclic Prefix length
L=8; %channel Length (number of taps)
typ=1; %Constellation Family Type is [1 for M-QAM, 2 for M-PSK]:-
%% ----------------------------------------------------------------------
%% define the modems Tx/Rx
switch typ
    case 1
        Tx=qammod(W,M);
        Rx=qamdemod (W,M);
    case 2
        Tx=pskmod(W,M);
        Rx=pskdemod (W,M);
    otherwise
        error('Error, Constellation Family not Defined');
end
%% data generation 
D=randi ([0 M-1],m,N);
%% mapping (baseband modulation )
D_Mod=modulate(Tx,D);
%% serial to parallel 
D_Mod_serial=D_Mod.';
%% specify Pilot & Date Locations
PLoc = 1:pilotFrequency:N; % location of pilots
DLoc = setxor(1:N,PLoc); % location of data
%% Pilot Insertion
D_Mod_serial(PLoc,:)=E*D_Mod_serial(PLoc,:);
figure;
imagesc(abs(D_Mod_serial ))
%% inverse discret Fourier transform (IFFT)
%  Amplitude Modulation
d_ifft=ifft(D_Mod_serial);
%% parallel to serail 
d_ifft_parallel=d_ifft.';
%% Adding Cyclic Prefix
CP_part=d_ifft_parallel(:,end-Ncp+1:end); % this is the Cyclic Prefix part to be appended.
ofdm_cp=[CP_part d_ifft_parallel];
%% generating random channel 
h= randn(1,L) + 1j * randn(1,L);
h = h./norm(h); % normalization 
H = fft(h,N); % Frequency-Domain Channel 
d_channelled = filter(h,1,ofdm_cp.').'; % channel effect
channel_length = length(h); % True channel and its time-domain length
H_power_dB = 10*log10(abs(H.*conj(H))); % True channel power in dB
%% add noise 
count=0;
snr_vector=0:4:40;
for snr=snr_vector
    SNR = snr + 10*log10(log2(M));
    count=count+1 ;
    disp(['step: ',num2str(count),' of: ',num2str(length(snr_vector))])
    ofdm_noisy_NoCH=awgn(ofdm_cp,SNR,'measured' ) ;
    ofdm_noisy_with_chann=awgn(d_channelled,SNR,'measured' ) ;
    %% receiver
    %Remove Cyclic Prefix
    ofdm_cp_removed_NoCH=ofdm_noisy_NoCH(:,Ncp+1:N+Ncp);
    ofdm_cp_removed_with_chann=ofdm_noisy_with_chann(:,Ncp+1:N+Ncp);
    % serial to parallel 
    ofdm_parallel_NoCH=ofdm_cp_removed_NoCH.';
    ofdm_parallel_chann=ofdm_cp_removed_with_chann.';
    %% Discret Fourier transform (FFT)
    %  Amplitude Demodulation
    d_parallel_fft_NoCH=fft(ofdm_parallel_NoCH) ;
    d_parallel_fft_channel=fft(ofdm_parallel_chann) ;
    %% channel estimation
    % Extracting received pilots
    TxP = D_Mod_serial(PLoc,:); % trnasmitted pilots
    RxP = d_parallel_fft_channel(PLoc,:); % received pilots
    % Least-Square Estimation
    Hpilot_LS= RxP./TxP; % LS channel estimation
    % MMSE Estimation:- 
    for r=1:m
        H_MMSE(:,r) = MMSE(RxP(:,r),TxP(:,r),N,pilotFrequency,h,SNR);
    end
    % Interpolation p--->N    
    for q=1:m
    HData_LS(:,q) = interpolate(Hpilot_LS(:,q).',PLoc,N,'spline'); % Linear/Spline interpolation
    end
    %% parallel to serial   
    HData_LS_parallel1=HData_LS.';
    HData_MMSE_parallel1=H_MMSE.';
    %% demapping 
    d_received_NoCH=demodulate(Rx,(d_parallel_fft_NoCH.')) ; % No Channel
    d_received_chann_LS=demodulate(Rx,(d_parallel_fft_channel.')./HData_LS_parallel1) ; % LS channel estimation
    d_received_chann_MMSE=demodulate(Rx,(d_parallel_fft_channel.')./(HData_MMSE_parallel1)) ; % MMSE channel estimation
    %% Removing Pilots from received data and original data 
    D_no_pilots=D(:,DLoc); % removing pilots from D
    Rec_d_NoCH=d_received_NoCH(:,DLoc); % removing pilots from d_received_NoCH
    Rec_d_LS=d_received_chann_LS(:,DLoc); % removing pilots from d_received_chann_LS
    Rec_d_MMSE=d_received_chann_MMSE(:,DLoc); % removing pilots from d_received_chann_MMSE
    %% Calculating BER
    [~,r_NoCH(count)]=symerr(D_no_pilots,Rec_d_NoCH) ;
    [~,r_LS(count)]=symerr(D_no_pilots,Rec_d_LS) ;
    [~,r_MMSE(count)]=symerr(D_no_pilots,Rec_d_MMSE) ;
end
figure;
semilogy(snr_vector,r_NoCH,'-+');hold on
semilogy(snr_vector,r_LS,'-o');
semilogy(snr_vector,r_MMSE,'-s');
legend('orig. No Channel','LS CE','MMSE CE');
grid ;
hold off;
H_power_esti_dB_LS     = 10*log10(abs(HData_LS_parallel1.*conj(HData_LS_parallel1))); % Estimated channel power in dB
H_power_esti_dB_MMSE     = 10*log10(abs(HData_MMSE_parallel1.*conj(HData_MMSE_parallel1))); % Estimated channel power in dB
figure;hold on;
plot(H_power_dB(1:8:end),'+k','LineWidth',3);
plot(H_power_esti_dB_LS(1,(1:8:end)),'or','LineWidth',3);
plot(H_power_esti_dB_MMSE(1,(1:8:end)),'Sb','LineWidth',1);
 title('ACTUAL AND ESTIMATED CHANNELS');
    xlabel('Time in samples');
    ylabel('Magnitude of coefficients');
    legend('Actual','estimated LSE','estimated MMSE')
0 Comments
Answers (1)
  vidyesh
      
 on 19 Feb 2024
        Hi albin,
The issue you're encountering with the modulate function is due to an incorrect number of input parameters. The modulate function in MATLAB requires at least three arguments: the message signal ‘x’, the carrier frequency ‘fc’, and the sampling rate ‘fs’.
For more information on how to use the modulate function, refer to the MATLAB documentation page: https://www.mathworks.com/help/signal/ref/modulate.html 
Hope this helps.
0 Comments
See Also
Categories
				Find more on PHY Components in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
