十字線陣---CBF,傳統波束形成


%傳統波束形成,CBF (Ps:這個程序是別人的,不是我寫的,但是具體是在哪里找到的已經忘了)

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); % 時間長度,采樣總點數:101個

f = 500;       % 感興趣的頻率,信號自己的頻率

w = 2*pi*f;    % 角頻率 k = w/c;       % 波數 k

M = 18;        % 陣元個數,實際只有17個

%接下來是陣元坐標,聲源位置,這里設置的是(12,10,12)點,同時設置陣元的高斯白噪聲。

%---------各陣元坐標---------% %

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;     %參考點:(12,0,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));  % 各陣元加上高斯白噪聲,考慮復數18*101的陣列

p1 = zeros(M,L);

%3、延遲求和----------------------------------------------------------------------------

%整個程序最關鍵的部分,延遲求和,同時得到各陣元接收的聲壓信號矩陣。以及協方差矩陣,這個還有疑問,要把論文讀懂來理解。

%--------------------------各陣元的延遲求和--------------------------------%

for k1 = 1:M    

p1(k1,:) = Ric2/Ric1(k1)*s1.*exp(-j*w*Rn1(k1)/c);    %Ric2/Ric1(k1)等於把每一個點的距離歸一化.exp()表示時延  18*101的矩陣     % 接收到的信號                                    

%時間和陣元的矩陣

end

p = p1+n1;  % 各陣元接收的聲壓信號矩陣 R = p*p'/L; % 接收數據的自協方差矩陣  A.'是一般轉置,A'是共軛轉置。    %%%R代表幅值嗎?  %18*18

%4、掃描整個聲源平面------------------------------------------------------------------------

%我們設置步長為0.1,掃描范圍是20x20的平面,雙重for循環得到M*1矢量矩陣,最后得到交叉譜矩陣(cross spectrum matrix)。由DSP理論,這個就是聲音的功率。 %-------掃描范圍------%

step_x = 0.1;  % 步長設置為0.1  %和線陣里面掃描角度是一個道理

step_z = 0.1;

y = y1;            %y=10

y1=10 x = (9:step_x:15);  % 掃描范圍 9-15

z = (9:step_z:15);

for k1=1:length(z)     %先掃x軸,再掃z軸,設掃描到的點為(x=k2,z=k1),y=10 k1=61,k2=61    

for k2=1:length(x)        

Ri = sqrt((x(k2)-xi).^2+(y-yi).^2+(z(k1)-zi).^2);   %(x(k2),10,z(k1))走到的點距離陣元的距離 %每走一步,產生一個18*1的矩陣        

Ri2 = sqrt((x(k2)-x2).^2+(y-y2).^2+(z(k1)-z2).^2);    %走到的點距離參考點的距離       %一個數         % 該掃描點到各陣元的聚焦距離矢量        

Rn = Ri-Ri2;           %每一步產生一個1*18的矩陣         % 掃描點到各陣元與參考陣元的程差矢量                

b = exp(-j*w*Rn/c);           % 聲壓聚焦方向矢量        %歸整到陣元,18*1的矩陣,消除時間的影響            

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的知識,找到一篇可以找到參考的論文。【水聲定位算法之CBF波束形成_360doc個人圖書館】http://www.360doc.cn/mip/558928696.html

自己照着這個程序寫了一個線陣的,可是寫了一天都沒有寫出來,后面的有些地方有點模糊,不知道怎么處理,以后再思考一下吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM