一、概述
本节对MVDR、LCMV、LMS等算法的波束图进行仿真。
二、MVDR代码仿真
2.1 mvdr代码
- clc;
- clear;
- M = 18; % 天线数
- lambda = 10;
- d = lambda / 2;
- L = 100; %快拍数
- thetas = [10]; % 期望信号入射角度
- thetai = [-30 30]; % 干扰入射角度
- n = [0:M-1]';
- vs = exp(-1j * 2 * pi * n * d * sind(thetas) / lambda); % 信号方向向量
- vn = exp(-1j * 2 * pi * n * d * sind(thetai) / lambda); % 干扰方向向量
- f = 1600; % 载波频率
- t = [0:L-1];
- di = sin(2*pi*f*t/(8*f)); % 期望信号
- vn1 = sin(2*pi*2 * f*t/(8*f)); % 干扰信号1
- vn2 = sin(2*pi*4 * f*t/(8*f)); % 干扰信号2
- A = [vs vn];
- St = [di;vn1;vn2];
- Xt = A*St + randn(M,L); % 矩阵形式的公式
- R_x = 1/L * (Xt * Xt');
- R_x_inv = inv(R_x);
- W_opt = R_x_inv * vs / (vs' * R_x_inv * vs);
- % 测试此时的方向图
- sita = 90 * [-1:0.001:1];
- % 得到不同角度的方向矢量
- v = exp(-1i*2*pi*n* d*sind(sita)/lambda);
- B = abs(W_opt' * v);
- plot(sita,20*log10(B/max(B)),'k')
- title('波束图')
- xlabel('角度/degree')
- ylabel('波束图/dB')
- grid on
复制代码 2.2 mvdr波束图
三、LCMV代码仿真
3.1 lcmv代码
- clear;
- close all;
- clc;
- warning off
- %% 初始化
- M = 10; %阵元数
- fs = 5000; % 采样频率
- f = 1000; % 信号频率
- snap = 600; % 快拍数
- T = 0.5; %采样时间
- t = 1/fs:1/fs:T;
- c = 340;
- lamda = c/f; %波长
- d = 0.5*lamda; %阵元间距
- theta0 =-5; %期望信号角度
- theta1 =-30; %干扰角度
- theta2 = 30; %干扰角度
- snr=10; %信噪比
- inr1 =20; %干噪比
- inr2 = 20; %干噪比
- snr_noise = 0; %噪声功率1,为0dBW
- %% 导向矢量
- a0 = exp(-1j*2*pi*d*sind(theta0)*(0:M-1)'/lamda);
- a1 = exp(-1j*2*pi*d*sind(theta1)*(0:M-1)'/lamda);
- a2 = exp(-1j*2*pi*d*sind(theta2)*(0:M-1)'/lamda);
- %% 信号、干扰和噪声
- tar_sig = wgn(1,length(t), snr);
- inf1 = wgn(1,length(t),inr1);
- inf2 = wgn(1,length(t),inr2);
- noise = wgn(M,length(t),snr_noise);
- %% 阵列接收信号
- rec_sig = a0*tar_sig + a1*inf1 + a2*inf2 + noise;
- interference = a1*inf1 + a2*inf2;
- sig = a0 * tar_sig;
- %% 协方差矩阵
- Rx = rec_sig(:,1:snap)*rec_sig(:,1:snap)'/snap;
- Rs = sig(:,1:snap)*sig(:,1:snap)'/snap;
- Ri = interference(:,1:snap)*interference(:,1:snap)'/snap;
- Rn = noise(:,1:snap)*noise(:,1:snap)'/snap;
- %% LCMV算法
- a01 = exp(-1j*2*pi*d*sind(theta0 + 5)*(0:M-1)'/lamda);
- a02 = exp(-1j*2*pi*d*sind(theta0 - 5)*(0:M-1)'/lamda);
- C=[a0,a01,a02];
- f=[1,1,1]';
- w_lcmv =inv(Rx)*C*(inv(C'*inv(Rx)*C))*f; %权系数
- theta = -90:0.1:90; % scan angle
- p = exp(-1j*2*pi*d*(0:M-1)'*sind(theta)/lamda);
- y = w_lcmv'*p;
- yy = 20*log10(abs(y)/max(abs(y)));
- %% 绘图
- figure(1);
- plot(theta,yy,'linewidth', 2);
- xlabel('角度(\circ)');ylabel('归一化增益(dB)')
- grid on;
- xlim([-90 90])
复制代码 3.2 lcmv波束图
四、LMS代码仿真
4.1 lms代码
- clear;
- clc;
- M = 16;
- thetas = [0 30 60];
- lambda = 10;
- d = lambda /2;
- N = 1000;
- n = 0:N-1;
- f0 = 2000;
- s = [1*sin(2*pi*f0 *n/(8*f0));...
- 2*sin(2*pi*2*f0 *n/(8*f0));...
- 3*sin(2*pi*3*f0 *n/(8*f0))
- ];
- % 生成方向矢量
- A = exp(-1i * 2 * pi * d * (0:M-1)' * sind(thetas) / lambda);
- St = A*s + randn(M,N);
- % LMS 算法 开始 进行自适应滤波
- di = s(1,:); % 第一行为期望信号
- u = 0.0001;
- w = zeros(M,1); % 初始化权重向量
- for k = 1:N
- y(k) = w'*St(:,k);
- e(k) = di(k) - y(k);
- w = w + u * St(:,k) * conj(e(k));
- end
- scan_theta = [-89:90];
- beam = zeros(1,length(scan_theta));
- for i = 1 :length(scan_theta)
- % 构造该方向的方向向量
- v = exp(-1i * 2 * pi *d* (0:M-1)'.*sind(scan_theta(i))/lambda);
- beam(i) = abs(w'*v);
- end
- figure;
- plot(scan_theta,20*log10(beam/max(beam)))
- title('方向图')
- figure;
- for k = 1:N
- en(k) = (abs(e(k)))^2;
- end
- semilogy(en); hold on;
- xlabel('迭代次数')
- ylabel('MSE')
- title('MSE')
复制代码 4.2 lms波束图
五、总结
从结果上看,自适应滤波器结果要优于MVDR和LCMV算法,LCMV由于多了零点约束,比MVDR可控性更强。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |