www.gusucode.com > QPSK瑞利信道眼图分析源码程序 > QPSK瑞利信道眼图分析源码程序/rayleigh.m

    % clear all variables
clear;

sig_num = 300;
fd = 1;
fs = 7;
N = 64;
fm = 10;  %unit: 1Hz
Rs = 1;  %unit: 1MHz
Ts = 1/Rs;

% generate random QPSK signal
qpsk_D=randint(sig_num,1,4);
qpsk_C=dmodce(qpsk_D,fd,fs,'psk',4);
qpsk_flt = rcosflt(qpsk_C,fd,fs);

% draw eye diagram and scatter plot of QPSK signal
qpsk=qpsk_flt(1+3*fs:end-3*fs);
%eyediagram(qpsk,2*fs,2*fs);
%scatterplot(qpsk,fs);

% QPSK signal passes through AWGN channel
snr=8;
qpsk_AWGN_C=awgn(qpsk_C,snr);
qpsk_AWGN_flt=rcosflt(qpsk_AWGN_C,fd,fs);
qpsk_AWGN=qpsk_AWGN_flt(1+3*fs:end-3*fs);
%eyediagram(qpsk_AWGN,2*fs,2*fs,0,'r-');
%scatterplot(qpsk_AWGN,fs,0,'r.');

% generate Doppler power spectrum
deltaf = 2*fm/(N-1);
T = 1/deltaf;
sf0 = 1.5/(pi*fm);
for n = 1:(N-2)/2
    sf(n) = 1.5/(pi*fm*sqrt(1-(n*deltaf/fm)^2));
end
classicf = [fliplr(sf),sf0,sf];
%figure;
%plot(classicf);

for channels = 1:3
    % generate two normally distributed random variables
	gaussN_re1 = randn(1,(N-2)/2);
    gaussN_im1 = randn(1,(N-2)/2);
    gaussN_pos1 = gaussN_re1 + i*gaussN_im1;
	gaussN_neg1 = conj(gaussN_pos1);
	%% gaussN1 = [fliplr(gaussN_pos1),0,gaussN_pos1];
	gaussN1 = [fliplr(gaussN_neg1),0,gaussN_pos1];
	
	%% gaussN_pos2 = randn(1,(N-2)/2);
	%% gaussN2 = [fliplr(gaussN_pos2),0,gaussN_pos2];
	gaussN_re2 = randn(1,(N-2)/2);
    gaussN_im2 = randn(1,(N-2)/2);
    gaussN_pos2 = gaussN_re2 + i*gaussN_im2;
	gaussN_neg2 = conj(gaussN_pos2);
	gaussN2 = [fliplr(gaussN_neg2),0,gaussN_pos2];
	
	% generating flat Rayleigh fading channel
	x = ifft(sqrt(classicf).*gaussN1);
	y = ifft(sqrt(classicf).*gaussN2);
	%rayleigh_amp = sqrt(abs(x).^2+abs(y).^2);
	%rayleigh_db = 10*log10(rayleigh_amp);
	%figure;
	%plot(rayleigh_db);
	
	rayleighOrg = x+i*y;
	
	% frequency matching
	repNum = round(T*1e6*fs/Ts);
	dotNeed = floor(sig_num*fs/repNum);
	for k = 1:dotNeed
	    for j = 1:repNum
	        rayleighCh(j,k) = rayleighOrg(k);
	    end
	end
	remain = sig_num*fs-dotNeed*repNum;
	if remain > 0
	    for j=1:remain
	        rayleighCh(j,dotNeed+1) = rayleighOrg(dotNeed+1);
	    end
	end
	
    if channels == 1
	    rayleighCh1 = reshape(rayleighCh,1,[]);
    elseif channels == 2
	    rayleighCh2 = reshape(rayleighCh,1,[]);
    else
 	    rayleighCh3 = reshape(rayleighCh,1,[]);
    end

    %clear temporary variants for next use
    clear gaussN_re1 gaussN_im1 gaussN_re2 gaussN_im2 gaussN_neg1 gaussN_neg2;
    clear gaussN_pos1 gaussN_pos2 gaussN1 gaussN2;
    clear x y rayleighOrg rayleighCh;
end

% generate 3-path Rayleigh channel
a0 = 0.476;
a1 = 0.048;
a2 = 0.476;

% add delay time of Rayleigh channel
delay1 = 1;     %unit: 1us
delay2 = 2;
r1 = round(delay1/Ts*fs);
r2 = round(delay2/Ts*fs);

rayleigh0 = a0*rayleighCh1(1:fs*sig_num);
rayleigh1 = a1*rayleighCh2(1:fs*sig_num);
rayleigh2 = a2*rayleighCh3(1:fs*sig_num);

signal = reshape(qpsk_C,1,fs*sig_num);
sig_delay1 = [zeros(1,r1),signal(1:fs*sig_num-r1)];
sig_delay2 = [zeros(1,r2),signal(1:fs*sig_num-r2)];

sig_ray0 = signal.*rayleigh0;
sig_ray1 = sig_delay1.*rayleigh1;
sig_ray2 = sig_delay2.*rayleigh2;

% output of 3-path rayleigh channels
sig_ray = sig_ray0+sig_ray1+sig_ray2;

sig_flt= rcosflt(sig_ray,fd,fs);
out=sig_flt(1+3*fs:end-3*fs);

%% out1 = out(1:fs*sig_num);

eyediagram(out,2*fs,2*fs,0,'m-');
scatterplot(out,1,0,'m.');