当前位置:   article > 正文

常规波束形成——时域与频域常规窄带波束形成、信噪比计算(附代码)

常规波束形成

最近学习了一下《最优阵列处理技术》,应老师要求写一个线性均匀水听器阵列的常规波束形成,由于是初学者,写的可能会有点问题,欢迎大家提出修改建议和指导,写这个主要是记录自己的思考,其次是和初学者进行交流提升。

1. 主要原理阐述

要实现波束形成,首先得了解频率波束响应,波束形成与之息息相关。

1.1 频率波数响应

对于一个水听器阵列,我们要想的得到其对外部信号场的响应,则需要对信号场在空域上进行采样,得到一组信号,表示为:

f(t,p)=\begin{bmatrix} f(t-p_1)\\ f(t-p_2)\\ ... \\ f(t-p_n) \end{bmatrix}

对每个阵元的输出用一个线性时不变滤波器进行处理,该滤波器的冲激响应为h_n(\tau),并对所有输出求和,得到阵列的输出y(t),该过程如下图示:

y(t)=\int h_n(t-\tau)f(\tau,p)d\tau

针对线性阵列,我们用一张图来说明一下:

设均匀阵元排列间隔为d,假如信号平行射入,信号入射角度与端射方向呈\theta角,则可以通过计算知道,相邻的阵元接收到信号的间隔为:

\tau = \frac{dcos\theta}{c}

 设第一个阵元接收到的信号为sig(t),则第二个阵元接收到的信号为sig(t+\tau),以此类推,在理想情况下,第n个阵元接收到的信号为:

sig(t+(n-1)\tau),(n = 1,2,3,..,N)

为了能够还原我们想要的信号,我们可以使用一个延时求和波束形成器,其原理如下:

 式子表示为:

h_n(\tau) = \delta(\tau+\tau_n)/N

也可以写成频域内的简洁形式:

H_T(\omega)=v_{k}^{H}(k)/N

  其中,v_k (k)称作流形矢量,定义为:

v_k(k)= \begin{bmatrix} e^{-jk^TP_0}& e^{-jk^TP_1}& ...& e^{-jk^TP_n} \end{bmatrix}^T

v_{k}^H右上角的H为共轭转置的意思。

 其中:

k^TP_n = \omega \tau _n

\tau_n = -\frac{\mu ^TP_n}{c}

\mu ^T = \begin{bmatrix} sin\theta cos\phi\\sin\theta sin\phi \\ cos\theta \end{bmatrix}

P_n = (n-1)d, (n=1,2,3,...,N)

\omega为信号的频率,\mu为方向余弦,c为介质中的信号传播速度。

为了进一步讲解,我们假设一个基函数,表示如下:

f(t,p) = e^{j{\omega}t}v_k(k)

阵列处理器对一个平面波的响应:

y(t)=\int h_n(t-\tau)f(\tau,p)d\tau

 可以表示为:

y(t) = H^T(\omega)v_k(k)e^{jwt}

在频域内,可以写为:

Y(w)=H^T(w)v_k(k)

定义:

\Upsilon(w) =H^T(w)v_k(k)

 为阵列的频率波束响应。

波束方向图的定义是用入射方向表示频率波数响应函数(在代码中我们使用的角度为60°,可以自行修改)。

2. 代码讲解

2.1 基函数

在代码中,我们沿用基函数:

f(t,p) = e^{j{\omega}t}v_k(k)

v_k(k)= \begin{bmatrix} e^{-jk^TP_0}& e^{-jk^TP_1}& ...& e^{-jk^TP_n} \end{bmatrix}^T

在我们进行频率波数响应推导的时候,细心的朋友应该发现了,信号接收时间间隔\tau的定义即为\tau_n的定义,P_n为位置表示(n-1)d,由于是在处理一个平面波信号,方向余弦\mu仅需取一个方向,这里为cos\theta,故根据\tau_n的定义:

\tau = \frac{dcos\theta}{c}

\tau_n =(n-1) \tau = \frac{(n-1)dcos\theta}{c},(n=1,2,3,...,N)

假设我们的信号为s = e^{j\omega_0 t},其中,\omega_0为信号声源的频率,那么我们现在可以表示每个阵元的接收信号:

s_n=e^{j\omega(t+(n-1)\tau)},(n=1,2,3,...,N)

打开有:

s_n=e^{j\omega t} * e^{j\omega\tau_n}=f(t,p) = e^{j{\omega}t}v_k(k)

该部分代码为:

  1. %% 目标信号生成
  2. f0=300; % 声源频率,Hz
  3. s=exp(1j*2*pi*f0.*t); % 目标复数信号,1 x LEN "1j为复数,1为数字一,j为负数"
  4. as=exp(1j*2*pi*ra*f0*cos(thetas_rad)/c); % 目标驾驶向量,N x 1,驾驶向量=exp(-2*pi*f0*τ*1j*)
  5. snr=40; % 信噪比设置
  6. rx=awgn(real(as*s), snr, 'measured'); % 含加性高斯噪声的水听器输出时间波形实数矩阵,Add white Gaussian noise to signal
  7. x = rx.'; % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N,即接收到的信号

s为源信号,as为流形矢量(也有称驾驶向量的说法),x为得到的输出信号。

注意:正常来讲,我们在进行信号接收时,应该在一定频率内进行扫描,获取不同频率信号再进行筛选;在代码中,我们假设的信号实际是简化了,相当于我们本来就知道信号的频率(设为300Hz),现在只需要在该频率下进行角度扫描,确定信号的来源

2.2 延时处理

接着,我们刚刚提到了延时求和波束形成器H^T(w)根据频率响应函数的定义,我们需要对信号基函数f(t,p) = e^{j{\omega}t}v_k(k)进行延时求和,由此得到波束方向图:

y(t) = H^T(\omega)v_k(k)e^{jwt}

 我们在1.1频率波数响应函数末尾提到,在代码中我们已经确定了搜索的信号频率,因此仅需要对角度进行扫描,综上所述,代码如下:

  1. %% 目标方位角设置
  2. thetas_deg=60; % 目标方位角,度deg
  3. thetas_rad=thetas_deg*deg2rad; % 目标方位角,弧度rad
  4. theta = 0:0.1:180; % 任意信号入射角度
  5. %% 频域常规波束形成
  6. tic
  7. for i = 1:length(theta)
  8. tao = cosd(theta(i))*ra/c; %在角度theta(i)下得到的时延
  9. pt_sig = exp(1j*2*pi*f0*tao)' * x.'; %波束,1*LEN
  10. s_sig(i,:) = pt_sig/N; %size(s_sig) = i*LEN
  11. end
  12. toc

我们的角度扫描从0到180°,步长为0.1,因此可以得到1801长度的theta,tao为时延补偿,对应h_{n}(\tau)中各个阵元的延时补偿。

注意

1. 频率波束响应公式中H^T(w)的转置为共轭转置,在MATLAB中使用单引号,x为输出信号,根据公式不需要转置,这里进行转置主要是为了进行矩阵运算。

2. pt_sig的计算是将每个阵元的对应时延与输出信号相乘得到修正后的信号,然后再相加得到频率响应(频率响应的定义为响应h(t)和基函数f(t)的卷积累加):

如果还是不太明白可以跑出代码后对每个矩阵参数的行列数进行细致观察,从而加深理解。

结果:得到了s_sig,其为i*LEN大小的数据,i为theta的长度。矩阵一列的意义为:每个角度下的频率波数响应;矩阵一行的意义为:同一角度下不同采样点的频率波数响应。

3. 结果展示

分析:出现了两个波峰,一个对应60°,一个对应120°,暂且不清楚原因,后续可能会跟进修正,恳请知道原因的朋友赐教,以上。

原因解释:

由于代码基函数部分得到的信号只取了实数部分,后续与修正时延tao的共轭转置相乘时无法通过正交消除120°干扰,如下:

  1. snr=40; % 信噪比设置
  2. rx=awgn(real(as*s), snr, 'measured'); % 含加性高斯噪声的水听器输出时间波形实数矩阵,Add white Gaussian noise to signal
  3. x = rx.'; % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N,即接收到的信号

修改代码:

  1. %% 频域常规波束形成
  2. tic
  3. xx = (as*s).';
  4. for i = 1:length(theta)
  5. tao = cosd(theta(i))*ra/c; %在角度theta(i)下得到的时延
  6. pt_sig = exp(1j*2*pi*f0*tao)' * xx.'; %波束,1*LEN
  7. s_sig(i,:) = pt_sig/N; %size(s_sig) = i*LEN
  8. end
  9. toc
  10. plot(theta,s_sig(:,1),'b.-');title("频域常规波束形成");

得到图像:

附修改后的MATLAB代码:

  1. clear
  2. close all
  3. clc
  4. % 度与弧度常数
  5. deg2rad = pi/180; % 度转换成弧度
  6. rad2deg = 180/pi; % 弧度转换成度
  7. %% 水听器阵列参数设置
  8. c = 1500; % 水体声速,米/秒 m/s
  9. N = 70; % 阵元数
  10. sqrtN=sqrt(N); % 驾驶向量归一化常数
  11. T=1; % 数据时长,秒sec
  12. FS=24e2; % 采样频率,赫兹Hz
  13. LEN=T*FS; % 数据长度,点数
  14. t=(0:LEN-1)./FS; % 数据时间轴,秒sec,1 x LEN
  15. fc=300; % 阵列中心频率,赫兹Hz
  16. lambda = c/fc; % 波长,米m
  17. lambda2 = lambda / 2; % 半波长,米m d<(lambda/2)?
  18. d = 0.27; % 阵元间距,米m
  19. ra=d*(0:N-1).'; % 阵元坐标,N x 1
  20. %% 目标方位角设置
  21. thetas_deg=90; % 目标方位角,度deg
  22. thetas_rad=thetas_deg*deg2rad; % 目标方位角,弧度rad
  23. theta = 0:0.1:180; % 任意信号入射角度
  24. %% 目标信号生成
  25. f0=300; % 声源频率,Hz
  26. s=exp(1j*2*pi*f0.*t); % 目标复数信号,1 x LEN "1j为复数,1为数字一,j为负数"
  27. as=exp(1j*2*pi*ra*f0*cos(thetas_rad)/c); % 目标驾驶向量,N x 1,驾驶向量=exp(-2*pi*f0*τ*1j*)
  28. snr=40; % 信噪比设置
  29. rx=awgn(real(as*s), snr, 'measured'); % 含加性高斯噪声的水听器输出时间波形实数矩阵,Add white Gaussian noise to signal
  30. x = rx.'; % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N,即接收到的信号
  31. %% 频域常规波束形成
  32. tic
  33. xx = (as*s).';
  34. for i = 1:length(theta)
  35. tao = cosd(theta(i))*ra/c; %在角度theta(i)下得到的时延
  36. pt_sig = exp(1j*2*pi*f0*tao)' * xx.'; %波束,1*LEN
  37. s_sig(i,:) = pt_sig/N; %size(s_sig) = i*LEN
  38. end
  39. toc
  40. figure(1);
  41. subplot(2,1,1);
  42. plot(theta,s_sig(:,1),'b.-');title("频域常规波束形成");
  43. subplot(2,1,2);
  44. sig_db = 20*log10(abs(s_sig(:,1).^2));
  45. plot(theta,sig_db,'r.-');title("频域常规波束形成——分贝图");

如果本篇文章对你有帮助,解决了你的疑惑或者问题,请不要吝啬你的点赞哦,谢谢!

4. 添加频域窄带波束形成方法

  1. clear
  2. close all
  3. clc
  4. % 度与弧度常数
  5. deg2rad = pi/180; % 度转换成弧度
  6. rad2deg = 180/pi; % 弧度转换成度
  7. %% 阵列参数设置
  8. c = 1500; % 水体声速,米/秒 m/s
  9. N = 35; % 阵元数
  10. sqrtN=sqrt(N); % 驾驶向量归一化常数
  11. T=1; % 数据时长,秒sec
  12. FS=24e3; % 采样频率,赫兹Hz
  13. LEN=T*FS; % 数据长度,点数
  14. t=(0:LEN-1)./FS; % 数据时间轴,秒sec,1 x LEN
  15. fc=300; % 阵列中心频率,赫兹Hz
  16. lambda = c/fc; % 波长,米m
  17. lambda2 = lambda / 2; % 半波长,米m
  18. d = 0.27; % 阵元间距,米m
  19. ra=d*(0:N-1).'; % 阵元坐标,N x 1
  20. %% 方位角设置
  21. thetas_deg=90; % 目标方位角,度deg
  22. thetas_rad=thetas_deg*deg2rad; % 目标方位角,弧度rad
  23. %% 目标信号生成
  24. f0=3000; % 声源频率,Hz
  25. f1=f0; % 起始处理频率,Hz
  26. B=10; % 处理带宽,Hz
  27. s=exp(1j*2*pi*f0.*t); % 目标复数信号,1 x LEN
  28. sf=fft(s.',LEN); % 目标信号FFT,LEN x 1
  29. ks=2*pi*f0/c; % 声源波数,1/m
  30. % 指向目标方位的驾驶向量生成
  31. as=exp(-1j*2*pi*ra*f0*cos(thetas_rad)/c); % 目标驾驶向量,N x 1
  32. rf=sf*(as.'); % 指向目标方向的输出复数信号,LEN x N
  33. % 指向目标方位的输出信号生成
  34. snr=40; % 信噪比设置
  35. rx=awgn(real(as*s), snr, 'measured'); % 含加性高斯噪声的输出时间波形实数矩阵
  36. x = rx.'; % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N
  37. x_fft = fft(x,LEN); % 对实信号进行FFT
  38. %% 基础数据
  39. df = FS / LEN; % 采样分辨率,即某个采样点对应的频率
  40. figure(1);plot((0:LEN-1)*FS / LEN,abs(x_fft(:,1))); % 测试图像,观察目标信号傅里叶变换:频率为f0 = 300
  41. place = round(f0/df) + 1; % 获取信号FFT频率对应位置
  42. sig = x_fft(place,:); % 获取频率为f0信号的FFT结果 1*N 频率有0频
  43. theta_N = 0:0.1:180; % 角度遍历
  44. ntheta = length(theta_N);
  45. %% 常规频域窄带波束
  46. for i = 1:ntheta
  47. tao = cos(theta_N(i)*deg2rad)*ra/c; % 在theta_N(i)角度下的时延 N*1
  48. A = exp(1j*2*pi*f0*tao);
  49. B = A' * sig.'; % 常规窄带波束 1*N*N*1
  50. pt_sig(i) = B;
  51. power_sig(i) = B^2; % 功率
  52. tt(i) = cosd(theta_N(i));
  53. end
  54. pt_abs = abs(pt_sig);
  55. pt2one = pt_abs ./ max(pt_abs); % 归一化
  56. power_abs = abs(power_sig);
  57. power2one = power_abs ./ max(power_abs); % 归一化
  58. figure(2)
  59. plot(tt,20*log10(pt2one),'r');
  60. % plot(theta_N,(pt2one),'r');
  61. grid on
  62. figure(3)
  63. plot(tt,10*log10(power2one),'b'); % 功率的是10
  64. % plot(theta_N,(power2one),'b');
  65. grid on

 运行结果:

 

5. 信噪比提升计算

应评论区要求,增加信噪比提升计算代码。该代码基于时域波束形成,主要的思想是:将添加噪声的信号未添加噪声的信号进行波束形成并计算功率,两者相减得到高斯白噪声的功率。最后使用:

SNR = 10*log10( P_{Signal} / P_{Noise }) 

得到信噪比。

求得角度遍历下的信噪比最大值对应信号所在的方位。

附代码:

  1. clear
  2. close all
  3. clc
  4. % 度与弧度常数
  5. deg2rad = pi/180; % 度转换成弧度
  6. rad2deg = 180/pi; % 弧度转换成度
  7. %% 水听器阵列参数设置
  8. c = 1500; % 水体声速,米/秒 m/s
  9. N = 4; % 阵元数
  10. sqrtN=sqrt(N); % 驾驶向量归一化常数
  11. T=1; % 数据时长,秒sec
  12. FS=24e2; % 采样频率,赫兹Hz
  13. LEN=T*FS; % 数据长度,点数
  14. t=(0:LEN-1)./FS; % 数据时间轴,秒sec,1 x LEN
  15. fc=300; % 阵列中心频率,赫兹Hz
  16. lambda = c/fc; % 波长,米m
  17. lambda2 = lambda / 2; % 半波长,米m d<(lambda/2)?
  18. d = 0.27; % 阵元间距,米m
  19. ra=d*(0:N-1).'; % 阵元坐标,N x 1
  20. %% 目标方位角设置
  21. thetas_deg=90; % 目标方位角,度deg
  22. thetas_rad=thetas_deg*deg2rad; % 目标方位角,弧度rad
  23. theta = 0:0.1:180; % 任意信号入射角度
  24. %% 目标信号生成
  25. f0=300; % 声源频率,Hz
  26. s=exp(1j*2*pi*f0.*t); % 目标复数信号,1 x LEN "1j为复数,1为数字一,j为负数"
  27. as=exp(1j*2*pi*ra*f0*cos(thetas_rad)/c); % 目标驾驶向量,N x 1,驾驶向量=exp(-2*pi*f0*τ*1j*)
  28. snr=-20; % 信噪比设置
  29. SNR_list = zeros(1,100);
  30. Sig = sum(sum(real(as*s).^2,2)/LEN)/N; % 信号原始功率
  31. tic
  32. for ii = 1:100 % 进行蒙特卡洛模拟测试
  33. rx=awgn(real(as*s), snr, 'measured'); % 含加性高斯噪声的水听器输出时间波形实数矩阵,Add white Gaussian noise to signal
  34. %% 常规波束形成——不带噪声数据
  35. % tic
  36. xx = real((as*s).'); % 不带噪声的原始数据
  37. for i = 1:length(theta)
  38. tao = cosd(theta(i))*ra/c; %在角度theta(i)下得到的时延
  39. pt_sig = exp(1j*2*pi*f0*tao)' * xx.'; %波束,1*LEN
  40. Beamforming(i,:) = pt_sig / N; % i * LEN
  41. s_sig(i,:) = sum((abs(pt_sig/N)).^2)/LEN; %size(s_sig) = i*LEN
  42. end
  43. % toc
  44. %% 常规波束形成——带噪声数据
  45. % tic
  46. x = rx.'; % 输出波形矩阵转置,便于二维数组FFT列运算,LEN x N,即接收到的信号
  47. for i = 1:length(theta)
  48. tao = cosd(theta(i))*ra/c; %在角度theta(i)下得到的时延
  49. pt_sig2 = exp(1j*2*pi*f0*tao)' * x.'; %波束,1 * N * N * LEN = 1 * LEN
  50. s_sig2(i,:) = sum((abs(pt_sig2/N)).^2)/LEN; % i * 1
  51. end
  52. % toc
  53. N_sig = s_sig2 - s_sig; % 噪声功率
  54. SNR_ = 10*log10(s_sig ./ N_sig); % 通过波束形成后数据求信噪比,SNR = 10*log10(信号功率/噪声功率)
  55. % SNR_ = 10*log10(Sig / N_sig); % 通过原始数据功率求信噪比
  56. % 找最大波束处SNR为增益后的信噪比
  57. SNR_bias = max(SNR_) - snr; % 信噪比的差值
  58. SNR_list(ii) = SNR_bias;
  59. end
  60. toc
  61. % 查看波束图
  62. figure;plot(theta,(abs((Beamforming(:,1)))));title("波束形成图")
  63. Anouncement_ = ['SNR = ', num2str(max(SNR_)),'dB,提升为:', num2str(mean(SNR_list)),'dB'];
  64. disp(Anouncement_)

 运行结果展示:

结果分析:

 可以看到,当阵元数N = 4时,SNR提升大概为6dB左右;后将N = 40,再进行计算,得到结果:

可以看到SNR有所提升,符合增加阵列孔径的引起的信号分辨率提升规律。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/507137
推荐阅读
相关标签
  

闽ICP备14008679号