最近学习了传统波束形成(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:Mp1(k1,:) = Ric2/Ric1(k1)*s1.*exp(-j*w*Rn1(k1)/c);% 接收到的信号
end
p = p1+n1;  % 各阵元接收的声压信号矩阵
R = p*p'/L; % 接收数据的自协方差矩阵  A.'是一般转置,A'是共轭转置

4、扫描整个声源平面

我们设置步长为0.1,扫描范围是20x20的平面,双重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); % CSMend
end

5、归一化处理

归一化处理的程序

%--------------------------------------归一化------------------------------%
for k1 = 1:length(z);pp(k1) = max(Pcbf(k1,:)); % Pcbf 的第k1行的最大元素的值
endPcbf = Pcbf/max(pp);  % 所有元素除以其最大值 归一化幅度

6、作图 

观察得到的结果

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

7、结果

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

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

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

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

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

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

传统波束形成的算法实现相关推荐

  1. 传统目标跟踪——CamShift算法(改进MeanShift)

    目录 一.CamShift 1.1 原理 二.流程 三.代码 四.总结 一.CamShift MeanShift的结果有一个问题,检测窗口的大小是固定的,而目标是一个由近到远逐渐变小的过程,固定的窗口 ...

  2. 传统神经网络ANN训练算法总结

    学习/训练算法分类 神经网络类型的不同,对应了不同类型的训练/学习算法.因而根据神经网络的分类,总结起来,传统神经网络的学习算法也可以主要分为以下三类: 1)前馈型神经网络学习算法-----(前馈型神 ...

  3. 从0到1 | 文本挖掘的传统与深度学习算法

    一.什么是文本挖掘? 讨论文本挖掘之前,我们要先说一下数据挖掘的概念,因为文本挖掘是数据挖掘的一个分支.数据挖掘(Data Mining)指从大量的数据中通过算法搜索隐藏在其中信息的过程.而文本挖掘就 ...

  4. Feature Selection: A Data Perspective --阅读笔记2 传统数据的特征选择算法

    论文的前一部分 FEATURE SELECTION ON CONVENTIONAL DATA Similarity based Methods Laplacian Score SPEC FEATURE ...

  5. 波束赋形GOB算法matlab,智能天线波束赋形GOB算法与EBB算法比较

    目前比较常用的波束赋形算法有2种:GOB算法和EBB算法.GOB算法是一种固定波束扫描的方法,对于固定位置的用户,其波束指向是固定的,波束宽度也随天 线阵元数目而确定.当用户在小区中移动时,它通过测向 ...

  6. python输入10个数输出最大值流程图_用传统流程图表示该算法:依次将10个数输入,要求将其中最大的数输出...

    展开全部 1.传统流程图: 2.思路:比大小,10个数,标上标签,依次为1,2,3....10.然后第1个跟第e68a84e8a2ad323131333532363134313032313635333 ...

  7. m基于深度学习的OFDM信道估计和均衡算法误码率matlab仿真,对比了LS,MMSE以及LMMSE等传统的信道估计算法

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着无线通信的快速发展,5G正逐渐成长为支撑全社会各行业运作的大型基础性互联网络,其服务范围的大幅扩 ...

  8. 传统图片超分算法——双三次插值 (Bicubic)、附C++源码

    呼,花了一个下午,终于是写完加调试完了所有的代码. 双三次插值介绍 之前我写的这篇博客中讲了什么是超分,并实现了单线性插值算法和双线性插值算法.在这里将再介绍一种插值算法--双三次插值算法. 首先,双 ...

  9. 传统目标跟踪——MeanShift算法

    目录 一.均值漂移(MeanShift) 二.流程 三.代码 3.1 meanshift+固定框的代码 3.2 优化:meanshift+鼠标选择 3.3 meanshift+自己实现函数 四.补充知 ...

最新文章

  1. php worker微信,微信小程序API createWorker
  2. framework层和native层实现联网控制(iptable方式)
  3. This Handler class should be static or leaks might occur(null) 解决办法 (转)
  4. T-SQL查询进阶--流程控制语句
  5. emmap erlang_erlang的map基本使用
  6. 两表左连接count某一字段_表连接解决多日留存率问题|SQL
  7. 03Prism WPF 入门实战 - Region
  8. gopacket 在 windows 上面遇到的问题
  9. LoadRunner11支持的浏览器小结
  10. poj2750 PottedFlower(线段树的环状操作)
  11. 关于vue-cli3中配置请求跨域的问题
  12. quartus打开Simulator Tool生成网表进行功能仿真
  13. [经验教程]iPhone苹果手机iOS系统App Store怎么下载手机APP到苹果iPhone手机?
  14. 多目标启发式算法(NSGA2, MOEA, MOPSO)python实现
  15. Tableau学习教程(万字保姆级教程)​​​​​​
  16. 浏览器刷新和关闭时显示提示信息
  17. mysql 1052 ambiguous_mysql错误:Column ‘id’ in field list is ambiguous的解决方法
  18. matlab 批量导入excel,matlab批量导入excel表格数据-Matlab如何导入excel数据
  19. vue day02 笔记(回顾+json-server用法)
  20. c语言tab什么意思_C语言所有的知识点干货

热门文章

  1. kubectl :命令技巧大全
  2. 第六章 盒子模型
  3. 全面解读惯性导航系统与技术
  4. 简单两步, 搭建全平台私有同步网盘
  5. XMIND中调整某一主题中英文大小写
  6. php的分割字符串,php分割字符串函数
  7. IDC机房工作的简单流程
  8. 基于无人机的移动边缘计算网络(Matlab代码实现)
  9. 量化进阶——理工科出身如何转做量化交易(一)
  10. 欢迎使用CSDN-markdown编辑器 fdsdf