MATLAB:正确估计权重以及如何为恒定模量算法计算 QPSK 信号的 MSE

信息处理 matlab 数字通讯 自适应滤波器 均衡 自适应算法
2022-02-21 02:32:12

我曾问过关于恒定模量算法的概念性问题。我正在实现算法的简单步骤,因为我没有cma()内置模块。

我正在考虑一个有限脉冲响应 (FIR) 系统,其真实系数为h=[10.450.2]. 该算法简要介绍:

un:由输入信号驱动的 FIR 滤波器的输出,s是一个白色高斯信号,通过命令驱动 FIR 过程

s=round(rand(1,N))*2-1; 
u = filter(h,1,s);

我们收到一个噪声信号,它是被 AWGN 破坏的系统的输出。设噪声破坏信号为

xn=hTsn+ηn
构建均衡器

yn=wTxn

要通过梯度下降最小化的成本函数是

J(w)=E[(|yn|21)2]

权重更新方程由下式给出

wn+1=wn2μenynTxn

哪里出错,

en=(|yn|21)

操作员T是转置和假设实信号,没有任何虚数和复数部分。

下面是代码。该算法在权重估计方面没有给出正确的结果。

问题 1:算法返回的估计权重与信噪比的均方误差(以 DB 为单位)的图表给出了相反的趋势,即 MSE 不是随着 SNR 的增加而降低,而是当我重新- 运行程序!!下面是我的意思的图像。第一个数字是正确的,但是使用相同的代码,我再次运行它并得到第二个数字。为什么会这样?我该如何预防? 图。1

图2

我不确定这是否是由于变量的初始化L,滤波器阶数 = 延迟数 = 2。对于以下形式的 FIR 滤波器,有些东西对我来说并不直截了当:u(t)=e(t)+0.45e(t1)0.2e(t2),什么是滤波器阶数、平滑长度和未知权重的数量?有人可以帮忙吗?

   clear all
clc

N = 256;
h = [1    0.45   -0.2];

R2 = 2;

mu =  1.0000e-009;
noisedB  =0;

L=2; % smoothing length L+1
ChL=1;  % length of the channel= ChL+1
EqD=round((L+ChL)/2);  %  channel equalization delay

i=sqrt(-1);

Ch=[1 0.45 -0.2]; %Channel
%Ch=[0.8+i*0.1 .9-i*0.2]; %complex channel
Ch=Ch/norm(Ch);% normalize


skip =1
for l=1:6
i          = 1; 

 TxS=round(rand(1,N))*2-1;  % QPSK symbols are transmitted symbols
%TxS=TxS+sqrt(-1)*(round(rand(1,N))*2-1);
x=filter(Ch,1,TxS); %channel distortion

n=randn(1,N);   % additive white gaussian noise

n=n/norm(n)*10^(-noisedB/20)*norm(x);  % scale noise power
x1=x+n;  % received noisy signal


%estimation using CMA
K=N-L;   %% Discard initial samples for avoiding 0's and negative
X=zeros(L+1,K);  %each vector
for j=1:K
    X(:,j)=x1(j+L:-1:j).';  %y_n = w^T x_n 
end

e=zeros(1,K); 
w=zeros(L+1,1); 
w(EqD)=1;    % initial condition
while i<=K


e(i)=abs(w.'*X(:,i))^2-R2;                  % initial error
   w=w-mu*2*e(i)*X(:,i)*X(:,i)'*w;  % update equalizer co-efficients
    cma_mse_h(l,i)    = sum((w'-h).^2)/3; 
    est_w(i,:) = w;
   w(EqD)= 1;


            i = i+1;


end
noisedB = noisedB + 5;
end 

for ii = 1:6

 Error(ii) = 10*log10(mean(cma_mse_h(ii,:)));
end 

 plot([0:5:25], Error(1:6));
 grid on;
 xlabel ('SNR(dB)')
 ylabel('MSE_h')

第二个问题:真正的 FIR 信道系数不是虚数,只有实数部分。但是,如果我使用实数和复数表示,估计的权重将同时具有实数和虚数。在这种情况下,如何正确计算权重及其 MSE?

1个回答

您的代码揭示了对 CMA 应该实现的目标的许多误解:

  • 你的步长mu太小了;但是请注意,最佳步长只能通过实验找到。
  • 该变量noisedB似乎是接收信号的所需 SNR。信噪比0dB您指定的非常差(噪声与信号一样强),在这种嘈杂的条件下,CMA 无法正常工作。
  • 你有一个频道3抽头,你的均衡器长度也只有3水龙头;这太短了,无法实现任何合理的均衡。
  • 您将 MSE 定义为通道脉冲响应和均衡器响应之间的误差。这是错误的,因为均衡器不应该收敛到通道脉冲响应!均衡器必须均衡通道,即通道和均衡器的串联应该给出纯延迟。

您的代码中还有一些其他小错误,但我没有全部纠正它们,而是向您展示了一个非常简单且简短的代码示例。代码下图显示了误差曲线与符号索引,以及通道均衡器的总脉冲响应。如您所见,它近似于增量脉冲(即没有失真)。信噪比是30dB对于这个例子。如果没有噪音,误差会小很多。对于更差的 SNR,算法变得不稳定。


N = 20000;% # 个符号
h = [1,.45,-.2]; % 信道脉冲响应
h = h/标准(h);
勒 = 20; % 均衡器长度
亩 = .001; % 一步的大小
信噪比 = 30;% 信噪比 (dB)

s0 = 圆形(兰德(N,1))*2 - 1;% BPSK 信号
s = 过滤器(h,1,s0); % 滤波信号

% 在所需的信噪比处添加高斯噪声
n = randn(N,1);
vs = var(s);
vn = vs*10^(-snr/10);
n = sqrt(vn)*n;
r = s + n; % 接收信号

e = 零(N,1);% 错误
w = 零(Le,1);% 均衡器系数
w(Le)=1;% 实际滤波器抽头是翻转(w)!

yd = 零(N,1);

对于 i = 1:N-Le,
    x = r(i:Le+i-1);
    y = w'*x;
    yd(i)=y;
    e(i) = y^2 - 1;
    w = w - mu * e(i) * y * x;
结尾

np = 100; % # 要绘制的 sybmols(将绘制最后一个 np);NP < N!

子图(3,1,1),图(e.*e),标题('错误')
subplot(3,1,2), stem(conv(flipud(w),h)), title('均衡通道脉冲响应')
子图(3,1,3),图(1:np,s0(N-np+1:N),1:np,yd(N-np+1-Le+1:N-Le+1))
    title('传输和均衡信号'), legend('传输','均衡'), axis([0,np,-1.5,2])

在此处输入图像描述