在无线通信中。 无线信道由各种类型的损伤组成,例如延迟扩展、衰落和多普勒扩展等。信道中的多径传播引入延迟扩展,导致 ISI、ICI等等问题,在信号接收端,我们需要进行均衡以减少失真,减轻 ISI 和噪声的综合影响。 因此为了恢复原始信号,使用滤波器,常用基本的滤波器有破零(Zero Forcing,ZF) 和最小均方误差( Minimum Mean Square Error,MMSE)算法。
ZF算法使用一个加权矩阵W消除信道的干扰,根据估计的信道响应H初始化矩阵W
W
Z
F
=
(
H
H
H
)
−
1
H
H
W_{ZF} = (H^HH)^{-1}H^{H}
WZF=(HHH)−1HH
则恢复的信号表示
y
^
=
h
⋅
x
z
^
=
W
Z
F
⋅
y
^
\hat y = h \cdot x\\ \hat z = W_{ZF}\cdot \hat y
y^=h⋅xz^=WZF⋅y^
其中x表示发送的信号,,h表示信道冲击响应,H是估计的信道冲击响应,z表示恢复的信号。
MMSE 均衡原理
略
import numpy as np from numpy.linalg import inv # 此函数基于输入数组生成矩阵,偏移量offset基于输入数组 def generate_square_matrix(arr_data,size,data_offset,datatype): aMatrix = np.mat(np.zeros(shape=(size,size))).astype(datatype) for i1 in range(size): for i2 in range(size): try: arr_index = i2+data_offset-i1 if arr_index < 0: continue aMatrix[i2,i1]=arr_data[arr_index] except: break return aMatrix # 它取一个矩阵并将矩阵的中间列提取到一个数组中 def get_W_vector(inv_matrix, size,data_type): mid_col=size>>1 C_vector=np.zeros(shape=(size)).astype(data_type) for i in range(size): C_vector[i]= inv_matrix[i,mid_col] return C_vector def ZF_equalizer(y,h,size,size_of_input,data_type): ZF_h = generate_square_matrix(h,size,h.argmax(),data_type) ZF_h_hat = inv(ZF_h) ZF_W = get_W_vector(ZF_h_hat,size,data_type) z=np.convolve(y,ZF_W) leftside=size>>1 # print("\nReconstructed signal: \n",z[leftside:leftside+size_of_input]) return z[leftside:leftside+size_of_input] # 发送的信号 x = np.array([3-0.6j, -0.3+0.9j, 0.1 - 1.2j, -0.7+0.2j, 0+0.7j, -0.5+0.5j, 0.1-0.6j, -0.4+0.6j]) # 信道冲击响应 h = np.array([1, 0, 0.3+0.3j]) H_exact = np.fft.fft(h) # 仿真经过信号经过信道 y = np.convolve(x, h) # 滤波器长度 filter_length = 13 ZF_result = ZF_equalizer(y, h, filter_length, x.size, complex) print("原始signal:", x) print("恢复signal:", ZF_result) plt.plot(abs(x)) plt.plot(abs(ZF_result)) plt.ylabel('$|Z|$') plt.grid(True) plt.savefig('signal.png')
发送信号和恢复信号是否一致,通过绘图可以看出,完全一致
仿真过程,需要安装pyphysim,执行pip install pyphysim
import numpy as np from numpy.linalg import inv # 此函数基于输入数组生成矩阵,偏移量offset基于输入数组 def generate_square_matrix(arr_data,size,data_offset,datatype): aMatrix = np.mat(np.zeros(shape=(size,size))).astype(datatype) for i1 in range(size): for i2 in range(size): try: arr_index = i2+data_offset-i1 if arr_index < 0: continue aMatrix[i2,i1]=arr_data[arr_index] except: break return aMatrix import matplotlib.pyplot as plt from pyphysim.util.conversion import dB2Linear from pyphysim.util.misc import pretty_time, randn_c def MMSE_equalizer(x, y, size, data_type): # 计算自相关性 ryy = np.correlate(y, y, "full") # 计算互相关性 rxy = np.correlate(x, y, "full") #从 ryy 和向量 Rxy 形式 rxy 生成矩阵 Ryy Ryy = generate_square_matrix(ryy, size, ryy.argmax(), data_type) Rxy = np.mat(np.zeros(shape=(size, 1))).astype(data_type) # 计算偏移量 offset = rxy.argmax() - (size >> 1) for i in range(size):Rxy[i, 0] = rxy[i+offset] MMSE_C_Vec = np.asarray(inv(Ryy)*Rxy).flatten() result = np.convolve(y, MMSE_C_Vec) leftside = size >> 1 print("发送的signal: ", x) print("接收的signal:", y) print("恢复的signal:", result[leftside:leftside+x.size]) return result[leftside:leftside+x.size] x = np.array([0.73+0.59j, 0.43+1.01j, 0.41+0.3j, 1.24+1.1j, 0.55+0.83j]) SNR_dB = 30 snr_linear = dB2Linear(SNR_dB) noise_power = 1 / snr_linear # 噪声 n = np.math.sqrt(noise_power) * randn_c(x.size) # 信道响应 h = randn_c(x.size) # y_z = h * x + n # MMSE均衡 y_z /= h print(y_z) # 滤波器长度 filter_length = 1 z = MMSE_equalizer(x, y_z, filter_length, complex) plt.plot(abs(x)) plt.plot(abs(z)) plt.grid(True) plt.savefig('signal2.png')