EDA365电子论坛网

标题: OFDM的仿真程序。 [打印本页]

作者: House    时间: 2020-4-20 14:40
标题: OFDM的仿真程序。
本帖最后由 House 于 2020-4-21 14:03 编辑
) B2 T  t4 n2 X8 W0 _$ ~) M; y2 T) S# o7 m, z6 L+ R+ [
OFDM的仿真程序,并且包括详细的WORD说明。有误码率和各种性能分析的做图程序。有需要的可以看看。# X/ ]9 @# u4 \3 ]

& q6 i2 k' F3 J1 E! c/ u& W8 T" v%a_run_design.m文件
2 |" U. Y0 _, s- csetup                                %系统设置
: S' p: K0 W# `! Q7 g. H1 {2 KQAM                                %QAM调制方式) z! C2 k9 {" H9 g# V4 C6 i
OFDM                                %OFDM调制方式
( ]6 L8 f( h, qAnalysis                                %QAM和OFDM两种方式对比' ?1 [  k) J; b8 W% r9 Q: K* i
) y1 I' h' G% F, p! H
1setup            %初始化部分; w) Q' N4 }- Z5 l1 n; G% |0 M" m
% setup
4 T3 B3 A) e' G0 qdisp(' '), disp('------------------------------------------------------------')
4 E* B$ k4 s" h" Z( Tdisp('Simulation Setup')8 g3 w+ ^1 f4 U( O

) x6 Y  W" N6 U/ [1 I5 Z% OFDM Setup -----------------------------------------------------------* S% J4 z1 w% H3 \: z/ L% v4 @
fft_size = 128                % should be a power of 2 for fast computation
* ]) |/ I9 i0 h0 Y+ M4 q0 ~1 S$ I; g                                % more points = more time domain samples (smoother & more cycles)
4 T( N+ [" R/ C, _2 g( m0 ?3 Wnum_carriers = 32        % should be <= fft_size/4& c9 L' W3 g# H8 _: L, \) R
                                % number of carriers used for each data chunk
2 w( G5 }4 t$ t/ m# X( ]( M+ {% new var - denotes even spacing or variations of carriers among fft points; V2 O  A3 c, w
input_type = 2;
+ [* b4 p& Z  E# u* S. a: L% 1 = test input& Q3 H2 F8 Y% A, i1 V
        test_input_type = 1;! @0 ^0 u+ u% O1 n5 z4 i4 n' a2 m
        % 1 = bit specified (binary)9 l5 c$ Y+ |; R( ^
                binary_data = [0 1 0 1 0 1 0 1];
; E3 t% N4 ]$ L! i6 ~" w$ U5 B        % 2 = random data stream (samples in the range of 0-255)5 ^) P! w7 Y* G7 ~. y' F- {  t
                num_symbols = 9;
/ _$ a- W" q  A& {* d2 l: O        % 3 = sinusoidal
) @# f9 o) v, `1 d" e                frequency = 2;5 S0 ^9 j( U' f8 E- B
                num_samples = 50;
0 b# \, D( n% v; W$ i+ Y1 X% 2 = external file input! J+ v6 b# {+ S- j3 T! K
        file_name = 'shortest.wav';                % Name of input file
, k+ V/ s$ _* c        file_input_type = 3;6 W6 j3 G" z2 E/ T0 G& G4 O# [9 Q! p
                % 1 = binary (not implemented)
5 m2 G1 {$ y" w& T* c" \5 v                % 2 = text                                        % Demo file:  'text.txt'
. t  ?. M( W9 p/ A. ^                % 3 = sound                                % Demo files: 'shortest.wav' & 'shorter.wav'0 }1 N; Z2 J( m' S1 U8 G( P8 N% V
                % 4 = image (not implemented)% B  w# Z% t/ K) G' V
. l- z4 C4 T, B/ D' h3 r# J
% QAM Setup ------------------------------------------------------------
' j  i5 Q4 b- j7 Tdo_QAM = 1;                % (1=on, 0=off)
5 L) `7 U9 \& o' e; R, K  \; \- FQAM_periods = 10;        % defines the number of periods per QAM Symbos (1=2*pi)
0 ~3 J3 v2 R% G4 l$ v2 z7 j# N0 ]
% Channel Simulation Parameters --------------------------------------------4 W: V' a: a( q2 ^
channel_on = 1;                % 1=on, 0=off
6 R7 _9 {  a0 `' I4 P2 L2 xclip_level = 1.0;                % 0.0 - 1.0 (0-100%)
. T6 N+ |) r- M, @5 c2 X% Y        % Max magnitude of the signal is 'clip_level' times the full magnitude of the signal
/ |4 j$ Q# a, p. Q1 I! ~noise_level = 0.0;        % 0.0 - 1.0 (0-100%)+ X9 N' n3 i0 x0 t0 y1 o/ z6 ]
        % Magnitude of noise is 'noise_level' times the magnitude of the signal
6 J4 a! M  g) e7 L% Multipath Channel Simulation
4 n& Y4 g) H$ U2 \& x. ^3 U' U        % Good defaults when fft_size = 128 and num_carriers = 32:
8 F! b4 H* c* e% x& ^/ C        %        d1=6; a1=0.30; d2=10; a2=0.254 v- [/ E5 G' B
        d1 = 6;                % delay in units
  o5 Q7 a0 ?( Y$ {( W8 h7 T        a1 = 0.30;         % attenuation factor - multipath signal is x% of size or original signal
# J& A3 F$ l) x& j8 U9 Z        d2 = 10;                % delay for second multipath signal# x8 i9 W9 }: n3 a7 a* _
        a2 = 0.25;        % attenuation factor for second multipath signal: c" Y& e" M4 |/ b3 L+ h% Z
; S% m3 x& \- ^7 S
' `. k6 T9 [. k0 B) `1 N
% ****************** TEST INPUT SETUP - DO NOT MODIFY **************************
, ^% d/ t+ \& o$ Zif input_type == 1- W8 H7 y, l3 l8 n- q) \: w
        if test_input_type == 1
- X6 g) j* K' @" d                %specify BINARY input bit-by-bit% T* C  F' D% d3 N( j
                data_in = binary_data;6 V( \! P7 A- g) q6 I! ^2 j& `) p. j
        end5 W+ ^% s3 i. V: _6 {' f: k
        if test_input_type == 2; Q4 ?5 C8 G9 U! m4 ~+ W
                %random input defined by parameters- F3 T; K$ Z# K" Y# q8 P+ I9 n
                num_levels = 255;                %number of possible levels of a symbol! w5 W- \1 g( y
                                                %must be integer between 1-255
+ `9 t0 b3 d! i# ?                data_samples = round(rand(1,num_symbols)*(num_levels-1));0 ~' E0 M/ i; M5 A& d
                data_in = zeros(1,8*length(data_samples));
' T! `/ @4 j6 B) ~3 y& S* @                for i = 1:length(data_samples)
/ }4 b1 j+ h" v& j- V3 L                        data_in(1 + (i-1)*8: (i-1)*8 + 8) = eight2bin(data_samples(i));
3 l! k3 ?) B/ l$ Z* b                end
9 B- l/ A0 J$ O* j# S+ x        end
% w( `5 o" `$ D& e1 t, ^        if test_input_type == 3
3 f0 M" y% \, V; v; ~4 p; N                %data stream represents sine wave samples$ i3 S5 o! S" I+ x/ N
                t = linspace(0,1,num_symbols);        %evenly space number of samples$ n' Z$ M" M8 w  w$ Q/ L
                %take 8-bit samples of sine wave
; n3 m0 _3 F5 S1 }  t0 f7 f                data_samples = round(127.5*sin(frequency*2*pi*t) +127.5);2 t6 b# {; i! `. P- f/ @# a
                data_in = zeros(1,8*length(data_samples));- p! \8 E" y# j) l& |1 _
                for i = 1:length(data_samples)
. g( ?; b7 t* y  c                        data_in(1 + (i-1)*8: (i-1)*8 + 8) = eight2bin(data_samples(i));' i  H* l3 O. D2 p  I: A
                end
0 \8 u9 \5 v2 M/ c) i        end
8 ~9 [/ w7 q0 A5 \; Uend' l5 r6 |: Y  F% U3 N5 u) c9 }

2 b& n' |( e+ f3 k+ `already_made_noise = 0;        % initialization (don't change)4 N8 P) L! {: x% p5 ?
" O4 M' [( C: N9 x
2、QAM.m. Y' D2 t2 `. r& c" W9 }0 `& \
% QAM.m compares OFDM (multicarrier) to multi-level QAM (single carrier)8 G1 R. j2 \$ L- t0 F6 F
% when they transmit the same # of bits in a given time period7 a' N! f  N2 K0 X+ L7 u" T
# u( o* i  u* w/ {3 o, _. B5 C* P
read                % read data for QAM - does not affect OFDM
% j1 ^/ {7 f; q" z5 N7 udata_in_pol = bin2pol(data_in);                % Converts binary data to polar data
. X, v0 e; ~! C$ y9 x3 E0 L6 d& H' W) D: Y  H0 g  M- Z
% check to see if num_carriers is a power of 2
' x& p) |4 ~( `* T5 @) ]/ @* Lis_pow_2 = num_carriers;
  Y: k3 t/ {4 c' D6 b4 _temp_do_QAM = 0;
$ H$ b- |# U. D* lif is_pow_2 ~= 2
% [# B( r2 F' H6 T8 u        while temp_do_QAM == 0
. y) N3 V6 s) t5 s3 R4 q                temp_do_QAM = rem(is_pow_2,2);
% q; c+ q- K0 B5 A4 Y& _7 ^7 f                is_pow_2 = is_pow_2/2;
- S* Q% z6 L( p. X                if is_pow_2 == 23 J% L1 z/ a8 o. U5 A7 ]7 U( b/ Q
                        temp_do_QAM = -99;                % it is a power of 2 -> can do QAM
( \" h4 o/ U2 R/ A2 T- ^                end
# B+ K$ ]) t6 y6 u) N$ b        end
8 j: h6 x2 b4 Zelse
; u; d5 G8 T% g' A  S! H        temp_do_QAM = -99;        % 2 is a power of 2
: L2 z! q5 `% Y9 z8 I* wend- G8 B, C# L: m; c
if temp_do_QAM ~= -99. @- s2 W5 a9 m& M* q( \8 ]
        do_QAM = 0;        % don't do it if it's not possible! y" h9 v, i0 ~) p- ^; L" j3 K1 z
        disp(' '),disp('ERROR: Cannot run QAM because num_carriers is not valid.')0 I7 _4 [' l9 n2 \0 ]0 L, p
        disp('       Please see "setup.m" for details.')
4 e- A. E8 D3 aend- y0 i5 W. n& j) q: ?7 Q
- n  V: Z* s7 w5 q( v

/ S  u- f* J2 Y$ Wif do_QAM == 17 [/ `/ ~. z9 I9 T
        tic        % Start stopwatch to calculate how long QAM simulation takes
) E! O9 U* O* {$ E8 k6 a$ J0 p        
# |" @: K9 c+ Q        disp(' '), disp('------------------------------------------------------------')% F: P3 ~. d$ f( w2 }- A! n
        disp('QAM simulation'), disp('Transmitting')2 z0 [) N4 E1 m
        
( N; E6 F( u9 K5 [' {; f        % Pad with zeros so data can be divided evenly
7 O; ~9 A' f" |5 @) S! @        data_length = length(data_in_pol);
5 h/ J1 ]0 c* T1 V  b& C        r = rem(data_length,num_carriers);
- D7 Q& P$ l" _/ I1 o0 U        if r ~= 0
6 V4 n- U2 z6 g& v( H+ k                for i = 1:num_carriers-r5 t" T% y" i5 f% ?5 v# P
                        data_in_pol(data_length+i) = 0;        %pad input with zeros to complete last data set. R9 _) p9 k! M2 n" y
                end                                                        %speed improve possible
( G' I  E/ ~1 w+ |* `2 o. J        end
$ V" ]) `1 T3 V3 O3 W        data_length = length(data_in_pol);                %update after padding
( G& m. X& ^6 t/ I6 |        5 l( x2 o3 |9 `  _: @# r
        num_OFDM_symbols = ceil(data_length / (2*num_carriers));) t3 ]  d1 s, Z1 E- a7 @
        % num QAM symbols that represent equal amount of data to one OFDM symbol
3 W3 c- l* z& W% m% l9 F; Y        num_QAM_symbols = num_carriers / 2;& j8 f& T, o; x  a0 c
        % num samples per QAM symbol
5 i9 Q* y8 U" B& y, ?3 N( _        num_symbol_samples = fft_size / num_QAM_symbols;0 i. u2 J# c- {! q0 e
        
& G7 a6 @/ l- h: y, y+ A        % convert polar data [-1, 1] to 4 level data [-3, -1, 1, 3]
0 D: R) u( F) F0 i  _4 E& A) ]        data_in_4 = zeros(1,data_length/2);
) m/ A* ]1 H$ k0 p% D- j        for i = 1:2:data_length
+ o. ^* W# Q+ O2 ~/ I1 R4 ]2 C                data_in_4(i - (i-1)/2) = data_in_pol(i)*2 + data_in_pol(i+1);/ ^1 B& k# i# C" r6 I
        end$ k* a0 u: w# J# }, F3 |
        9 W0 I& ~3 l4 _& J# e
        % define sample points between 0 and 2*pi
# r# P  j6 F" T2 H# k: @6 w/ M! a        ts = linspace(0, 2*pi*QAM_periods, num_symbol_samples+1);
" w2 t+ L) q( @% s        
- f* H: `9 T* A' D- H        % Generate 16-QAM data; S+ w. S; h3 m4 l3 R0 n3 _! e' G
        % total length of 16-QAM transmission
4 D: O& B3 F) _- ?        tx_length = num_OFDM_symbols * num_QAM_symbols * num_symbol_samples;1 _9 R+ l* n; J. i1 S
        QAM_tx_data = zeros(1,tx_length);
' ]  P* M5 y3 J# T6 `3 l# g        for i = 1:2:data_length/2
% Z/ z) f: ~0 {/ A" m4 a5 W  }                for k = 1:num_symbol_samples# C/ B$ o. \+ r+ G
                        QAM_tx_data(k+((i-1)/2)*num_symbol_samples) = data_in_4(i)*cos(ts(k)) + data_in_4(i+1)*sin(ts(k));
9 _1 L( W7 ^" a. f                end
4 C9 P! J& v5 K- s. ?1 K        end: ^5 Q6 T+ A5 Z) m% x
        
* Z( O5 |5 K& s: \        % Do channel simulation on QAM data# V; J+ l8 c7 `! S) A! E
        xmit = QAM_tx_data;                % ch uses 'xmit' data and returns 'recv'
7 o6 a2 n0 a  K2 W) R! {% E: I        ch% e, {- X! |6 m8 i
        QAM_rx_data = recv;                % save QAM data after channel# ~  n0 G9 w( ]# o6 C  b
        clear recv                                % remove 'recv' so it won't interfere with OFDM
: U7 y* S, T1 o        clear xmit                                % remove 'xmit' so it won't interfere with OFDM# v+ x1 @  P* a- P
        3 U. Y. ~2 @) Y
        disp('Receiving')                        % Recover Binary data (Decode QAM)
5 L) s7 e* Q# L9 x& b        cos_temp = zeros(1,num_symbol_samples);                %
. H- K( M5 t: f4 T        sin_temp = cos_temp;                                        %
' X6 |. s( B; _  k& s) r3 y        xxx = zeros(1,data_length/4);                                % Initialize to zeros for speed
# m" L6 c4 P1 q& Q2 m# G& q        yyy = xxx;                                                                %& Q* s1 [& O8 _
        QAM_data_out_4 = zeros(1,data_length/2);                %( e1 m% W# e+ n5 [
        
1 b* u. |8 C1 k6 a5 j8 q        for i = 1:2:data_length/2        % "cheating"% [; o% o6 t/ k
                for k = 1:num_symbol_samples9 ~/ o: N  L/ J8 ?# K
                        % multiply by carriers to produce high frequency term and original data
" ?# L  |/ d3 R- R" ]: J9 u  T                        cos_temp(k) = QAM_rx_data(k+((i-1)/2)*num_symbol_samples) * cos(ts(k));
9 t, F: w) a, U( P3 ]$ K& g) `                        sin_temp(k) = QAM_rx_data(k+((i-1)/2)*num_symbol_samples) * sin(ts(k));& @/ B/ Q3 |) h; ]
                end
, v% b$ }% R/ T! {( I                % LPF and decide - we will do very simple LPF by averaging
# o( i% {  `: g& D                xxx(1+(i-1)/2) = mean(cos_temp);6 C" W% k0 p8 ]; s
                yyy(1+(i-1)/2) = mean(sin_temp);/ P) G- e4 K8 q4 a/ j; J$ I
                % Reconstruct data in serial form
6 x, e3 ^6 q6 z/ L  y( P- h                QAM_data_out_4(i) = xxx(1+(i-1)/2);- |, M' m- _" M7 C) }3 x9 o! ~
                QAM_data_out_4(i+1) = yyy(1+(i-1)/2);
7 {' K8 q3 ?7 x  }9 g$ I        end0 V8 v) p9 b& b+ K) W
        
4 E# |2 l% B# `  s        % Make decision between [-3, -1, 1, 3]- K7 \' q. W9 M+ a! l; O" i" w$ v
        for i = 1:data_length/2
+ Y2 X; G/ p5 B                if QAM_data_out_4(i) >= 1, QAM_data_out_4(i) = 3;
0 C' y4 l# E" Y4 h$ L- {                elseif QAM_data_out_4(i) >= 0, QAM_data_out_4(i) = 1;& P5 U8 ~: |/ J% P" \. ^1 g
                elseif QAM_data_out_4(i) >= -1, QAM_data_out_4(i) = -1;# {$ Q. x" d0 r* D
                else QAM_data_out_4(i) = -3;* y0 T  k, ^- U, p
                end" a$ M8 B8 [4 h* p& [. B0 v1 ~: g
        end# z; z* {$ ^9 @7 ^4 |3 C1 J/ h3 T
        
' n" z7 Y; n" c- O; E' `        % Convert 4 level data [-3, -1, 1, 3] back to polar data [-1, 1]( k% P4 S2 t9 |- X2 U# x+ q& M/ \
        QAM_data_out_pol = zeros(1,data_length);        % "cheating"/ N0 c4 t: ~* c5 g" W( G
        for i = 1:2:data_length4 F( `: o6 g5 F) B0 @0 Q' B
                switch QAM_data_out_4(1 + (i-1)/2); j; f% _% z, d* M5 x
                        case -3
- Q( D% [: `( C                                QAM_data_out_pol(i) = -1;; S" g$ n5 w( Y1 a3 [! S( c3 r
                                QAM_data_out_pol(i+1) = -1;( ~, P$ C3 t2 h
                        case -1
( H1 ~; ]" R# a& D! V5 s                                QAM_data_out_pol(i) = -1;
: W3 ]: J% V  D$ X% M                                QAM_data_out_pol(i+1) = 1;
1 k: ~1 e6 _; D" H- Q9 |                        case 1* m8 ]) A5 n- g" K1 B$ k% M
                                QAM_data_out_pol(i) = 1;
4 K+ h" a& w; C; m8 q/ c2 @                                QAM_data_out_pol(i+1) = -1;% N, ]; A1 B4 Y% h) Y
                        case 3
& E9 N' R  b) F# F; s: _                                QAM_data_out_pol(i) = 1;
* K/ P0 }: H$ M& W  e0 s                                QAM_data_out_pol(i+1) = 1;1 G- r8 I- Z+ `4 T) E7 [2 g0 v
                        otherwise2 U$ ^3 Y$ s, n  q: F- M! ?
                                disp('Error detected in switch statment - This should not be happening.');, v8 [' q( X" L% V; G
                end
1 [& f7 D# e# J. c        end9 s$ j$ ?; g6 X5 F# }4 D, L3 V
        QAM_data_out = pol2bin(QAM_data_out_pol);        % convert back to binary
4 y+ j$ g1 n" g: O! ^6 K3 s        
# _6 l/ W1 W+ q8 {        % Stop stopwatch to calculate how long QAM simulation takes
9 E5 R. b% _2 ^( Y8 a; `        QAM_simulation_time = toc;
# x8 b/ z9 t0 {2 N        if QAM_simulation_time > 60
) U! G! s: V) F                disp(strcat('Time for QAM simulation=', num2str(QAM_simulation_time/60), ' minutes.'));" ^9 I* r& f# o; B# N, y
        else
- ]( p1 l- ~( O* T                disp(strcat('Time for QAM simulation=', num2str(QAM_simulation_time), ' seconds.'));
; M* R) v( r% A, u- n* F1 K( H        end, q9 J' M4 U+ A; c1 K' ?
end
. x7 u* n4 s) m- @: v0 o  U: m5 w
, B8 C5 @0 B9 S- q4 _3 % Run OFDM simulation) ]7 K$ v/ E1 [2 U; N0 s
tic        % Start stopwatch to calculate how long QAM simulation takes
7 {" ]7 D- u& Adisp(' '),disp('------------------------------------------------------------')
3 o: W  J0 l0 _7 X8 I+ B, X6 E6 ldisp('OFDM Simulation')" d( U. B; H1 {/ b
tx         
; g. Y% d( I! y+ S4 v5 u5 Sch
: G/ {2 R' s- @; {5 Urx
/ ^' v1 f! t) s3 p! W% Stop stopwatch to calculate how long QAM simulation takes
$ o5 n* R5 [+ I2 [5 q& a3 _# N+ _6 AOFDM_simulation_time = toc;5 B" a& m7 {, y: ~8 m" R/ W% U
if OFDM_simulation_time > 601 F: X5 C( O: v$ ?! l' U" X! y
        disp(strcat('Time for OFDM simulation=', num2str(OFDM_simulation_time/60), ' minutes.'));
9 M' q+ u4 V& s7 u: W4 Felse
& [% E9 ?" @: V/ @$ c        disp(strcat('Time for OFDM simulation=', num2str(OFDM_simulation_time), ' seconds.'));
8 J4 X9 Y* C. R% r2 }end
: x) @3 E- b' r- Y6 Y" l
! q+ H( Q& v3 y# p& C6 x6 J, Y3.1发送; w; D& _$ w9 l8 e* ~
% tx
9 H0 E$ t% w0 R$ L2 j* v% Ddisp('Transmitting')$ d& O5 i8 D# |9 \7 P
read                            %read original data
# U, C6 t% r9 `7 e& I! N' Q8 h) @data_in_pol = bin2pol(data_in);           % Converts binary data to polar data" k% o- C9 n& r/ I
tx_chunk                        %convert polar data into chunks.      
5 d" k- ]% x* V" U" ?
. B0 T1 w4 t  l  y0 n/ V% perform ifft to create time domain waveform representing data
8 C# e! [9 R9 Y; ^; j0 Ktd_sets = zeros(num_chunks,fft_size);8 V' ?/ k  x; D
for i = 1:num_chunks7 |# W3 J* F5 f# S5 B& D2 Q& a
        td_sets(i,1:fft_size) = real(ifft(spaced_chunks(i,1:fft_size)));. g0 r6 q0 X% g4 _# ~
end
( h  Z- ]; F) S7 H) w& M
% \) C9 ]: K; _- t8 @tx_dechunk      % Construct signal to transmit by placing time domain sets in series
8 ^* {& q, C5 ?3 L1 Z$ u% h- B  v+ w' b: @* c
3.1.1 % tx_chunk    %双极性数组转化成OFDM字符串
, O7 D) s4 r) z9 p, W* f1 ldata_length = length(data_in_pol)                                    %number of symbols in original input
& [0 C0 _8 U2 F9 l1 B) o' hnum_carriers* ?+ l6 V8 n4 U
num_chunks = ceil(data_length/(2*num_carriers))        %2 data on each carrier (real and imaginary)
7 m) `+ s6 F8 R$ N, V0 _r = rem(data_length,2*num_carriers). \. L6 `$ i- s  @
if r ~= 0
7 w/ @4 H% _5 T) ]% ^% m" E, N. h        for i = 1:num_carriers*2-r
- Y# a5 T4 z$ G3 o: U* M                data_in_pol(data_length+i) = 0;        %pad input with zeros to complete last data set0 G% n1 b$ d7 a
        end                                                        %speed improve possible
7 Q, J! s/ p: K5 d* Xend: z) \' E6 l- C8 N

+ S- P9 I8 F+ ]' A% z% break data into chunks; Q  z% [2 E: B; @& m1 ?# L
chunks = zeros(num_chunks,num_carriers);        % for speed* W1 q  B4 a* {
for i = 1:num_chunks8 U* W4 n% M8 `4 I- T
        % *********************chunk done
( B2 W4 L- w9 `( Z: X: }8 k$ `        for k = 1:num_carriers
3 ^- |( }# w( ~: u( [0 }7 K                chunks(i,k) = data_in_pol(2*num_carriers*(i-1)+k) + data_in_pol(2*num_carriers*(i-1)+k+num_carriers)*j;$ @! P) H3 s+ t9 e; t4 k4 C6 Q1 u: d
        end
$ s$ j6 K! _1 N9 G+ s7 gend9 n& d2 _, p8 ^  ^
3 [! {! Y5 Q0 J4 p
chunks
# V& t( r2 I: ~% Padding chunks with zeros so num_carriers and fft_size are compatible: n. T# Y7 O9 V- q4 @. |4 X- G
% Once compatible, further spacing is simplified6 G3 w4 M, i' b* K) z
num_desired_carriers = num_carriers;
8 n# W, s2 a7 L: r  Hnum_zeros = 0;
1 u# z9 J& o- I- A- nthinking = 1;
# R- c  m+ E# d2 Iwhile thinking == 1 % Continue if num_carriers and fft_size are not compatible
4 d) T# S  Y4 \/ g0 c- M: n' Q        if rem(fft_size/2,num_desired_carriers) == 0
8 b" v* {4 G2 i. W                thinking = 0;# C* E+ c. ^' `& Q- s
        else
% O' m/ ]7 d) M6 h2 l3 k: P6 R9 K                num_desired_carriers = num_desired_carriers + 1;
! M8 A* k. G1 X. ]- U% |% g                num_zeros = num_zeros + 1;: i5 [$ |" _' c' S
        end; \% k8 U4 q* N; ?/ i# T1 h
end6 l' r/ t5 r. z6 b4 O

, [, F& Q  e* G  Y1 D5 wpadded_chunks = zeros(num_chunks,num_carriers + num_zeros); % for speed
# Q& p7 a# Z" V+ i6 q: A  N  j5 Y1 j5 \padded_chunks(1:num_chunks,num_zeros + 1:num_carriers + num_zeros) = chunks;
* J- V0 h7 @7 m1 C0 D
) S8 E4 k( Z% ]+ _- D( s% l/ Q( }+ A% d1 q- f, Z% O9 F
%compute zeros_between0 J' Z6 X8 W0 b/ |
zeros_between = ((fft_size/2) - (num_carriers + num_zeros))/(num_carriers + num_zeros);4 t, i. T  m# t. A% X+ n% e$ S
& h% G8 k% M- [2 m
spaced_chunks = zeros(num_chunks,fft_size); % for speed - extra room for folding later" f9 `0 z- p) ]2 ~( j' e5 g
%add zeros_between
3 M' o5 k. V1 B9 {# ri = 1;
) ?8 J/ r' i: i& W3 s8 Jfor k = zeros_between +1:zeros_between +1:fft_size/2
3 t, ?/ v- g+ O" v( h3 A        spaced_chunks(1:num_chunks,k) = padded_chunks(1:num_chunks,i);/ ^8 _, j! s6 ^% w: k
        i = i+1;1 O5 q8 A" z1 O' o  l$ X: z4 \
end
, k4 C. {2 t' O. A' }1 c, C, D% G  c+ A& D+ V! {9 s0 a
% folding data to produce an odd function for ifft input
7 W/ c; N' w4 {  e! y: |" ?for i = 1:num_chunks: E2 `" l5 y- |5 A% w4 T
        % Note: index = 1 is actually DC freq for ifft -> it does not get copied over y-axis+ m0 ~: D! l8 ^6 f: d7 f
        spaced_chunks(i,fft_size:-1:fft_size/2+2) = conj(spaced_chunks(i,2:fft_size/2));
; q. o& H. ^* [  V7 Mend& G4 d0 |/ q! A
$ A. |8 S  P! O( @9 q4 x8 ]
3.1.2 tx_dechunk: k9 q0 L  f* d  J) n7 K
% tx_dechunk
: s! q  b" b6 u. H0 L4 U0 P6 f7 r
% Construct signal to transmit by placing time domain sets in series
2 R5 `2 v6 U3 Q8 |xmit = zeros(1,num_chunks*fft_size);- m) R+ N9 K, f  w1 o
for i = 1:num_chunks
% ], p7 K! L( y* Y, v- Y6 D# \        for k = 1:fft_size* V- J$ d( ^9 B' e& [% C4 b
                xmit(k + (i-1)*fft_size) = td_sets(i,k);
! ]+ p' o. P6 n9 O4 [; n9 ]# @        end
3 V$ Y/ d) z) U7 C  T: Wend+ c1 l" J. b' c9 p) M$ a7 w

9 \. t  t, N+ r. I+ k# W- f2 h3.2 %ch.m
! X/ d; c7 l7 D+ N5 U% ch
3 W9 p# k0 _! v. @recv = xmit;        % channel is applied to recv, don't modify transmitted data4 X5 B3 W& }. B2 j5 Y& |" x( g2 t
if channel_on == 1
7 w& _/ k! V6 g5 K        disp('Simulating Channel')
' z8 ~, @" Q$ ?. Q! l6 k        norm_factor = max(abs(recv));        % Normalize all data before applying
- X1 H1 B: u7 o. O# v        recv = (1/norm_factor) * recv;        % channel for a fair comparison/ v$ j5 E' A) z  a7 r& B, s0 z
        ch_clipping                     %clipp data/ P6 C3 G3 |) |; z5 q3 F9 m( P
        ch_multipath                    %
/ d) S. l5 M- @7 ~+ n; g        ch_noise                        %
8 R1 y! e8 X, F* h8 o        recv = norm_factor * recv;                % Restore data magnitude for proper decoding+ w' I) _; h) p5 }8 j' n
end
: x% n* t* @# f* W4 S" ^
' M4 N! Y6 J  g8 ^8 O& M, J0 ?3.2.1 %ch_clipping.m: M- j8 Q- Q$ {+ l* n+ o" B" c
% ch_clipping
2 l, J( x7 Q: w1 ]7 R0 Jfor i = 1:length(recv)
: t  P$ S/ G# U        if recv(i) > clip_level
6 X7 B8 D1 Q8 w/ m4 N7 v  M( I6 Q                recv(i) = clip_level;
" M! L# J8 h4 ~% z  G        end# I5 I! B& q% \
        if recv(i) < -clip_level% c% A! V3 V+ K8 u' v( }
                recv(i) = -clip_level;  y: T" o+ h& ]- @7 k6 U6 d
        end, f6 A8 ?1 m- `! J) Z
end' l0 m- L' w, f: R# t! }

& c8 z9 h  ~5 D) t! m; F; [& A3.2.2 % ch_multipath                  % 产生多经的方法. W( K/ C/ C) E0 P/ S- H8 _
copy1=zeros(size(recv));
9 t9 K4 S3 `' ifor i=1+d1: length(recv)+ {9 D" M" H6 l2 q4 Y9 [
        copy1(i)=a1*recv(i-d1);8 y: t( H& q* m' g$ p1 N: c
end
) Y) D# q' x: i0 p( }copy2=zeros(size(recv));
+ [  y* ?6 U: @2 P' d& l% Yfor i=1+d2: length(recv)* o/ y& C+ Q; @# n6 C( K. L& b: n
        copy2(i)=a2*recv(i-d2);
6 S) v" b: R/ uend7 E' O% M% Q) X$ M" N% Z" K% p! f
recv=recv+copy1+copy2;
: S$ F2 A( W' ^1 @8 I" M& H1 w* y0 J4 y* V6 t  s! D4 ]) m5 _. ^
3.2.3、%ch_noise                     %施加信道噪声/ M: t& B4 Z4 e
% ch_noise (operate on recv)0 E& t( M# D% n6 ~% s0 c0 M- t8 e5 E
% random noise defined by noise_level amplitude8 g4 K2 [# x7 L& @' M
if already_made_noise == 0        % only generate once and use for both QAM and OFDM. y% a. i8 f5 D- \) _$ {( Z
        noise = (rand(1,length(recv))-0.5)*2*noise_level;9 e& ~4 I7 {& \* w, ?8 s
        already_made_noise = 1;
1 S, F  v. W" ]  w/ xend
9 S) l$ V( V2 s% ^( Erecv = recv + noise;4 C- r0 {% C3 b& D9 W, |! Z
8 ?9 a  R( @2 w) S
3.3 %rx.m                        %接收程序
, B6 f" U( o8 I2 d) Q% rx
4 X! ^+ n) v/ D- q# S$ m2 Hdisp('Receiving')4 S* ], ~, U; @  L8 N! o
rx_chunk
. Z6 j) f. t4 ?3 H
, \# B" J- j+ ~4 R9 b5 ~/ W% perform fft to recover original data from time domain sets. o! Y) p9 L& m. t2 G2 s
recv_spaced_chunks = zeros(num_chunks,fft_size);
# X" V- [3 E# D% r& D" zfor i = 1:num_chunks) ]2 e2 R+ z0 v% _
        recv_spaced_chunks(i,1: fft_size) = fft(recv_td_sets(i,1: fft_size));- ?  s& ^1 a# V
        % Note: 'round()' gets rid of small numerical error in Matlab but a threshold will be needed for a practical system  `- z8 i3 j6 `: F7 A0 k
        % 2001-4-17 -- Got rid of 'round()' to do decoding more intelligently
! ^* o4 T* d, q  R2 q. ^end0 L% W: e0 u1 g' A; @2 ?5 r
rx_dechunk
% ~3 Y  h/ b" w8 G7 x/ g/ p0 Xoutput = pol2bin(output);        % Converts polar to binary' ?& J0 B: D5 ?( o. n3 `
write& E% v1 ~, C. }

( D' Y* q7 d" @1 ?) w3.3.1 %rx_chunk.m1 u$ g4 g. N6 {0 d3 [" e$ y& l
% rx_chunk$ f* X' |8 T, W+ l$ Q7 n7 Z
% break received signal into parellel sets for demodulation
( d! V: B1 L' t# |0 l/ }" Grecv_td_sets = zeros(num_chunks,fft_size);  V9 W* Y% g# K; W3 y
for i = 1:num_chunks, c5 z) t1 b- I6 F2 k) S3 q
        for k = 1: fft_size: d) h6 w! R2 F8 G
                recv_td_sets(i,k) = recv(k + (i-1)*fft_size);: M6 D; i6 Z: H
        end( C+ K% N& ?. w' \6 b! c6 y
end
' e4 [- Q% K1 J, U# s" g
7 A9 q0 s! }. {% q3.3.2 % rx_dechunk             %并串转换
' B8 q0 F5 l. n, P6 u" {% rx_dechunk1 e  S1 @( k9 ?# L) J% F
% take out zeros_between from recv_spaced_chunks --> recv_padded_chunks
  \* n0 X: X2 z8 Z# Jrecv_padded_chunks = zeros(num_chunks, num_carriers+num_zeros);
# [. [$ ?! o! n' C' {& k# yi = 1;
- C; u% W" Q% N, [4 n# c/ ^' g3 Mfor k = zeros_between +1:zeros_between +1:fft_size/2! O3 P& B" I( {. X% R
        recv_padded_chunks(1:num_chunks,i) = recv_spaced_chunks(1:num_chunks,k);
* P4 V, c* I6 L+ z+ m6 {4 ?* N        i = i+1;' F' H; l1 u  o) R
end1 l1 {* v4 q7 P7 ^; [8 G8 L
# e' ^" ^# y. X
% take out num_zeros from padded chunks --> recv_chunks5 I; J  e- C& b9 C( @
recv_chunks = zeros(num_chunks, num_carriers);5 H2 X0 ~. ]* B% f
recv_chunks = recv_padded_chunks(1:num_chunks, num_zeros+1:num_carriers+num_zeros);0 r# @, P+ U7 w6 _3 o  [9 _

8 z0 ]8 X# Z; ]* D% Recover bit stream by placing reconstructed frequency domain data in series7 b% N$ B  w) f8 O& l) N3 c2 W
recv_dechunked = zeros(1, num_chunks*num_carriers);
+ B4 ^0 y0 B& U4 c% d9 Q+ _/ rfor i = 1:num_chunks
0 n; |; J! {( l; E! J' Q        for k = 1:num_carriers# L; m( B/ }! ~" y6 @9 y
                recv_dechunked(k + (i-1)*num_carriers*2) = real(recv_chunks(i,k));. ?3 w% }6 O7 [" \
                recv_dechunked(k + (i-1)*num_carriers*2 + num_carriers) = imag(recv_chunks(i,k));
5 o8 I4 K' `2 T' Z  _        end
& H1 R4 b2 Z; {6 l; j. B2 cend
  W" i) |5 x( o3 u( ~5 V% h5 v7 n' O# [5 a& z2 d% V
% take out trailing zeros from output --> output
8 Z' L5 ?8 `! U8 [output_analog = recv_dechunked(1:data_length);, e& Z+ {# I* C1 q- |1 ?2 _
output = sign(output_analog);! A4 _3 V, M& Y) z3 i0 z  F* Q
  W8 ^( ]1 \) b, R6 H
3.3.3 %write               %save received data
& ], g! H" D6 W; b+ ~% write
6 j; F" L; h9 A  ~( [* Q- `% ******************TEST OUTPUT*********************************
# _4 J# [3 ?/ k4 qif input_type == 1
! z3 L0 r. p3 X' f) z# w7 E# S' V        if test_input_type == 1; g; t! \% f- m
                %already binary - do nothing5 v" V5 C3 Q- e# I  X6 v
        end9 m2 M2 J" n! {' w: C
        4 f" d! v& f* q2 r6 s
        if (test_input_type == 2) | (test_input_type == 3)
4 O- A$ F% ]  n( G; h: ~+ g                %random input     OR     sine wave samples9 S9 ^! P2 H6 o8 i' g0 `+ M* z
                output_samples = zeros(1,floor(length(output)/8));  %extra zeros are not original data
$ Y: Q" Z2 d: U9 f: C                for i = 1:length(output_samples)) G) }* B& b6 [. ?4 C; Q2 W
                        output_samples(i) = bin2eight(output(1 + (i-1)*8: (i-1)*8 + 8));9 N1 n" x, \. v- Y9 T
                end/ [6 l: {, w! x' v( p  S8 z
                if do_QAM == 1
" J# e, {1 K: F                        QAM_output_samples = zeros(1,floor(length(QAM_data_out)/8));
, X- F6 V0 y; X7 U2 J6 A; Y                        for i = 1:length(QAM_output_samples)
& z/ N" }  i) ~9 Q                                QAM_output_samples(i) = bin2eight(QAM_data_out(1 + (i-1)*8: (i-1)*8 + 8));
8 N* I8 C" p/ y* p                        end  C0 @+ H3 [( |/ G( H: [$ v
                end1 `2 n" }, [' \# P( V" ]
        end
9 E0 R2 U5 L" l+ X. r5 N1 H" n: N% Wend
& P3 L8 w% g5 X. E$ D/ ?$ ~
' q- T! s8 O6 R. J) v- N- H% ******************FILE OUTPUT*********************************
8 U8 c, P4 X6 d* f" yif input_type == 22 K; B- p% _8 g* h3 Z' `) Q" a

' q, S1 `, A  a. d        if file_input_type == 1* g- u6 C4 N7 \: w& {: i4 f6 P
                %binary file output - not implemented2 p- `. P# O! {3 }) y# _
        end' b! u2 B6 O& k$ v! H
& N: P0 F/ f9 l# Q
        if file_input_type == 2
; j0 a" p9 h5 Q& E6 g' t                %text file output# F& [5 H4 v. @8 J  N
                output_samples = zeros(1,floor(length(output)/8));  %extra zeros are not original data; \( Z) z$ ]# ^1 j/ Y1 a
                for i = 1:length(output_samples)% ~& j7 e5 E8 F$ F
                        output_samples(i) = bin2eight(output(1 + (i-1)*8: (i-1)*8 + 8));+ l- P' P1 T+ t8 R  ^8 ?% \
                end, D1 N1 P; G8 y: ?5 J+ H6 s
                file = fopen('OFDM_text_out.txt','wt+');
& J& M* M( s" q7 V; j$ A2 E" A                fwrite(file,output_samples,'char');
8 A% P% v$ _- S' i3 L0 {9 `$ d4 ^                fclose(file);  Q4 W4 C5 p$ t% j7 z
( F* `2 M( h! [* J
                if do_QAM == 1
' N, w. O2 F# h/ d+ ~* z7 ~3 e                        %extra zeros are not original data
1 n' R' Z! D% @6 k# s; x2 Q  u                        QAM_output_samples = zeros(1,floor(length(QAM_data_out)/8));  
( V: w+ ]. ~% E0 g1 ?/ Y  X! F) y                        & a7 d6 e# H& [3 a' q
for i = 1:length(QAM_output_samples)
8 H  Y, }- T1 V  u& q                                QAM_output_samples(i) = bin2eight(QAM_data_out(1 + (i-1)*8: (i-1)*8 + 8));/ a" C5 [2 M# c) x+ e  f$ \
                        end6 j( z- i" L, `: n7 h8 p6 L
                        file = fopen('QAM_text_out.txt','wt+');; ~% H% l$ V$ U; Z( H8 R
                        fwrite(file,QAM_output_samples,'char');0 L) d6 G0 e+ @% _2 r  P
                        fclose(file);
3 C  w6 x' j% g& M. r                end  _+ N* f; j: c8 }
        end
7 s5 A  `+ {. k) _+ l! J
* i- ~  v( Q6 y) s4 B( \( Z$ y2 A        if file_input_type == 3
' y  {% p6 d# i3 Z                output_samples_big = zeros(1,floor(length(output)/8));  %extra zeros are not original data
, W) T, |. Q- G5 ~, i                for i = 1:length(output_samples_big)
" E6 @8 S5 W, `3 W" }+ g8 a  T                        output_samples_big(i) = bin2eight(output(1 + (i-1)*8: (i-1)*8 + 8));- A; L5 |6 C1 c9 v* q+ Z* V
                end+ S, l; w" k  P+ A
                %convert dynamic range from 0:255 to -1:18 q0 L, F  R" @5 v
                output_samples = (output_samples_big-127)/128;
) ?# Z! g1 H& O* P: B- I( q                %sound file output& M2 r2 l5 z6 {" {
                wavwrite(output_samples, 11025, 8, 'OFDM_out.wav')3 Y$ ~! L- d' m% t9 F
                if do_QAM == 1& h  t! l+ U1 j* u# J+ h$ L0 ?
                        QAM_data_out_big = zeros(1,floor(length(QAM_data_out)/8));
' c6 {1 u6 d0 }  w# u) T                        for i = 1:length(QAM_data_out_big)/ s6 f0 F0 ^7 U4 Q7 ^
                                QAM_data_out_big(i) = bin2eight(QAM_data_out(1 + (i-1)*8: (i-1)*8 + 8));
* Q5 t5 g/ O0 e2 D- T3 F# u                        end
; B9 n% _, M5 c# H                        %convert dynamic range from 0:255 to -1: 1& D9 e+ Q5 n) |
                        QAM_output_samples = (QAM_data_out_big-127)/128;
8 g3 C  Y! x+ e* j0 X- ]8 h                        %sound file output9 c; Q  }5 u0 s3 J' m* a8 X3 r/ Q- j! p
                        wavwrite(QAM_output_samples, 11025, 8, 'QAM_out.wav')
' p1 M0 r: M6 V                end) V" @( e1 G/ i( P( E, q& x( I
        end
2 V$ n/ R3 |0 b9 L( W        + T( [: s2 G3 f
        if file_input_type == 4
8 y7 f$ _$ \9 l% `7 P6 U6 ]                %image file output - not implemented               
7 g% h* |& ?( p% G# X8 T. D5 T        end3 Q' U, j$ d  ~) ?/ w! J* O1 m8 G
end  g! z7 s/ t+ ~, d* G  r6 p

! X( x, N3 v, [3 G3 k- }8 ]4、%Analysis.m7 g6 Z+ s# ~* l9 i0 F9 Z
% Analysis
: s; Y* Q8 x, H2 Tdisp(' '), disp('------------------------------------------------------------')
- ^; y( T6 b2 _- Q6 Ldisp('Preparing Analysis')
) q/ \; N& q: N# x  ^$ c$ k, m5 Sfigure(1), clf: i$ f& `( n- e# Z, T
if (input_type == 1) & (test_input_type == 1)9 z$ V$ d  p  `( y9 a5 P9 ~8 K
        subplot(221), stem(data_in), title('OFDM Binary Input Data');  P& C/ B5 P4 \* V" P* V
        subplot(223), stem(output), title('OFDM Recovered Binary Data')
- K0 U' |) L; o3 b9 x" u0 felse% q$ M3 A* j& }8 O! s
        subplot(221), plot(data_samples), title('OFDM Symbol Input Data');0 e3 z5 W( p! p
        subplot(223), plot(output_samples), title('OFDM Recovered Symbols');
9 L3 u0 ?8 A- Iend
: z; T. Z3 t6 m/ m8 n% asubplot(222), plot(xmit), title('Transmitted OFDM');
3 @. c$ s, Q4 @( Ysubplot(224), plot(recv), title('Received OFDM');) h" N. u; a  I/ R& n  h

; W  n+ ?# S6 |$ @+ t9 {: v9 _9 q( O. B, ?* l
% dig_x_axis = (1:length(QAM_tx_data))/length(QAM_tx_data);3 u6 T7 P! \6 J; d  m" ?0 a
%         figure(4), clf, subplot(212)
0 q2 V6 }0 Q( o" {+ @%         freq_data = abs(fft(QAM_rx_data));
- W3 d4 Z! f$ G) s7 w4 x; [6 p%         L = length(freq_data)/2;
0 u1 i$ c# ^% t        9 [% J, M8 J, v: r5 E
dig_x_axis = (1: length(xmit))/length(xmit);: e1 o8 \$ S' W( T" s1 X% T# Z
figure(2), clf
6 R& A- R1 S& |# Q" F" C( d) q# j, s) ]. M$ L
if channel_on ==1  i& d# X; D# X+ O# t, r
        num = [1, zeros(1, d1-1), a1, zeros(1, d2-d1-1), a2];
% B( }( ~7 x% X* \        den = [1];1 ?; u' R; b, `" Q6 v
        [H, W] = freqz(num, den, 512);
  Y- I/ ?0 N' o$ u: {4 f, q: e        mag = 20*log10(abs(H));2 C; Q; ]& W. p6 i% ~6 M
        phase = angle(H) * 180/pi;: ^2 Y2 n6 D" l
        
- v+ l5 x0 V9 [: b! h+ r        subplot(313)3 Y. ^1 O& ~4 I+ P2 b- N
        freq_data = abs(fft(recv));
% M* |( G/ M' i/ @5 W        L = length(freq_data)/2;  ~, n- [" O& a, p/ z
        plot(dig_x_axis(1: L), freq_data(1: L))
1 q9 X5 l0 m  E1 a6 j4 S2 J& W        xlabel('FFT of Received OFDM')0 G( R: O0 B/ ~. X/ @( J( f% c
        axis_temp = axis;
0 D. v$ K$ c: v# ^  s        % d0 m. |! h! b1 p+ ?/ _# m2 p. V
        subplot(311),
- }/ B  y/ F8 G. K4 v- R        freq_data = abs(fft(xmit));
+ Q9 |2 y. a/ }- ]7 x        plot(dig_x_axis(1: L), freq_data(1: L)), axis(axis_temp)
6 a" H, q( }: ]) D/ `        title('FFT of Transmitted OFDM')7 B- R* n6 Z' V7 y
        
& n8 G! u! R1 ^/ D! n1 k# X        subplot(312)
' ]0 k0 L4 S$ a        plot(W/(2*pi),mag),
$ h( G0 U( ]! ~$ {0 w        ylabel('Channel Magnitude Response')
5 v. @+ d# ?% d( w2 c/ D! `3 nelse. p7 E' _$ U' q7 q9 Z2 L
        subplot(212)        
3 ]+ H% ^" e( ]# P5 C        freq_data = abs(fft(recv));* P, F+ ~7 W- y) Z. z( b3 v; }
        L = length(freq_data)/2;
# j. k/ E4 l9 G" p* c1 \2 E6 l        plot(dig_x_axis(1: L), freq_data(1: L))
3 D& [, B# j" c: R        xlabel('FFT of Received OFDM'); L/ F8 w5 I) T% n
        axis_temp = axis;2 Q4 V$ t/ I0 w! v% M# x5 H
        3 a4 P$ ]+ _0 B) w
        subplot(211),
' H* i' C/ _' u6 F2 M; d        freq_data = abs(fft(xmit));
- `. s, v8 x. K* P) |" H) A6 t9 ?3 E        plot(dig_x_axis(1: L), freq_data(1: L)), axis(axis_temp)
: c: t1 q4 x0 d4 k2 M" v        title('FFT of Transmitted OFDM')# i+ \8 B# l3 q2 |- w6 t
end
. ]+ l7 N5 O9 P5 V# S" Y2 G
+ r/ Z) A$ Q* h0 _- C: G% if file_input_type == 4
0 }+ U; ~, D7 o; Q$ U% ?/ ~%         figure(5)2 O, u$ b& Z7 ?$ v9 `. A
%         subplot(211)
1 _0 ^6 |# G* _6 S%         image(data_in);, P, V0 Z# v6 c) {3 ]
%         colormap(map);
0 |! V/ ]* v2 I! ^1 l$ \6 u! w%         subplot(212). e1 t2 n  O! f4 r4 P
%         image(output);4 \& l7 j2 s" i2 t7 O0 u) Y+ L
%         colormap(map);
! w5 |; R- I/ |( m% o# C% end
* R% h$ _  p) q) A# b+ C) e- m* H! G- m
if do_QAM == 1         % analyze if QAM was done
1 m# h- x# r# \/ F0 @3 s+ v# [8 O        
7 [" o6 ]/ Z! ^1 M3 `        figure(3), clf
& V0 G# p% j& F  }8 |        if (input_type == 1) & (test_input_type == 1)( `3 T1 ~$ E8 |1 y
                subplot(221), stem(data_in), title('QAM Binary Input Data');4 N' M$ E& v( c& D2 H, J
                subplot(223), stem(QAM_data_out), title('QAM Recovered Binary Data'), d% h* z* w+ F6 |1 \& K- @
        else2 g# J4 \: Y  N
                subplot(221), plot(data_samples), title('QAM Symbol Input Data');
# G: H% |! B. I# u  N3 r! \7 b8 i% W" t# C                subplot(223), plot(QAM_output_samples), title('QAM Recovered Symbols');1 m& }( P0 W8 D: S6 r
        end
2 d8 P0 k5 u& q) A        subplot(222), plot(QAM_tx_data), title('Transmitted QAM');
# d! A7 N! }& l  B% D        subplot(224), plot(QAM_rx_data), title('Received QAM');
1 t- g/ L& u; Y9 {; b- r        
( \% Q/ t$ {2 g' `7 s) B        dig_x_axis = (1: length(QAM_tx_data))/length(QAM_tx_data);
8 Z! U3 z$ V7 G        figure(4), clf
: l5 K6 ^& b8 U8 O        
' g5 {0 G' z( M7 T        if channel_on ==17 |& j8 ]) o' e8 k; Y
                subplot(313)
7 ?- S; W- q& {1 I* Y* E8 F# {, A  X                freq_data = abs(fft(QAM_rx_data));
/ ?2 J1 p! h4 m+ C! ?                L = length(freq_data)/2;
* |3 D) `4 m3 y" I2 I                plot(dig_x_axis(1: L), freq_data(1: L))
8 L( V" _( G( y% r; Y) w3 x                xlabel('FFT of Received QAM')- A8 a. a* d0 F/ a7 S/ ~
                axis_temp = axis;
# y8 I' O4 R- r+ V. G               
$ K3 _2 x: v" o* k3 d                subplot(311),
5 i7 k' I' s' R! M% K' U                freq_data = abs(fft(QAM_tx_data));/ r3 }1 U/ B' r1 I
                 plot(dig_x_axis(1: L),freq_data(1: L)), axis(axis_temp)
' p( C) m7 C3 o% S) Q6 d* Y* d                title('FFT of Transmitted QAM')
- W2 x8 g$ @3 Z5 m1 o* K# q               
9 v  P8 r* E/ p7 f. f                subplot(312)
# \" m# ?& q+ d. r$ B' M                plot(W/(2*pi),mag)
: N: ?/ B1 T% y9 j& ~                ylabel('Channel Magnitude Response')
4 N& [* b6 m( B* p$ {! f        else
) k( V/ N! U/ l6 _2 z  r                subplot(212)
8 [4 i7 e8 H9 ?2 d! K2 Y# W                freq_data = abs(fft(QAM_rx_data));. J) F: r/ L' z: l2 X
                L = length(freq_data)/2;
. \% c& |* Z$ \/ r& Z% a& {                plot(dig_x_axis(1: L), freq_data(1: L))
" @- b( y6 `* u- H0 C7 a  X/ i                title('FFT of Received QAM')9 F. e/ r. a( T2 c# T& B. n
                axis_temp = axis;, \# F& E7 r2 {& o
               
, K% _! \* B( J2 k9 b& j# U                subplot(211),$ D: O" l. Y5 q: @3 {$ N' d
                freq_data = abs(fft(QAM_tx_data));" G! l4 B. `) v6 A$ S
                 plot(dig_x_axis(1: L),freq_data(1: L)), axis(axis_temp)2 a0 t* L4 O6 M5 j! s& g
                title('FFT of Transmitted QAM')! G9 j1 l" [/ Y$ J2 b
        end" t) l9 E( r. N1 p
               
* e6 b0 \4 f+ g  u2 p5 ?7 t; F        % Plots the QAM Received Signal Constellation
1 P: b; ^8 S6 H, A8 i' B1 F        figure(5), clf, plot(xxx,yyy,'ro'), grid on, axis([-2.5 2.5 -2.5 2.5]), hold on
2 C1 c9 d* T: ?# V+ w; W* L- l9 }+ x) @
%         % Overlay plot of transmitted constellation6 T! f+ O; Z% N3 ?2 ^) Q* t* ^/ W
%         x_const = [-1.5 -0.5 0.5 1.5 -1.5 -0.5 0.5 1.5 -1.5 -0.5 0.5 1.5 -1.5 -0.5 0.5 1.5];
4 g: r) [( H5 W7 Y! H%         y_const = [-1.5 -1.5 -1.5 -1.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1.5 1.5 1.5 1.5];; B! S; R8 }1 }6 r, N8 ~
%         plot(x_const, y_const, 'b*')3 `2 f$ l* j  f/ e2 E
& O+ X7 g9 c- [
        % Overlay of constellation boundarys+ t& c; |: h% ?  ^
        x1 = [-2 -2]; x2 = [-1 -1]; x3 = [0 0]; x4 = [1 1]; x5 = [2 2]; x6 = [-2 2];0 \# `. C# @, D
        y1 = [-2 -2]; y2 = [-1 -1]; y3 = [0 0]; y4 = [1 1]; y5 = [2 2]; y6 = [-2 2];6 \1 P" a( R$ u. k! F, ]1 Y
        plot(x1,y6), plot(x2,y6), plot(x3,y6), plot(x4,y6), plot(x5,y6)
5 x  Y; y: n% {        plot(x6,y1), plot(x6,y2), plot(x6,y3), plot(x6,y4), plot(x6,y5)        6 l2 i( F: x( p9 K) H; _
$ G7 N4 G# ]# t
        hold off
/ k& H. a0 Q1 j$ t/ \% Y        title('16-QAM Received Signal Constellation and Decision Boundarys')) F, c9 u! C! |: I7 C6 K
        ! I; J* h, w9 J; ]
        binary_err_bits_QAM = 0;; q9 h7 u$ l8 U1 m* Q
        for i = 1:length(data_in)7 }: [. v. e: H3 B7 H
                err = abs(data_in(i)-QAM_data_out(i));: p8 @. F2 z& R. Z9 k: t: h
                if err > 0! c0 e5 K3 f0 j& ^2 B
                        binary_err_bits_QAM = binary_err_bits_QAM + 1;
: Q) y' O6 _/ g# O, r! ]: V                end
! B" x" J( A8 V+ Z        end
0 P) c% ^: m; j: u        BER_QAM = 100 * binary_err_bits_QAM/data_length;
) F# X  I: P( W2 i9 u# send0 |3 B+ x3 z4 }  H, {% `% {

3 P$ h; t3 s( X, d/ _figure(6), clf& J! N4 z4 E- K4 d5 p0 r
if channel_on == 1
4 q( b+ O" H# o$ f+ ~# ]* h: c        subplot(211), plot(W/(2*pi),mag),title('Channel Magnitude Response')% k( l2 N1 F8 @$ X1 O* M6 @6 ^
        xlabel('Digital Frequency'),ylabel('Magnitude in dB')3 J$ [. M' q! O0 y
        subplot(212), plot(W/(2*pi),phase),title('Channel Phase Response')- W+ N  ^! S4 `( G/ ^7 W
        xlabel('Digital Frequency'),ylabel('Phase in Degrees')
5 p3 W; I( c  b( felse
* y: D! i& R! n        title('Channel is turned off - No frequency response to plot')* P4 Y" y0 v- m
end
: X  c$ A. z. [: y& D* }" A7 K" D/ b% Y! p$ H1 R3 C' _& C* ^2 {# l" x
% Compare output to input and count errors
. w* h# t7 P7 G9 w4 E  ]binary_err_bits_OFDM = 0;, c) g2 i8 ^4 v  q' F2 I' g: a
for i = 1:length(data_in)* |) g& d* `3 u2 r0 Y
        err = abs(data_in(i)-output(i));, ^3 ]2 V0 _  }5 T
        if err > 0
' d0 I2 i2 d2 W+ D, ?' Q                binary_err_bits_OFDM = binary_err_bits_OFDM +1;. J6 Q6 M4 c' @" H& F- @
        end$ y  O9 V0 T( e% `6 ?
end  ~# j2 R- f4 P# o8 }  t# @2 V
BER_OFDM = 100 * binary_err_bits_OFDM/data_length;. H8 N! U7 u4 E( |/ e
disp(strcat('OFDM: BER=', num2str(BER_OFDM,3), ' %'))( J# }0 L* {" t% G
disp(strcat('      Number of error bits=', num2str(binary_err_bits_OFDM)))9 z0 G3 ~8 d/ L$ u' x/ G

8 u) I# c- Y( gif (do_QAM == 1)
& {$ I; B( `" f! i4 v7 y1 j& r        disp(strcat('QAM:  BER=', num2str(BER_QAM,3), ' %')), {/ N% x* W" r; z6 U5 h/ d9 @* S
        disp(strcat('      Number of error bits=', num2str(binary_err_bits_QAM)))
0 M4 B6 v2 ~! f! Y2 e4 V! f4 iend# N2 c! \* E1 l: n2 v0 `

( P, _8 C6 V2 X1 N/ Z, |/ i% Display text file before and after modulation5 U, W4 c& V# |; r/ p6 W5 N, G
if (input_type == 2) & (file_input_type == 2)- J8 O. E# ?  H( D+ c; I! n
        original_text_file = char(data_samples')
7 y, w7 p9 I# R% H/ e        if do_QAM ==1
& I- ]" w/ \1 t  ?6 T5 a" G! X% E                edit QAM_text_out.txt6 f) S6 A. a& v* U( W% V9 `! i
        end
% }  u; i. r# _' L: M        edit OFDM_text_out.txt1 c0 T& O: a  M* o" \0 i3 v
end
7 c3 N# V: U1 N6 L  x8 @7 B( ]8 @! M: X$ x1 g" ?  C
% Listen to sounds% K9 i8 c6 m. H2 z* _) O! c7 d# _
if (input_type == 2) & (file_input_type == 3)
$ m, j4 ~. O( d- e) O0 Y. j        do_again = '1';' s& U7 M& J- J: {4 E3 g
        while ( ~(isempty(do_again)) ), d* C7 K. V3 u( f, ~
                disp(' ')0 y# o( C: B$ a4 i" c1 T0 Q3 P1 C
                disp('Press any key to hear the original sound'), pause
6 Y! [3 T  n, h) R                sound(data_samples,11025)
  z5 L5 b. T) P) y4 I  L                disp('Press any key to hear the sound after OFDM transmission'), pause4 L; N8 H6 H7 B. q0 K% V; |! E' g
                sound(output_samples,11025)
$ r; N2 o, o! S8 s0 o1 K                if do_QAM == 1" d' C) N- K" q# |2 M) o- O
                        disp('Press any key to hear the sound after QAM transmission'), pause8 @7 o  [  b* X: A6 n
                        sound(QAM_output_samples,11025)8 w  R* e  F5 C9 U1 A' }5 m9 b
                end
* `3 S/ [( \4 {, `" ?                do_again = '';; B% G" w. I4 t% }5 N3 \8 H: t
                do_again = input('Enter "1" to hear the sounds again or press "Return" to end  ', 's');
( `8 k6 w3 }* {$ f        end
3 Y9 n  ~$ Z  B+ s! ^, @+ Q* Jend
6 n6 a- c9 f) u3 [: k' ~
/ e: P0 L, G7 O, C$ n# q. j3 Y! S8 _" Q1 ~: X+ u

作者: YNhhU    时间: 2020-4-20 16:03
有详细的WORD说明最好了,怕我看不懂。
作者: xuzwg    时间: 2020-4-21 13:55
看看楼主分享的OFDM的仿真程序。




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2