OFDM理解与matlab代码

1、相关概念

基带。信息源,也称发射端,发出的没有经过调制(进行频谱搬移和变换)的原始电信号所固有的频带(频率带宽)。 
频带。对基带信号调制后所占用的频率带宽。 
带宽。一个信号所占有的从最低的频率到最高的频率之差。 
频谱搬移。频谱搬移是指在发射端将调制信号从低频端搬移到高频端, 便于天线发送或实现不同信号源,不同系统的频分复用。

2、OFDM数学描述
在复基带上的在时间段上的OFDM信号x(t)可由下式描述:

 

[反正看不懂]
2.1
可将该复指数理解为[2]中提到的随着时间tt在复平面做螺旋线运动的波形(复频域),它可作为OFDM中的子载波(共Nc个),每个子载波的频率为kΔf(k为第k个子载波,为子载波的序号, Δf为各子载波的频率间隔)。因为它们具有正交性: 

[从时域看] 
从时域上看,该式子对应的是cos(j2πkΔft)(欧拉公式,毫无我个人理解的根据),周期为Tu,开始于时间0。 

è¿éåå¾çæè¿°


[从频域看] 
时域的子载波相当于其在整个时域与一个周期为Tu、开始于0、幅值为1的矩形波相乘。时域乘法对应于频域卷积:整个时域上的余弦函数的频谱为一个冲激(如cos(t)的频率为),矩形窗的频谱为sinc函数(sinc(2π)),两者卷积可得每子载波频谱(度婆卷积,然后可用笔算得到:sinc函数频谱搬移到冲激处)。 

è¿éåå¾çæè¿°


为了看得清楚,不与时域的周期一致,将周期缩小一倍后的子载波频率图如下。 

è¿éåå¾çæè¿°

 


[请自动脑补傅里叶变换后得负频率 – 反正我还没脑补过来(唯有用螺旋线逆时针、顺时针旋转自圆其说)]

1.2
a(m)kak(m)代表PSK/QAM符号[参考OFDM符号ofdm_signal“1 映射”部分(挑对的看)]。

1.3 叠加
(子)载波:是一个特定频率的无线电波(某段频率内的波),是一种可用于传递(携带/表示)信息的波。 
符号携带在第k个子载波上。


将所有复数信息携带后叠在一起形成OFDM符号。
[解析OFDM符号时,因为各个子载波的正交性,在OFDM符号上乘以一个,再在OFDM相应周期内积分就可得到第k个子载波上携带的信息

1.4 总结
[1] 子载波:各子载波正交;各个子载波的频率相差1/Tu,Tu为OFDM符号的周期;各子载波的频谱有重叠,但因为子载波的正交性并不会使得子载波间有干扰,所以(载波频率重叠)比起频分复用,能够提高频带利用率。 
[2] 子载波上的信息:子载波上的信息为PSK/QAM符号,是一个复数,它是源数据元素的一个映射。

3 OFDM符号的生成与解析
用以下简单的框图描述OFDM符号的生成与解析过程。(相应的经简易化的matlab仿真代码见附4) 


3.1 generate data source
如生成以下数据:tx_data_source = [1 3 3 3 2 0 3 3]

3.2 generate PSK/QAM symbol
PSK/QAM符号是用来分别表示这些数据元素的一个复数。(参考链接的第一部分)

3.3 generate OFDM symbol
序列作为ifft的输入就可得到一个子载波数量为Nc的OFDM符号。

除了可参考[1],[3]外(无自己的理解),还可以在matlab中做个小小的证明。当Nc=8Nc=8且以等间隔1/Tu取子载波的样点时,得到的结果跟ifft的变换矩阵(由conj(dftmax(8)求得)一样。这说明ifft首先会等间隔的频率差计算各个子载波的值,然后再将各个复数信号加载(乘)到相应的子载波上,最后求和得到OFDM符号。

3.4 get PSK/QAM symbol
从OFDM符号上提取各个子载波上携带的信息,即在OFDM符号上乘以一个再在该OFDM符号所在周期内作定积分就可以得到第k个子载波上的信息。这个过程由的fft变换统一完成。

3.5 get data source
原来的数据经过PSK/QAM映射成为了一个复数,这一步的工作就是根据PSK/QAM符号作映射的逆操作而得到相应的数据。

4 总结
[1] 依旧不懂傅里叶(逆)变换的计算过程。 
[2] 一下子就接触OFDM,好陡。

参考
[1] 4G: LTE/LTE-Advanced for Mobile Broadband Second Edition – “CHAPTER 3 OFDM Transmission” 
[2] 如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】 
[3] OFDM for Wireless Multimedia Communications - R. van Nee, R. Prasad - Artech House, 2000.pdf [2.2]

附[1] 绘制OFDM子载波在时域中的波形
 


   
   
   
   
  1. % subcarrier_time_domain.m
  2. % 绘制OFDM的Nc个子载波在时域上的波形
  3. % 参考资料: 4G: LTE/LTE-Advanced for Mobile Broadband Second Edition – \
  4. % “CHAPTER 3 OFDM Transmission”,理解e^(j * 2 * pi (k / T)t )对应的时域部分
  5. % 最后修改时间 2016.07. 30
  6. clear
  7. Tu = 2 * pi; % OFDM周期
  8. st = 0. 0; % OFDM符号开始时间
  9. sp = 0. 01; % 从OFDM的开始时间到结束时间的步长
  10. ed = Tu + st; % OFDM符号的结束时间
  11. t = st : sp : ed; % x
  12. fn = 0;
  13. fn = fn + 1;
  14. figure(fn);
  15. plot(t, cos( 0 * t), t, cos( 1 * t), t, cos( 2 * t), t, cos( 3 * t)); % 子载波Nc = 4
  16. grid on;
  17. xlabel( 't');ylabel( 'A');
  18. title([ 'N_c = 4, T_u= ', num2str(Tu)]);

[2] 绘制OFDM子载波的频谱波形


   
   
   
   
  1. % subcarrier_frequency_domain.m
  2. % 绘制OFDM子载波的频谱
  3. % 首先理解“频谱”的含义
  4. % 然后理解OFDM子载波时域波形定长周期中的频谱:
  5. % [ 1] 余弦函数的频谱(率)为一个冲激,定周期的余弦函数相当于在时域乘以一个矩形窗
  6. % [ 2] 矩形窗的频谱为sinc函数(未用fft变换来求,而是直接写出了周期为 2pi或pi的矩形窗函数函数的频谱函数sinc( 2pi)和sinc(pi))
  7. % [ 3] 时域乘法相当于频域卷积
  8. % 最后修改时间 2016.07. 31
  9. clear
  10. Tu = pi; % 2 * pi
  11. fx = 3 * Tu; % 用来显示子载波频谱的频率轴的长度
  12. sf = 0;
  13. sp = 0.01; % 频率变化的步长
  14. f = sf - fx / 2 : sp : fx / 2; % 自动脑补傅里叶变换后的负频率的出现(请教一个真正懂负频率出现的人)
  15. z = zeros( 1, length(f));
  16. fn = 0;
  17. fn = fn + 1; % 当要绘制多图时方便计数
  18. figure(fn);
  19. % 周期为T的矩形窗的频谱函数为sinc(T * x)
  20. plot(f, z,f, sinc(Tu * f + 0), f, sinc(Tu * (f - 1 / Tu)), f, sinc(Tu * (f - 2 / Tu)), f, sinc(Tu * (f - 3 / Tu))); %, f, sinc(Tu * (f + 3 / Tu)), f, sinc(Tu * (f + 2 / Tu)), f, sinc(Tu * (f + 1 / Tu)),
  21. grid on;
  22. xlabel( 'f');ylabel( 'A');
  23. title([ 'N_s = 4, T_u= ', num2str(Tu)]);

[3] 子载波抽样值

 


   
   
   
   
  1. % subcarrier_sample_value.m
  2. % 参考资料: 4G: LTE/LTE-Advanced for Mobile Broadband Second Edition –
  3. % “CHAPTER 3 OFDM Transmission”
  4. % 等间隔计算各个子载波上的离散值
  5. % 子载波数Nc = 8,
  6. % 取样点Ns = 8,每隔 1取一个样点
  7. % 最后修改时间: 2016.07 .30
  8. clear
  9. Nc = 8; % 子载波数目
  10. Nt = 8; % OFDM周期,同时以 1为单位在子载波上取样点值
  11. ts = 1; % 每个子载波开始的时间
  12. myifftmtx = zeros(Nc, Nt);
  13. for m = 1 : Nc % 第m个子载波
  14. for t = ts : Nt % 在周期Nt上以 1为单位等间隔取样
  15. myifftmtx(m, t) = exp( ( 1i * 2 * pi) * ((m - 1) / Nt) * (t - ts));
  16. end
  17. end
  18. ifftmtx = conj(dftmtx( 8));
  19. % isequal(ifftmtx, myifftmtx) %
  20. % 验证子载波取样点是否与对应的ifft矩阵相同(用眼睛看,一一对照两个矩阵中的元素,两个矩阵是相等的;该函数将它们判断为不等,可能是计算精度或其它的原因^_^)

[4] OFDM符号的生成与解析

 


   
   
   
   
  1. % ofdm_waveform_diagram.m
  2. % @ 仿真ofdm_waveform_diagram_v0 .2.viso描述的基本框图
  3. % @ 参考资料:[ 1] 4G: LTE/LTE-Advanced for Mobile Broadband Second Edition –
  4. % “CHAPTER 3 OFDM Transmission”( 3.3)
  5. % [ 2] OFDM for Wireless Multimedia Communications - R. van Nee,
  6. % R. Prasad - Artech House, 2000.pdf( 2.2
  7. %
  8. % @ OFDM符号参数:
  9. % 为OFDM符号分配的带宽 bw = 10MHz;
  10. % 用于传递信息的子载波数量 Nuc = 600
  11. % 子载波间隔 Delta_f = 15KHz;
  12. %
  13. % @ 由OFDM符号参数的计算:
  14. % OFDM符号所占带宽 Nuc * Delta_f = 600 * 15KHz = 9MHz
  15. % OFDM符号采样频率:采样频率要等于甚至大于OFDM符号频率,以保证对OFDM符号采样的充分(理解采样频率为单位时间采集的数据量),
  16. % FFT/IFFT点数 Nsp = 1024;如此OFDM的采样频率为Nsp * Delta_f = 15.36MHz
  17. %
  18. % @ 文档:ofdm_waveform_diagram_v0 .4.docx;(v0 .1 - v0 .4
  19. % @ 最后修改时间: 2017.07 .31
  20. clear
  21. % -------------------------------- OFDM参数描述 --------------------------------
  22. Nuc = 600; % 用于传递数据的子载波数
  23. Nsp = 1024; % 对OFDM符号的采样点,
  24. %([ 1] 大于等于子载波数量;[ 2] 最好为 2^m,方便fft/ifft运算)
  25. % -------------------------------- OFDM参数描述 --------------------------------
  26. % -------------------------------- 发送端 --------------------------------
  27. % &&&&&&&& generate data source &&&&&&&&
  28. nb = 2; % nb-比特数
  29. n = Nuc; % nb-比特数的个数
  30. tx_data_source = generate_data_source( nb, n );
  31. % &&&&&&&& generate PSK/QAM symbol &&&&&&&&
  32. mod_type = 'psk'; % 映射源数据元素的方式
  33. tx_PSKorQAM_symbol = generate_PSKorQAM_symbol( mod_type, tx_data_source, nb );
  34. % &&&&&&&& generate OFDM symbol(IFFT) &&&&&&&&
  35. Nifft = Nsp;
  36. tx_PSKorQAM_symbol_oversample = ...
  37. [tx_PSKorQAM_symbol( 1 : Nuc / 2),...
  38. zeros( 1, Nsp - Nuc), ...
  39. tx_PSKorQAM_symbol(Nuc / 2 + 1 : end)]; % 过采样,为何将 0加在中间,见[ 2]
  40. tx_ofdm_symbol = ifft(tx_PSKorQAM_symbol_oversample, Nifft); % 将每个数据加载到每个子载波上
  41. % -------------------------------- 发送端 --------------------------------
  42. % -------------------------------- 信道 --------------------------------
  43. % &&&&&&&& Fading channel &&&&&&&&
  44. rx_ofdm_symbol = tx_ofdm_symbol; % 理想信道
  45. % -------------------------------- 信道 --------------------------------
  46. % -------------------------------- 接收端 --------------------------------
  47. % &&&&&&&& get PSK/QAM symbol(FFT) &&&&&&&&
  48. Nfft = Nsp;
  49. rx_PSKorQAM_symbol_oversample = fft(rx_ofdm_symbol, Nfft);
  50. % &&&&&&&& get data source &&&&&&&&
  51. rx_PSKorQAM_symbol = ...
  52. [rx_PSKorQAM_symbol_oversample( 1 : Nuc / 2),...
  53. rx_PSKorQAM_symbol_oversample( end - Nuc / 2 + 1 : end)]; % 去掉过采样数据
  54. rx_data_source = demodulate_PSKorQAM_symbol( rx_PSKorQAM_symbol, mod_type, nb );
  55. % -------------------------------- 接收端 --------------------------------
  56. % 判断OFDM符号的解析是否成功
  57. isequal(tx_data_source, rx_data_source)

 

--------------------- 
作者:最容易害羞 
来源:CSDN 
原文:https://blog.csdn.net/misskissC/article/details/52082662 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(通信X,OFDM理解与matlab代码)