[d20d5a]: demos / demo_ofdm.m Maximize Restore History

Download this file

demo_ofdm.m    136 lines (107 with data), 4.0 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
%DEMO_OFDM Demo of Gabor systems used for OFDM
%
% This demo shows how to use a Gabor Riesz basis for OFDM.
%
% We want to transmit a signal consisting of 0's and 1's through a
% noisy communication channel. This is accomplished in the following
% steps in the demo:
%
% 1) Convert this digital signal into complex valued coefficients by
% QAM modulation.
%
% 2) Construct the signal to be transmitted by an inverse Gabor
% transform of the complex coefficients
%
% 3) "Transmit" the signal by applying a spreading operator to the
% signal and adding white noise
%
% 4) Convert the received signal into noisy coefficients by a Gabor
% transform
%
% 5) Convert the noisy coefficients into bits by inverse QAM.
%
% Some simplifications used to make this demo simple:
%
% * We assume that the whole spectrum is available for transmission.
%
% * The window and its dual have full length support. This is not
% practical, because all data would have to be processed at once.
% Instead, an FIR should be used, with both the window and its dual
% having a short length.
%
% * The window is periodic. The data at the very end interferes with
% the data at the very beginning. A simple way to solve this is to
% transmit zeros at the beginning and at the end, to flush the system
% properly.
%
% .. figure::
%
% Received coefficients.
%
% This figure shows the distribution in the complex plane of the
% received coefficients. If the channel was perfect, all the points
% should appear at the complex roots of unity (1,i,-1 and -i). This
% demo is random, so everytime it is run it produces a new plot, and
% the error rate may vary.
%
disp('Type "help demo_ofdm" to see a description of how this demo works.');
%% ----------- setup of signal and transmission system --------------------
% Number of channels to use
M=20;
% Time-distance between succesive transmission. This must be
% larger than M, otherwise the symbols will interfere.
a=24;
% Number of bits to transmit, must be divisable by 2*M
nbits=16000;
% Length (in samples) of transmitted signal.
L=nbits/(2*M)*a;
% We choose an orthonormal window.
g=gabtight(a,M,L);
%% ----------- Setup of communication channel ---------------------------
% Larger means more random
howrandom=.3;
% Rate of decay away from (1,1). Larger means smaller spread (faster decay).
spreaddecay=1.2;
% Noiselevel for the channel.
noiselevel=0.05;
% Define the symbol of the spreading operator
symbol=sparse(L,L);
for ii=1:3
for jj=1:3
symbol(ii,jj)=(1-abs(randn(1)*howrandom))*exp(-(ii+jj-1)*spreaddecay);
end;
end;
% Make the symbol conserve real signals.
symbol=(symbol+involute(symbol))/2;
% Make sure that energy is conserved
symbol=symbol/sum(abs(symbol(:)));
%% ------------ Convert input data into analog signal -------------------
% Create a random stream of bits.
inputdata=round(rand(nbits,1));
% QAM modulate it
transmitdata=qam4(inputdata);
% Create the signal to be tranmitted
f=idgt(reshape(transmitdata,M,[]),g,a);
% --- transmission of signal - influence of the channel ----------
% Apply the underspread operator.
f=spreadop(f,symbol);
% add white noise.
noise = ((randn(size(f))-.5)+i*(randn(size(f))-.5));
f=f+noise*noiselevel/norm(noise)*norm(f);
% --- reconstruction of received signal ------------------------
% Obtain the noisy coefficients from the transmitted signal
receivedcoefficients = dgt(f,g,a,M);
% Convert the analog signal to the digital coefficients by inverse QAM
receivedbits=iqam4(receivedcoefficients(:));
%% --- visualization and print output -------------------------
% Plot the coefficients in the complex plane.
figure(1);
plot(receivedcoefficients(:),'.');
axis([-1 1 -1 1]);
% Test for errors.
disp(' ');
disp('Number of faulty bits:');
faulty=sum(abs(receivedbits-inputdata))
disp(' ');
disp('Error rate:');
faulty/nbits