传统波束形成的算法实现「建议收藏」

传统波束形成的算法实现「建议收藏」最近学习了传统波束形成(CBF)的原理,尝试着写出识别一个单声源的波束形成程序。下面按照程序说明一下。1、初始化设置一些常数,例如抽样频率,所要计算的频率,时间步等。clearall;closeall;clc;%—————-初始化—————-%c=1500;%声速cfs=10000;%抽样频率fsT=0.1…

大家好,又见面了,我是你们的朋友全栈君。

最近学习了传统波束形成(CBF)的原理,尝试着写出识别一个单声源的波束形成程序。下面按照程序说明一下。

1、初始化

设置一些常数,例如抽样频率,所要计算的频率,时间步等。

clear all;
close all;
clc;
%---------初始化常量----------%
c = 334;      % 声速c
fs = 1000;    % 抽样频率fs
T = 0.1;       % ??
t = 0:1/fs:T;  % 时间 [0,0.1]
L = length(t); % 时间长度
f = 500;       % 感兴趣的频率
w = 2*pi*f;    % 角频率
k = w/c;       % 波数 k

2、阵元设置

下面是阵元部分,包括阵元个数,间距设置。

M = 18;        % 阵元个数

接下来是阵元坐标,声源位置,这里设置的是(12,10,12)点,同时设置阵元的高斯白噪声。

%---------各阵元坐标---------%
M = 18;        % 阵元个数
% Nmid = 12;      % 参考点
% d = 3;         % 阵元间距
% m = (0:1:M-1) 
yi = zeros(M,1); % 生成一个M*1维的零矩阵
zi = [0;3;6;9;12;15;18;21;24;12;12;12;12;12;12;12;12;12];
xi = [12;12;12;12;12;12;12;12;12;0;3;6;9;12;15;18;21;24];     
%xi = xi.'      % 列向量 m*d 阵元数*阵元间距


figure(1)
plot(xi,zi,'r*');
title('十字形麦克风阵列')
%--------- 声源位置----------%
x1 = 12;  
y1 = 10;
z1 = 12;  %声源位置 (12,10,12) x,z为水平面


x2 = 12;
y2 = 0;
z2 = 12;


Ric1 = sqrt((x1-xi).^2+(y1-yi).^2+(z1-zi).^2); % 声源到各阵元的距离
Ric2 = sqrt((x1-x2).^2+(y1-y2).^2+(z1-z2).^2);
Rn1 = Ric1 - Ric2;  %声源至各阵元与参考阵元的声程差矢量


s1 = cos(2*w*t);    % 参考阵元接收到的矢量
   
Am = 10^(-1);  % 振幅
n1 = Am * (randn(M,L)+j*randn(M,L));  % 各阵元高斯白噪声
p1 = zeros(M,L);

3、延迟求和

整个程序最关键的部分,延迟求和,同时得到各阵元接收的声压信号矩阵。以及协方差矩阵,这个还有疑问,要把论文读懂来理解。

%--------------------------各阵元的延迟求和--------------------------------%
for k1 = 1:M
    p1(k1,:) = Ric2/Ric1(k1)*s1.*exp(-j*w*Rn1(k1)/c);
    % 接收到的信号
end
p = p1+n1;  % 各阵元接收的声压信号矩阵
R = p*p'/L; % 接收数据的自协方差矩阵  A.'是一般转置,A'是共轭转置

4、扫描整个声源平面

我们设置步长为0.1,扫描范围是20×20的平面,双重for循环得到M*1矢量矩阵,最后得到交叉谱矩阵(cross spectrum matrix)。由DSP理论,这个就是声音的功率。

%-------扫描范围------%
step_x = 0.1;  % 步长设置为0.1
step_z = 0.1;
y = y1;
x = (9:step_x:15);  % 扫描范围 9-15
z = (9:step_z:15);


for k1=1:length(z)
    for k2=1:length(x)
        Ri = sqrt((x(k2)-xi).^2+(y-yi).^2+(z(k1)-zi).^2);
        Ri2 = sqrt((x(k2)-x2).^2+(y-y2).^2+(z(k1)-z2).^2);
        % 该扫描点到各阵元的聚焦距离矢量
        Rn = Ri-Ri2;
        % 扫描点到各阵元与参考阵元的程差矢量
        
        b = exp(-j*w*Rn/c); % 声压聚焦方向矢量
        Pcbf(k1,k2) = abs(b'*R*b); % CSM
    end
end

5、归一化处理

归一化处理的程序

%--------------------------------------归一化------------------------------%
for k1 = 1:length(z);
    pp(k1) = max(Pcbf(k1,:)); % Pcbf 的第k1行的最大元素的值
end

Pcbf = Pcbf/max(pp);  % 所有元素除以其最大值 归一化幅度

6、作图 

观察得到的结果

%-------------------------------作图展示-----------------------------------%
figure(2)
surf(x,z,Pcbf);
xlabel('x(m)'),ylabel('z(m)')
title('CBF三维单声源图')
colorbar


figure(3)
pcolor(x,z,Pcbf);
shading interp;
xlabel('x(m)');
ylabel('z(m)');
title('CBF单声源图')
colorbar

7、结果

十字型阵列最终得到的结果效果并不理想,没有达到一个点声源的理想结果。

传统波束形成的算法实现「建议收藏」

可以看出下图三维点声源的效果并不理想。

传统波束形成的算法实现「建议收藏」

传统波束形成的算法实现「建议收藏」

接下来是矩形阵列的结果:

传统波束形成的算法实现「建议收藏」

可以看出下图三维点声源的效果还可以。

传统波束形成的算法实现「建议收藏」

传统波束形成的算法实现「建议收藏」

论文中给出的结果,很明显的点声源分布。

传统波束形成的算法实现「建议收藏」

接下来是继续熟悉CBF算法,提高可扩展性,同时学习声源反卷积成像算法(DAMAS),下一篇进行算法总结。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148167.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux服务器,卸载tensorflow CPU 安装PGU版

    linux服务器,卸载tensorflow CPU 安装PGU版linux服务器,卸载tensorflowCPU安装PGU版写在前面之前用的和学习的都是pytorch框架,现在要运行一个keras的代码,得安装tensorflow和keras,按一个教程,直接在pycharm里setting,点那个+很快就装好了tensorflow和keras,运行了几次发现运行特别慢,用nvidia-smi查看,发现根本没有用pgu跑,一番查找,最后发现安装的tensorflow本身是按CPU跑的,要用GPU跑,得安装tensorflow-gpu。以下主要参考了https

    2022年6月22日
    46
  • git服务器搭建_自建服务器

    git服务器搭建_自建服务器在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7×24小时开机并交换大家的修改。GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。假设你已经有sudo权限的用户账号,下面,正式开始安装。第..

    2022年9月1日
    0
  • java的栈内存和堆内存_Java本地方法栈

    java的栈内存和堆内存_Java本地方法栈Java把内存分成两种,一种叫做栈内存,一种叫做堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

    2022年9月4日
    3
  • 雷达系统设计及matlab仿真(一) 第一章 雷达基础知识概论(测距 距离分辨率 多普勒频率 雷达方程 噪声和信噪比 脉冲积累)

    雷达系统设计及matlab仿真(一) 第一章 雷达基础知识概论(测距 距离分辨率 多普勒频率 雷达方程 噪声和信噪比 脉冲积累)1.雷达基础知识了解2.雷达测距最大不模糊距离3.距离分辨率4.多普勒频率‘5.雷达方程噪声和信噪比6.搜索(警戒)7.脉冲积累相干积累与非相干积累8.雷达损失

    2022年5月4日
    71
  • 搭建Maven环境——使用本地的maven环境

    搭建Maven环境——使用本地的maven环境

    2021年8月28日
    52
  • 二进制8进制10进制16进制代码_不同进制之间的转换

    二进制8进制10进制16进制代码_不同进制之间的转换为什么要使用进制数数据在计算机中的表示,最终以二进制的形式存在,就是各种<黑客帝国>电影中那些0101010…的数字;我们操作计算机,实际就是使用程序和软件在计算机上各种读写数据,如果我们直接操作二进制的话,面对这么长的数进行思考或操作,没有人会喜欢。C,C++语言没有提供在代码直接写二进制数的方法。用16进制或8进制可以…

    2022年10月9日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号