参考文档
通信原理-6.3 - 第3讲 无ISI基带传输特性 Ⅰ-网易公开课
OFDM技术与FDM技术区别_CHANG12358的博客-CSDN博客_fdm和ofdm
图文并茂—FDM、OFDM的区别及优缺点、调制解调过程_Mr DaYang的博客-CSDN博客_ofdm调制和解调过程
LTE关键技术:OFDM和MIMO(四电老陈)_哔哩哔哩_bilibili
英泰移动通信:数通LTE的关键技术(OFDM3)_哔哩哔哩_bilibili
前言
根据一些文献,简单的对OFDM技术做了总结
目录:
- FDM OFDM 区别
- ISI
- ICI
- DFT FFT
一 FDM(Frequency Division Multiplexing 频分复用)
子载波之间有一定的间隔,互不干扰
缺点: 频谱利用率不高
二 OFDM(Orthogonal Frequency Division Multiplexing 正交频分复用)
将高速数据分成若干正交子信道,将高速信道转换为低速子数据流
优点: 频谱利用率高
2.1 总体效果
同一个symbol内,子载波间可以重叠,提高带宽效率。
2.2 总体流程
数据流(时域)->(S/P 串并变换 )->调制(QPSK,QAM)->IFFT(OFDM)
->P/S( (并串变换 ) >符号映射(时域)->插入CP
2.3 算法原理
先把子载波进行调制成正交的子载波(频域。
然后把这些子载波映射到一个符号周期内(LTE 66.67us).
整个流程可以通过IFFT 来实现:
因为离散傅里叶逆变换(时间复杂度)。
为了降低计算的时间复杂度,采样IFFT(NlogN),最终得到的数据
N: 采样点数目,必须为2的N次方,比如2048,1024
(采样点个数)
(最小采样周期)
(最小采样频率)
2.4 正交的解释
一般资料都通过信号系统解释,一个周期内内积为0.
这里通过线性代数,更加简洁:
调制后的信号,标量
原始信号,向量
该channel调制方式
要解码出原始x, W必须可逆,之间必定线性无关
,
三 ISI
如下,由于多径传输问题,在采样窗口2.路径2,路径3,都有来自于
符号1 的干扰,则信号就不能正确的恢复出来。
同一路径,不同符号之间因为采样导致的干扰。
解决方案: 增加时延扩展时间GI(Guard Interval),
同一个路径,符号2 就没有上一个符号信号的干扰了。
四 ICI
解决了符号间干扰,但是因为部分信息丢失,导致不同
导致了ICI(信号间干扰)依然无法解码出发送数据
,解决方案增加CP(循环前缀)
主要思想: 把后面
Y = HS
H依然为可逆矩阵,可以还原出原始的发送数据。
五 DFT 以及 FFT 快速傅里叶变换
5.1 DFT 算法
其中:
5.2 FFT 算法:
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 23 11:32:52 2022
@author: chengxf2
"""
import numpy as np
'''
离散傅里叶变换
'''
def DFT(x,f,N):
real = 0.0
imag = 0.0
for n in range(N):
a = x[n] #当前的x值
real += a*np.cos(f*n)
imag += a*np.sin(f*n)
return np.round(real,2),np.round(imag,2)
'''
离散傅里叶变换
c=complex(3,4)
num.real 该复数的实数部分
num.imag 该复数的虚数部分
N:采样点个数
k: 采样频率
'''
def GetDFT(x,N=8):
for k in range(N):
f = -2*np.pi*k/N
real, iamg =DFT(x, f, N)
dft = complex(real, iamg)
print("\n DFT[%d] "%k, "\t ",dft)
def division(x,N):
even = [] #偶数
odd = [] #基数
for i in range(int(N)):
a = x[i]
if i%2 == 0: #偶数项
even.append(a)
else:
odd.append(a)
return even, odd
'''
快速傅里叶变换
'''
def FFT(x, N=8):
if 1==N:
comp = complex(x[0],0)
return {0:comp}
M = int(N/2)
even, odd = division(x, N)
fft_even = FFT(even,M)
fft_odd = FFT(odd, M)
#print("\n M: ",M,"\t N ",N)
f_dict={}
#这里面的k 值相对于上一层的相差N/2
for k in range(0,M):
#print("\n k:%d \t "%k)
f = (2*np.pi/N)*k
real = np.cos(f)
imag = -np.sin(f)
w = complex(real, imag)
#print("\n *****k: %d****** "%k,type(k), fft_even,fft_odd,k)
f_dict[k]= np.round(fft_even[k] + w*fft_odd[k],3)
f_dict[k+M] = np.round(fft_even[k] - w*fft_odd[k],3)
return f_dict
#x=[1,2]
x =[1,2,2,2,1,1,1,1]
N = len(x)
GetDFT(x,N)
print("\n ---------FFT-----------")
#x= [1,2]
f=FFT(x,N)
for key in range(N):
print("\n FFT[%d] "%key, "\t ",f[key])