|
| 1 | +clc |
| 2 | +clear all |
| 3 | +close all |
| 4 | + |
| 5 | +%% ------------------------------初始化常量-------------------------------% |
| 6 | +c = 334; % 声速c |
| 7 | +fs = 1000; % 抽样频率fs |
| 8 | +T = 0.1; % ?? |
| 9 | +t = 0:1/fs:T; % 时间 [0, 0.1] |
| 10 | +L = length(t); % 时间长度:101 |
| 11 | +f = 500; % 感兴趣的频率 |
| 12 | +w = 2*pi*f; % 角频率 |
| 13 | +k = w/c; % 波数 k |
| 14 | + |
| 15 | +%% ------------------------------各阵元坐标-------------------------------% |
| 16 | +M = 17; % 阵元个数 |
| 17 | +% Nmid = 12; % 参考点 |
| 18 | +% d = 3; % 阵元间距 |
| 19 | +% m = (0:1:M-1) |
| 20 | +yi = zeros(M,1); % 生成一个M*1维的零矩阵 |
| 21 | +zi = [ 0; 3; 6; 9;12;15;18;21;24;12;12;12;12;12;12;12;12]; |
| 22 | +xi = [12;12;12;12;12;12;12;12;12; 0; 3; 6; 9;15;18;21;24]; |
| 23 | +%xi = xi.' % 列向量 m*d 阵元数*阵元间距 |
| 24 | + |
| 25 | + |
| 26 | +figure(1) |
| 27 | +plot(xi,zi,'r*'); |
| 28 | +title('十字形麦克风阵列') |
| 29 | + |
| 30 | + |
| 31 | +%% ---------------------------- 声源位置------------------------------------% |
| 32 | +x1 = 12; |
| 33 | +y1 = 10; |
| 34 | +z1 = 12; %声源位置 (12,10,12) x,z为水平面 |
| 35 | + |
| 36 | +x2 = 12; % array center |
| 37 | +y2 = 0; |
| 38 | +z2 = 12; |
| 39 | + |
| 40 | +Ric1 = sqrt((x1-xi).^2+(y1-yi).^2+(z1-zi).^2); % 声源到各阵元的距离 |
| 41 | +Ric2 = sqrt((x1-x2).^2+(y1-y2).^2+(z1-z2).^2); %sound to array center:10 |
| 42 | +Rn1 = Ric1 - Ric2; %声源至各阵元与参考阵元的声程差矢量 |
| 43 | + |
| 44 | +s1 = cos(2*w*t); % 参考阵元接收到的矢量 |
| 45 | +Am = 10^(-1); % 振幅 |
| 46 | +n1 = Am * (randn(M, L) + j*randn(M, L)); % 各阵元高斯白噪声 |
| 47 | +p1 = zeros(M,L); |
| 48 | + |
| 49 | + |
| 50 | +%% ----------------------------各阵元的延迟求和----------------------------------% |
| 51 | +% 整个程序最关键的部分,延迟求和,同时得到各阵元接收的声压信号矩阵,以及协方差矩阵 |
| 52 | +for k1 = 1:M |
| 53 | + p1(k1,:) = Ric2/Ric1(k1) * s1.*exp(-j*w*Rn1(k1)/c); |
| 54 | + % 接收到的信号 |
| 55 | +end |
| 56 | + |
| 57 | +p = p1+n1; % 各阵元接收的声压信号矩阵 |
| 58 | +R = p*p'/L; % 接收数据的自协方差矩阵 A.'是一般转置,A'是共轭转置 |
| 59 | + |
| 60 | + |
| 61 | +%% ----------------------------------扫描范围----------------------------------% |
| 62 | +% 我们设置步长为0.1,扫描范围是20x20的平面,双重for循环得到M*1矢量矩阵,最后得到交叉谱矩阵(cross spectrum matrix) |
| 63 | +% 由DSP理论,这个就是声音的功率。 |
| 64 | +step_x = 0.1; % 步长设置为0.1 |
| 65 | +step_z = 0.1; |
| 66 | +y = y1; |
| 67 | +x = (9:step_x:15); % 扫描范围 9-15 |
| 68 | +z = (9:step_z:15); |
| 69 | + |
| 70 | +for k1=1:length(z) |
| 71 | + for k2=1:length(x) |
| 72 | + Ri = sqrt((x(k2)-xi).^2+(y-yi).^2+(z(k1)-zi).^2); % 该扫描点到各阵元的聚焦距离矢量 |
| 73 | + Ri2 = sqrt((x(k2)-x2).^2+(y-y2).^2+(z(k1)-z2).^2); % 10.8628 |
| 74 | + Rn = Ri-Ri2; % 扫描点到各阵元与参考阵元的程差矢量 |
| 75 | + b = exp(-j*w*Rn/c); % 声压聚焦方向矢量 |
| 76 | + Pcbf(k1,k2) = abs(b'*R*b); % CSM,最关键,(1,18)*(18,18)*(18,1) |
| 77 | + end |
| 78 | +end |
| 79 | + |
| 80 | + |
| 81 | +%% -------------------------------------归一化-------------------------------------% |
| 82 | +for k1 = 1:length(z) |
| 83 | + pp(k1) = max(Pcbf(k1,:)); % Pcbf 的第k1行的最大元素的值 |
| 84 | +end |
| 85 | + |
| 86 | +Pcbf = Pcbf/max(pp); % 所有元素除以其最大值 归一化幅度, (61,61) |
| 87 | + |
| 88 | + |
| 89 | +%% -------------------------------------作图展示------------------------------------% |
| 90 | +figure(2) |
| 91 | +surf(x,z,Pcbf); |
| 92 | +xlabel('x(m)'),ylabel('z(m)') |
| 93 | +title('三维单声源图') |
| 94 | +colorbar |
| 95 | + |
| 96 | +figure(3) |
| 97 | +pcolor(x,z,Pcbf); |
| 98 | +shading interp; |
| 99 | +xlabel('x(m)'); |
| 100 | +ylabel('z(m)'); |
| 101 | +title('单声源图') |
| 102 | +colorbar |
0 commit comments