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

 ``` 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 ```