Skip to content

Commit 3b57961

Browse files
Update doa_music.m
1 parent 0b21444 commit 3b57961

File tree

1 file changed

+9
-27
lines changed

1 file changed

+9
-27
lines changed

ssl_tools/doa_music.m

+9-27
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,34 @@
11
function specGlobal = doa_music(x,Param,nsrc)
22
if(size(x,2)<2)
3-
error('ERROR[MUSIC]:信号通道数必须大于等于2');
3+
error('ERROR[MUSIC]:信号通道数必须大于等于2');
44
end
55
%% STFT
66
X = ssl_stft(x.',Param.window,Param.noverlap,Param.nfft,Param.fs);%nbin,nfram,nchan
77
X = X(2:end,:,:);
88
X = X(Param.freqBins,:,:);
99
[nbin,~,nmic] = size(X);
1010
%% MUSIC
11-
% power = zeros(nbin, length(Param.azimuth)*length(Param.elevation));
12-
% for ibin = 1:nbin % 对于每个频点
13-
% Rxx = (transpose(squeeze(X(ibin,:,:)))*conj(squeeze(X(ibin,:,:))));% 自相关矩阵
14-
% [U,~,~] = svd(Rxx); % SVD分解 Rxx = U * S * U^H
15-
% En = U(:,nsrc+1:end); % 噪声子空间
16-
% fprintf('%d\n',ibin)
17-
% idx = 1;
18-
% for iel = 1 : length(Param.elevation)%1 : length(Param.azimuth)
19-
% for iaz = 1 : length(Param.azimuth)%1 : length(Param.elevation)
20-
% % v为声源方向的单位向量,见鄢社锋书,需要注意的是,本程序的方位角与俯仰角与书中定义不同
21-
% v = [cosd(Param.elevation(iel))*cosd(Param.azimuth(iaz));cosd(Param.elevation(iel))*sind(Param.azimuth(iaz));sind(Param.elevation(iel))];% 3 x 1
22-
% tau = v'*(Param.micPos-repmat(Param.micPos(:,1),[1,nmic]))./Param.c; % 1 * nmic 参考麦克为1:Param.micPos(:,1)
23-
% a = exp(1i*2*pi*Param.f(ibin).*transpose(tau));%nmic x 1 SV = exp(-2*1i*pi*tau*Param.f.'); % nmic x nbin
24-
% power(ibin,idx) = 1./(sum(abs( ctranspose(a) * En * ctranspose(En) * a )));
25-
% idx = idx+1;
26-
% end
27-
% end
28-
% end
29-
% linspace包含端点,保证插值时不会出现NaN
11+
% linspace包含端点,保证插值时不会出现NaN
3012
aziGrid = linspace(Param.azimuth(1),Param.azimuth(end),round((Param.azimuth(end)-Param.azimuth(1))/Param.alphaRes)+1);
3113
eleGrid = linspace(Param.elevation(1),Param.elevation(end),round((Param.elevation(end)-Param.elevation(1))/Param.alphaRes)+1);
3214
power = zeros(nbin, length(aziGrid), length(eleGrid));
3315

34-
for ibin = 1:nbin % 对于每个频点
35-
Rxx = (transpose(squeeze(X(ibin,:,:)))*conj(squeeze(X(ibin,:,:))));% 自相关矩阵
36-
[U,~,~] = svd(Rxx); % SVD分解 Rxx = U * S * U^H
37-
En = U(:,nsrc+1:end); % 噪声子空间
16+
for ibin = 1:nbin % 对于每个频点
17+
Rxx = (transpose(squeeze(X(ibin,:,:)))*conj(squeeze(X(ibin,:,:))));% 自相关矩阵
18+
[U,~,~] = svd(Rxx); % SVD分解 Rxx = U * S * U^H
19+
En = U(:,nsrc+1:end); % 噪声子空间
3820
fprintf('%d\n',ibin)
3921
for iaz = 1 :length(aziGrid)
4022
for iel = 1 :length(eleGrid)
4123
v = [cosd(eleGrid(iel))*cosd(aziGrid(iaz));cosd(eleGrid(iel))*sind(aziGrid(iaz));sind(eleGrid(iel))];% 3 x 1
42-
tau = v'*(Param.micPos-repmat(Param.micPos(:,1),[1,nmic]))./Param.c; % 1 * nmic 参考麦克为1:Param.micPos(:,1)
24+
tau = v'*(Param.micPos-repmat(Param.micPos(:,1),[1,nmic]))./Param.c; % 1 * nmic 参考麦克为1:Param.micPos(:,1)
4325
a = exp(1i*2*pi*Param.f(ibin).*transpose(tau));%nmic x 1 SV = exp(-2*1i*pi*tau*Param.f.'); % nmic x nbin
4426
power(ibin,iaz,iel) = 1./(sum(abs( ctranspose(a) * En * ctranspose(En) * a )));
4527
end
4628
end
4729
end
4830

49-
% 对所有频率的空间谱加在一起:
31+
% 对所有频率的空间谱加在一起:
5032
spec = squeeze(sum(power,1)); %nAzi x nEle
5133
[az,el]=meshgrid(aziGrid,eleGrid);
5234
[azi,eli]=meshgrid(Param.azimuth,Param.elevation);
@@ -71,4 +53,4 @@
7153
X(:,:,ichan) = spectrogram(x(ichan,:),window,noverlap,nfft,fs);
7254
end
7355

74-
end
56+
end

0 commit comments

Comments
 (0)